📄 phydisk9x.asm
字号:
;*****************************
;文件:PhyDisk9X.ASM *
;功能:Win9x下读物理盘 *
; 硬盘不适用 *
;*****************************
.386p
.model flat,stdcall ;平坦内存模式
;外部过程声明
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn CreateFileA:proc
extrn DeviceIoControl:proc
extrn CloseHandle:proc
;常量定义
NULL = 0
MB_OK = 0
INVALID_HANDLE_VALUE = -1
FILE_FLAG_DELETE_ON_CLOSE = 04000000H
VWIN32_DIOC_DOS_INT13 = 4
DIOC_REGISTERS STRUC
reg_EBX dd ?
reg_EDX dd ?
reg_ECX dd ?
reg_EAX dd ?
reg_EDI dd ?
reg_ESI dd ?
reg_Flags dd ?
ENDS
.data
FileName db '\\.\vwin32',0
align 4 ;双字对齐
Buffer db 4096 dup (0)
hFile dd 0
drs_in DIOC_REGISTERS<>
drs_out DIOC_REGISTERS<>
readed dd 0
Caption db 'Windows 9x中读写物理磁盘',0
ErrCreate db '建文件错!',0
ErrRead db '读盘错误!',0
ShowText db 4096*3 dup (0)
Digit db '0123456789ABCDEF'
.code
main proc
;取vwin32句柄
call CreateFileA,offset FileName,0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL
mov [hFile],eax
cmp eax,INVALID_HANDLE_VALUE
jnz read
;显示错误信息
call ShowError,offset ErrCreate
read: ;读数据
mov drs_in.reg_EAX,201H ;Int 13参数
mov drs_in.reg_EBX,offset Buffer
mov drs_in.reg_ECX,1
mov drs_in.reg_EDX,0 ;只能是:0-A盘,1-B盘
call DeviceIoControl,hFile,VWIN32_DIOC_DOS_INT13,\
offset drs_in,size drs_in,\
offset drs_out,size drs_out, \
offset readed,0;
cmp eax,0
jnz show
;显示错误信息
call ShowError,offset ErrRead
show: ;显示读出的内容
mov readed,512
call ShowBuffer
;关闭文件句柄
call CloseHandle ,[hFile]
;退出
call ExitProcess,0
main endp
ShowError proc ,MESSAGE:DWORD ;显示出错信息并退出
call MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK
cmp [hFile],0
jz endShowErr
call CloseHandle ,[hFile] ;关闭句柄
endShowErr:
call ExitProcess,0 ;退出
ShowError endp
ShowBuffer proc ;显示所读出的信息
;把数据转换成16进制的形式
mov esi,offset Buffer ;数据
mov edi,offset ShowText ;转换后的数据
mov ebx,offset Digit
mov ecx,0
xor eax,eax
computeAgain:
cmp [readed],0
jz endCompute
dec [readed]
mov al,[esi]
push eax
shr eax,4 ;高4位
mov al,[ebx+eax]
mov byte ptr[edi],al
inc edi
pop eax
and eax,0fH ;低4位
mov al,[ebx+eax]
mov byte ptr[edi],al
inc edi
mov byte ptr[edi],' ' ;空格
inc edi
inc esi
inc ecx
cmp ecx,16
jnz computeAgain
xor ecx,ecx
mov byte ptr[edi-1],13 ;回车
jmp computeAgain
endCompute:
;显示
call MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
ret
ShowBuffer endp
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -