Полный пример
Hиже находится исходный код win32-приложения, которое загружает динамический VxD и вызывает функцию в VxD через DeviceIoControl API.
; VxDLoader.asm
.386 .model flat,stdcall include windows.inc include kernel32.inc
includelib kernel32.lib include user32.inc includelib user32.lib
.data AppName db "DeviceIoControl",0 VxDName db "\\.\shellmsg.vxd",0
Success db "The VxD is successfully loaded!",0 Failure db "The VxD is not loaded!",0 Unload db "The VxD is now unloaded!",0 MsgTitle db "DeviceIoControl Example",0
MsgText db "I'm called from a VxD!",0 InBuffer dd offset MsgTitle dd offset MsgText .data?
hVxD dd ? .code start: invoke CreateFile,addr
VxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0 .if eax!=INVALID_HANDLE_VALUE mov hVxD,eax invoke MessageBox,NULL,addr Success,addr
AppName,MB_OK+MB_ICONINFORMATION invoke DeviceIoControl,hVxD,1,addr InBuffer,8,NULL,NULL,NULL,NULL invoke CloseHandle,hVxD
invoke MessageBox,NULL,addr Unload,addr AppName,MB_OK+MB_ICONINFORMATION .else invoke MessageBox,NULL,addr Failure,NULL,MB_OK+MB_ICONERROR
.endif invoke ExitProcess,NULL end start
Далее следует исходный код динамического VxD, который загружается vxdloader.asm.
; ShellMsg.asm
.386p include vmm.inc
include vwin32.inc include shell.inc
DECLARE_VIRTUAL_DEVICE SHELLMSG,1,0, SHELLMSG_Control,\ UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER
Begin_control_dispatch SHELLMSG Control_Dispatch w32_DeviceIoControl, OnDeviceIoControl End_control_dispatch SHELLMSG
VxD_PAGEABLE_DATA_SEG pTitle dd ? pMessage dd ?
VxD_PAGEABLE_DATA_ENDS
VxD_PAGEABLE_CODE_SEG
BeginProc OnDeviceIoControl assume esi:ptr DIOCParams .if [esi].dwIoControlCode==DIOC_Open xor eax,eax
.elseif [esi].dwIoControlCode==1 mov edi,[esi].lpvInBuffer ;----------------------------------- ; copy the message title to buffer ;----------------------------------- VMMCall _lstrlen, <[edi]> inc eax push eax
VMMCall _HeapAllocate,
mov pTitle,eax pop eax VMMCall _lstrcpyn,
;----------------------------------- ; copy the message text to buffer ;----------------------------------- VMMCall _lstrlen, <[edi+4]>
inc eax push eax VMMCall _HeapAllocate,
mov pMessage,eax
pop eax VMMCall _lstrcpyn,
mov edi,pTitle mov ecx,pMessage
mov eax,MB_OK VMMCall Get_Sys_VM_Handle VxDCall SHELL_sysmodal_Message VMMCall _HeapFree,pTitle,0
VMMCall _HeapFree,pMessage,0 xor eax,eax .endif ret
EndProc OnDeviceIoControl VxD_PAGEABLE_CODE_ENDS
end