.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc ; Макрос invoke...etc include \masm32\include\kernel32.inc ; DeviceIOControl, CreateFile... etc includelib \masm32\lib\kernel32.lib ; Сама библиотека include \masm32\include\user32.inc ; MessageBox includelib \masm32\lib\user32.lib ; Сама библиотека .data CallParams struc LinearAddr dd ? PhysAddr dd ? CallParams ends MsgCaption db "Iczelion's tutorial no.2",0 ; Сообщения о процессе загрузки/выгрузки VxD AppName db "DeviceIoControl",0 Success db "The VxD is successfully loaded!",0 SerNumErr db "Read physical address error !",0 Failure db "The VxD is not loaded!",0 Unload db "The VxD is now unloaded!",0 ; Имя загружаемого VxD, которое передается CreateFile-у VxDName db "\\.\PHY.VXD",0 ; Структура, которой передаются параметры коду VxD InBuffer dd offset MyMem ; Указатель на буфер для чтения параметров ; Сегмент данных программы(неинициализированных) .data? hVxD dd ? ; Тут будет храниться хэндл открытого VxD MyMem CallParams <> ; Начало выполнимого кода .code start: ; Загрузим динамический VxD через CreateFile invoke CreateFile,addr VxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0 .if eax!=INVALID_HANDLE_VALUE ; VxD Успешно загружена ? mov hVxD,eax ; Выдать сообщение о том, что VxD загружена успешно invoke MessageBox,NULL,addr Success,addr AppName,MB_OK+MB_ICONINFORMATION call @@GetOfs @@GetOfs: pop eax ; Сейчас показывается линейный адрес сегмента команд - eax !! mov dword ptr MyMem.LinearAddr,eax ;0BFF77ADFh invoke DeviceIoControl,hVxD,1,addr InBuffer,sizeof InBuffer,NULL,NULL,NULL,NULL ; Проверка на ошибку. Если ошибка, то eax = 0 test eax,eax jz @@ErrorReadSerial call Print_PhysAddr jmp @@EndRead @@ErrorReadSerial: invoke MessageBox,NULL,addr SerNumErr,addr AppName,MB_OK+MB_ICONERROR @@EndRead: 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 ; Подпрограммы .data PhysInfo db "Linear addr: ???????? Phys addr: ????????",0 .code Print_PhysAddr proc mov eax,MyMem.LinearAddr mov edi,offset PhysInfo+13 call HexChar mov eax,MyMem.PhysAddr mov edi,offset PhysInfo+33 call HexChar invoke MessageBox,NULL,addr PhysInfo,addr MsgCaption,MB_OK ret Print_PhysAddr endp ; HexChar - форматирование числа(32 бита в eax) в строку, указанную в edi HexChar proc pushad cld mov ecx,8 mov ebx,offset TabHex @GetHex: rol eax,4 push eax and al,0fh xlat stosb pop eax loop @GetHex popad ret TabHex db '0123456789abcdef' HexChar endp end start