absdisk9x.asm
来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 140 行
ASM
140 行
;*****************************
;文件:AbsDisk9X.ASM *
;功能:Windows 9x中的绝对 *
; 磁盘存取 *
;*****************************
.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_DRIVEINFO = 6
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
DISKIO STRUC
dwStartSector DD ? ;开始扇区
wSectors DW ? ;扇区数
lpBuffer 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<>
dio DISKIO<>
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,7305H
mov drs_in.reg_EBX,offset dio
mov drs_in.reg_ECX,-1
mov drs_in.reg_EDX,3 ; 1-A盘、2-B盘、3-C盘,依此类推
mov drs_in.reg_ESI,0 ;读
mov dio.dwStartSector,0
mov dio.wSectors,1
mov dio.lpBuffer,offset Buffer
call DeviceIoControl,hFile,VWIN32_DIOC_DOS_DRIVEINFO,\ ;读磁盘
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 + =
减小字号Ctrl + -
显示快捷键?