例子: 这个例子演示了API传送方式,使用了int 21h的440Dh功能(从代码66h)。这个中断调用得到媒体ID,你的第一个固定磁盘的卷标号。 ;--------------------------------------------------------------- ; VxDLabel.asm ;--------------------------------------------------------------- .386p include /masm/include/vmm.inc include /masm/include/vwin32.inc include /masm/include/v86mmgr.inc VxDName TEXTEQU ControlName TEXTEQU VxDMajorVersion TEXTEQU <1> VxDMinorVersion TEXTEQU <0> VxD_STATIC_DATA_SEG VxD_STATIC_DATA_ENDS VXD_LOCKED_CODE_SEG ;---------------------------------------------------------------------------- ; Remember: The name of the vxd MUST be uppercase else it won't work/unload ;---------------------------------------------------------------------------- DECLARE_VIRTUAL_DEVICE %VxDName,%VxDMajorVersion,%VxDMinorVersion, %ControlName,UNDEFINED_DEVICE_ID,UNDEFINED_INIT_ORDER Begin_control_dispatch %VxDName Control_Dispatch W32_DEVICEIOCONTROL, OnDeviceIoControl End_control_dispatch %VxDName VXD_LOCKED_CODE_ENDS VXD_PAGEABLE_CODE_SEG BeginProc OnDeviceIoControl assume esi:ptr DIOCParams .if [esi].dwIoControlCode==1 VMMCall Get_Sys_VM_Handle mov Handle,ebx assume ebx:ptr cb_s mov ebp,[ebx+CB_Client_Pointer] mov ecx,sizeof MID stc push esi mov esi,OFFSET32 MediaID push ds pop fs VxDCall V86MMGR_Allocate_Buffer pop esi jc EndI mov AllocSize,ecx Push_Client_State VMMCall Begin_Nest_V86_Exec assume ebp:ptr Client_Byte_Reg_Struc mov [ebp].Client_ch,8 mov [ebp].Client_cl,66h assume ebp:ptr Client_word_reg_struc mov edx,edi mov [ebp].Client_bx,3 ; drive A mov [ebp].Client_ax,440dh mov [ebp].Client_dx,dx shr edx,16 mov [ebp].Client_ds,dx mov eax,21h VMMCall Exec_Int VMMCall End_Nest_Exec Pop_Client_State ;------------------------------- ; retrieve the data ;------------------------------- mov ecx,AllocSize stc mov ebx,Handle push esi mov esi,OFFSET32 MediaID push ds pop fs VxDCall V86MMGR_Free_Buffer pop esi mov edx,esi assume edx:ptr DIOCParams mov edi,[edx].lpvOutBuffer mov esi,OFFSET32 MediaID.midVolLabel mov ecx,11 rep movsb mov byte ptr [edi],0 mov ecx,[edx].lpcbBytesReturned mov dword ptr [edx],11 EndI: .endif xor eax,eax ret EndProc OnDeviceIoControl VXD_PAGEABLE_CODE_ENDS VXD_PAGEABLE_DATA_SEG MID struct midInfoLevel dw 0 midSerialNum dd ? midVolLabel db 11 dup(?) midFileSysType db 8 dup(?) MID ends MediaID MID <> Handle dd ? AllocSize dd ? VXD_PAGEABLE_DATA_ENDS end ;------------------------------------------------------------ ; Label.asm ; The win32 VxD loader. ;------------------------------------------------------------ .386 .model flat,stdcall option casemap:none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib /masm32/lib/kernel32.lib DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD .data Failure db "Cannot load VxDLabel.VXD",0 AppName db "Get Disk Label",0 VxDName db "//./vxdLabel.vxd",0 OutputTemplate db "Volume Label of Drive C",0 .data? hInstance HINSTANCE ? hVxD dd ? DiskLabel db 12 dup(?) BytesReturned dd ? .const IDD_VXDRUN equ 101 IDC_LOAD equ 1000 .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke DialogBoxParam, hInstance, IDD_VXDRUN ,NULL,addr DlgProc,NULL invoke ExitProcess,eax DlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_INITDIALOG invoke CreateFile,addr VxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0 .if eax==INVALID_HANDLE_VALUE invoke MessageBox,hDlg,addr Failure,addr AppName,MB_OK+MB_ICONERROR mov hVxD,0 invoke EndDialog,hDlg,NULL .else mov hVxD,eax .endif .elseif uMsg==WM_CLOSE .if hVxD!=0 invoke CloseHandle,hVxD .endif invoke EndDialog,hDlg,0 .ELSEIF uMsg==WM_COMMAND mov eax,wParam mov edx,wParam shr edx,16 .if dx==BN_CLICKED .IF ax==IDC_LOAD invoke DeviceIoControl,hVxD,1,NULL,0,addr DiskLabel,12,addr BytesReturned,NULL invoke MessageBox,hDlg,addr DiskLabel,addr OutputTemplate,MB_OK+MB_ICONINFORMATION .endif .endif .ELSE mov eax,FALSE ret .ENDIF mov eax,TRUE ret DlgProc endp end start  
2/2 首页 上一页 1 2 |