Уроки Iczelion'а

       

Полный пример


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



Содержание раздела