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 + -
显示快捷键?