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