home *** CD-ROM | disk | FTP | other *** search
- .MODEL LARGE
- .DATA
-
- PUBLIC _detected_os
-
- SYS_DOS EQU 0 ; MS-DOS v1.00 - v4.xx
- SYS_DOS5 EQU 1 ; MS-DOS v5.00 - v6.xx
- SYS_DOS7 EQU 2 ; Comand line mode of Win95
- SYS_WIN3 EQU 3 ; GUI mode of Windows 3.xx
- SYS_WIN95 EQU 4 ; GUI mode of Windows 95
- SYS_WIN_NT EQU 5 ; Windows NT
-
- _detected_os DW 0
-
- _reboot_addr DD 0FFFF0000h
-
- .CODE
- LOCALS
-
- PUBLIC _diskio_init
- PUBLIC _diskio_exit
-
- PUBLIC _reboot
-
- PUBLIC _get_disk_info
-
- PUBLIC _disk_lock
- PUBLIC _disk_unlock
-
- PUBLIC _disk_read
- PUBLIC _disk_write
- PUBLIC _disk_format
- PUBLIC _disk_verify
-
- ;----------------------------------------------------------------
-
-
- _diskio_init PROC
- push bp
- mov bp, sp
- push es
- push si
- push di
-
- mov si, SYS_DOS
- mov ax, 3000h ; Get DOS version
- int 21h
- cmp al, 5
- jb @@end
-
- mov ax, 3306h ; Get true DOS version
- int 21h
-
- mov si, SYS_WIN_NT
- cmp bx, 3205h ; WinNT dos box returns v5.50
- je @@end
-
- mov ax, 1600h ; Get Windows version
- int 2Fh
- cmp al, 0
- je @@no_win
- cmp al, 80h
- je @@no_win
- cmp al, 0FFh
- je @@no_win
-
- mov si, SYS_WIN3
- cmp al, 3
- je @@end
-
- mov si, SYS_WIN95 ; Windows 95 GUI
-
- mov ax, 1684h ; Lets get Reboot VxD API
- mov bx, 0009h
- int 2Fh
- mov bx, es
- or bx, di ; Did it returned 0000:0000h ?
- jz @@end
-
- mov Word Ptr [_reboot_addr], di
- mov Word Ptr [_reboot_addr+2], es
-
- jmp @@end
-
- @@no_win: ; Windows 3+ is not running
-
- mov ax, 3306h ; Get true DOS version
- int 21h
-
- mov si, SYS_DOS5
- cmp bl, 7 ; Windows 95 reports v 7.xx
- jb @@end
-
- mov si, SYS_DOS7
- @@end:
- mov _detected_os, si
-
- pop di
- pop si
- pop es
- pop bp
- retf
- _diskio_init ENDP
-
-
- _diskio_exit PROC
- retf
- _diskio_exit ENDP
-
- ;----------------------------------------------------------------
-
- _reboot PROC
- mov ax, 0100h ; Warm reboot
- call [_reboot_addr] ; if calling Win95 API
- crazy: jmp crazy ; We should never get here
- _reboot ENDP
-
-
- ;----------------------------------------------------------------
-
-
-
- _get_disk_info PROC
-
- disk_info EQU [bp+08h]
- hd EQU [bp+06h]
-
- disk EQU Word Ptr es:[si]
- num_cyls EQU Word Ptr es:[si+2]
- num_heads EQU Word Ptr es:[si+4]
- num_sects EQU Word Ptr es:[si+6]
- total_sects0 EQU Word Ptr es:[si+8]
- total_sects1 EQU Word Ptr es:[si+10]
-
- push bp
- mov bp, sp
- push es
- push si
- push di
- les si, disk_info
-
- mov ah, 08h
- mov dl, hd
- int 13h
-
- mov ax, -1
- jc @@end
-
- mov ah, 0
- mov al, dl
- ; mov num_disks, ax
- push ax
-
- mov ah, 0
- mov al, cl
- and al, 3Fh
- mov num_sects, ax
-
- mov al, dh
- inc ax
- mov num_heads, ax
-
- mov al, ch
- shl cx, 1
- shl cx, 1
- and ch, 3
- mov ah, ch
- inc ax
- mov num_cyls, ax
-
- mov ax, hd
- mov disk, ax
-
- mov ax, num_sects
- mov bx, num_heads
- mul bl
- mov bx, num_cyls
- mul bx
- mov total_sects0, ax
- mov total_sects1, dx
-
- ; mov ax, 0
- pop ax ; num_disks
-
- @@end:
- pop di
- pop si
- pop es
- pop bp
- retf
- _get_disk_info ENDP
-
-
-
- ;----------------------------------------------------------------
-
-
- _disk_lock PROC
-
- disk EQU [bp+06h]
-
- push bp
- mov bp, sp
-
- cmp _detected_os, SYS_WIN95
- jb @@skip
-
- mov ax, 440Dh
- mov cx, 084Bh ; Lock phisical disk
- mov bl, disk
- mov bh, 1 ; Lock level (0-3)
- mov dx, 0 ; Device permissions
- int 21h
-
- mov ax, -1
- jc @@end
- @@skip:
- mov ax, 0
- @@end:
- pop bp
- retf
- _disk_lock ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _disk_unlock PROC
-
- disk EQU [bp+06h]
-
- push bp
- mov bp, sp
-
- cmp _detected_os, SYS_WIN95
- jb @@skip
-
- mov ax, 440Dh
- mov cx, 086Bh ; Unlock phisical disk
- mov bl, disk
- int 21h
-
- mov ax, -1
- jc @@end
- @@skip:
- mov ax, 0
- @@end:
- pop bp
- retf
- _disk_unlock ENDP
-
-
- ;----------------------------------------------------------------
-
- disk EQU es:[si]
- cyl EQU es:[si+2]
- head EQU es:[si+4]
- sect EQU es:[si+6]
-
- Get_Disk_Params MACRO
-
- mov dl, disk
- mov dh, head
- mov cl, sect
- and cl, 3Fh
- mov bx, cyl
- mov ch, bl
- mov bl, 0
- shr bx, 1
- shr bx, 1
- or cl, bl
-
- ENDM
- ;----------------------------------------------------------------
-
-
- _disk_read PROC
-
- num EQU [bp+0Eh]
- buf_ptr EQU [bp+0Ah]
- disk_addr EQU [bp+06h]
-
- push bp
- mov bp, sp
- push es
- push si
- push di
- les si, disk_addr
-
- mov ah, 02h ; Read
- mov al, num ; Sectors
- Get_Disk_Params
- les bx, buf_ptr
- int 13h
-
- mov ax, -1
- jc @@skip
- mov ax, 0
- @@skip:
-
- pop di
- pop si
- pop es
- pop bp
- retf
- _disk_read ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _disk_write PROC
-
- num EQU [bp+0Eh]
- buf_ptr EQU [bp+0Ah]
- disk_addr EQU [bp+06h]
-
- push bp
- mov bp, sp
- push es
- push si
- push di
- les si, disk_addr
-
- mov ah, 03h ; Write
- mov al, num ; Sectors
- Get_Disk_Params
- les bx, buf_ptr
- int 13h
-
- mov ax, -1
- jc @@skip
- mov ax, 0
- @@skip:
-
- pop di
- pop si
- pop es
- pop bp
- retf
- _disk_write ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _disk_verify PROC
-
- num_sect EQU [bp+0Ah]
- disk_addr EQU [bp+06h]
-
- push bp
- mov bp, sp
- push es
- push si
- push di
- les si, disk_addr
-
- mov ah, 04h ; Verify
- mov al, num_sect ; How many sectors
- Get_Disk_Params
- int 13h
-
- mov ax, -1
- jc @@end
- mov ax, 0
- @@end:
- pop di
- pop si
- pop es
- pop bp
- retf
- _disk_verify ENDP
-
-
- ;----------------------------------------------------------------
-
-
- _disk_format PROC
-
- ftable EQU [bp+0Ah]
- disk_addr EQU [bp+06h]
-
- push bp
- mov bp, sp
- push es
- push si
- push di
- les si, disk_addr
-
- mov ah, 05h ; Format
- Get_Disk_Params
- les bx, ftable
- int 13h
-
- mov ax, -1
- jc @@end
- mov ax, 0
- @@end:
- pop di
- pop si
- pop es
- pop bp
- retf
- _disk_format ENDP
-
-
- ;----------------------------------------------------------------
-
-
- END
-