windows-nt/Source/XPSP1/NT/base/boot/detect/i386/diska.asm
2020-09-26 16:20:57 +08:00

332 lines
7.6 KiB
NASM

title "Int13 Drive parameter information detection"
;++
;
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
;
; diska.asm
;
; Abstract:
;
; This module implements the assembley code necessary to detect/collect
; harddisk paramter information.
;
; Author:
;
; Shie-Lin Tzong (shielint) 22-Feb-1992
;
; Environment:
;
; Real Mode 16-bit code.
;
; Revision History:
;
;
;--
.386p
;
; Standard int 13 drive parameters.
; The parameters returned from int 13 function 8
;
Int13DriveParameters struc
DriveSelect dw 0
MaxCylinders dd 0
SectorsPerTrack dw 0
MaxHeads dw 0
NumberDrives dw 0
Int13DriveParameters ends
SIZE_OF_PARAMETERS equ 12
;
; Extended int 13 drive parameters
; The Drive Parameters returned from int 13 function 48h
;
ExInt13DriveParameters struc
ExBufferSize dw 0
ExFlags dw 0
ExCylinders dd 0
ExHeads dd 0
ExSectorsPerTrack dd 0
ExSectorsPerDrive dd 0
dd 0
ExSectorSize dw 0
ExReserved dw 0
ExInt13DriveParameters ends
SIZE_OF_EXTENDED_PARAMETERS equ 28
;
; Structure used by nt kernel Configuration Manager
;
CmDiskGeometryDeviceData struc
CmBytesPerSector dd 0
CmNumberOfCylinders dd 0
CmSectorsPerTrack dd 0
CmNumberOfHeads dd 0
CmDiskGeometryDeviceData ends
SIZE_OF_CM_DISK_DATA EQU 16
_DATA SEGMENT PARA USE16 PUBLIC 'DATA'
public _NumberBiosDisks
_NumberBiosDisks dw 0
RomChain db 8 * SIZE_OF_PARAMETERS dup(?)
_DATA ends
_TEXT SEGMENT PARA USE16 PUBLIC 'CODE'
ASSUME CS: _TEXT, DS:_DATA, SS:NOTHING
;++
;
; VOID
; GetInt13DriveParamters (
; OUT PUCHAR Buffer,
; OUT PUSHORT Size
; )
;
; Routine Description:
;
; This function calls real mode int 13h function 8 to get drive
; parameters for drive 80h - 87h.
;
; Arguments:
;
; Buffer - Supplies a pointer to a buffer to receive the drive paramter
; information.
;
; Size - Supplies a pointer to a USHORT to receive the size of the drive
; parameter information returned.
;
; Return Value:
;
; None.
;
;--
Public _GetInt13DriveParameters
_GetInt13DriveParameters proc
push bp
mov bp, sp
push si
push bx
mov dx, 80h ; Starting from drive 80h
mov cx, 0 ; count
mov si, offset RomChain ; [si]->Buffer
gidp00:
push cx ; save count
push dx ; save drive select
;
; First check if drive is present. It turns out function returns drive
; parameters even when the drive is not present.
;
mov ah, 15h
int 13h ; Get type of drive
jc short gidp99
cmp ah, 0 ; if ah=0 drive is not present
jz gidp99
pop dx
pop cx
push cx
push dx
mov ah, 8 ; int 13 function 8
int 13h ; call int 13
jc short gidp99 ; if c, fail, go exit
inc _NumberBiosDisks
mov al, cl
and al, 3fh ; Only want bit 0 - 5
mov ah, 0
mov [si].SectorsPerTrack, ax
shr cl, 6
xchg cl, ch
mov word ptr [si].MaxCylinders, cx
mov word ptr [si + 2].MaxCylinders, 0
mov byte ptr [si].MaxHeads, dh
mov byte ptr [si + 1].MaxHeads, 0
mov byte ptr [si].NumberDrives, dl
mov byte ptr [si + 1].NumberDrives, 0
pop dx ; get back current drive number
mov [si].DriveSelect, dx
inc dx
pop cx ; get back count
inc cx ; increase table count
cmp dx, 88h ; Are we done? (dx == 88h)
je short gidp100
add si, SIZE_OF_PARAMETERS
jmp gidp00
gidp99: pop dx
pop cx
gidp100:
mov ax, offset RomChain
mov si, [bp + 4] ; [si]-> variable to receive buffer addr
mov [si], ax ; return buffer address
mov si, [bp + 6] ; [si]-> variable to receive buffer size
mov ax, cx
mov cl, SIZE_OF_PARAMETERS
mul cl
mov [si], ax ; return buffer size
pop bx
pop si
pop bp
ret
_GetInt13DriveParameters endp
;++
;
; BOOLEAN
; IsExtendedInt13Available
; USHORT DriveNumber
; )
;
; Routine Description:
;
; This function checks if extended int13 functions available.
;
; Arguments:
;
; DriveNumber - the drive number to check for.
;
; Return Value:
;
; TRUE if extended int 13 service is available. Otherwise a value of
; FALSE is returned.
;
;--
Public _IsExtendedInt13Available
_IsExtendedInt13Available proc
push bp
mov bp, sp
push bx
mov dl, [bp+4] ; get DriveNumber parameter
mov ah, 41h
mov bx, 55aah
int 13h
jc short Ieda90
cmp bx, 0AA55h
jne short Ieda90
test cx, 1 ; bit 0 = Extended disk access is supported
jz short Ieda90
mov ax, 1
jmp short IedaExit
Ieda90:
xor eax, eax
IedaExit:
pop bx
pop bp
ret
_IsExtendedInt13Available endp
;++
;
; USHORT
; GetExtendedDriveParameters
; USHORT DriveNumber,
; FPCM_DISK_GEOMETRY_DEVICE_DATA DeviceData
; )
;
; Routine Description:
;
; This function use extended int13 service function 48h to get
; drive parameters.
;
; Arguments:
;
; DriveNumber - the drive number to get the drive parameters.
;
; DeviceData - supplies a far pointer to a buffer to receive the parameters.
;
;
; Return Value:
;
; Size of DeviceData. If the extended int 13 service is not available,
; a zero value will be returned.
;
;--
Public _GetExtendedDriveParameters
_GetExtendedDriveParameters proc
push bp
mov bp, sp
push si
push bx
sub sp, SIZE_OF_EXTENDED_PARAMETERS
mov dl, [bp+4] ; get DriveNumber parameter
mov si, sp ; [si]-> Local buffer
mov word ptr [si].ExBufferSize, SIZE_OF_EXTENDED_PARAMETERS
mov ah, 48h
int 13h
jc short Gedp90
or ah, ah ; Make sure there is no error
jnz short Gedp90 ; if error, exit
cmp [si].ExBufferSize, ExReserved
jl short Gedp90 ; the retruned data is too small to be useful
mov bx, [bp+6]
mov ax, [bp+8]
mov es, ax ; (es:bx)->Caller's buffer
ASSUME es:NOTHING
mov eax, [si].ExCylinders
mov es:[bx].CmNumberOfCylinders, eax
mov eax, [si].ExHeads
mov es:[bx].CmNumberOfHeads, eax
mov eax, [si].ExSectorsPerTrack
mov es:[bx].CmSectorsPerTrack, eax
xor eax, eax
mov ax, [si].ExSectorSize
mov es:[bx].CmBytesPerSector, eax
mov ax, SIZE_OF_CM_DISK_DATA
jmp short GedpExit
Gedp90:
xor eax, eax
GedpExit:
add sp, SIZE_OF_EXTENDED_PARAMETERS
pop bx
pop si
pop bp
ret
_GetExtendedDriveParameters endp
_TEXT ends
end