Динамические виртуальные драйверы
IV
В последнем разделе главы мы рассмотрим динамические виртуальные драйверы. Существует три способа загрузки виртуальных динамических драйверов.
Именно последним способом загрузки динамических драйверов мы сейчас и займемся. Схема использования динамических виртуальных драйверов следующая:
Перейдем теперь к программе загрузки динамического драйвера. Программа показана на Рисунок 4.7.4. Она загружает драйвер msg.vxd и вызывает сервис 3 драйвера.
; файл FILES1.ASM .386P ; плоская модель .MODEL FLAT, stdcall ; константы STD_INPUT_HANDLE equ -10 FILE_FLAG_DELETE_ON_CLOSE equ 4000000h
; прототипы внешних процедур EXTERN GetStdHandle@4:NEAR EXTERN ExitProcess@4:NEAR EXTERN GetCommandLineA@0:NEAR EXTERN CreateFileA@28:NEAR EXTERN CloseHandle@4:NEAR EXTERN MessageBoxA@16:NEAR EXTERN ReadConsoleA@20:NEAR EXTERN DeviceIoControl@32:NEAR ; ;------------------------------------------------ ;директивы компоновщику для подключения библиотек includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib ;------------------------------------------------ ; ; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' HANDL DWORD ? HFILE DWORD ? BUF DB "\\.\msg.vxd",0 CAP DB "Окно сообщения",0 MES DB "Ошибка загрузки драйвера",0 BUFER DB 20 DUP (0) LENS DWORD ? ; количество выведенных символов MES1 DB "Вызов сервиса OK!",0 _DATA ENDS
; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить HANDLE ввода PUSH STD_INPUT_HANDLE CALL GetStdHandle@4 MOV HANDL,EAX ; открыть файл PUSH 0 PUSH FILE_FLAG_DELETE_ON_CLOSE PUSH 0 PUSH 0 PUSH 0 PUSH 0 PUSH OFFSET BUF CALL CreateFileA@28 CMP EAX,-1 JE _ERR MOV HFILE,EAX ; вызов сервиса VXD PUSH 0 PUSH 0 PUSH 0 PUSH 0 PUSH 18 PUSH OFFSET MES1 PUSH 3 ; номер сервиса PUSH HFILE CALL DeviceIoControl@32 ; ждать клавиши ENTER PUSH 0 PUSH OFFSET LENS PUSH 200 PUSH OFFSET BUFER PUSH HANDL CALL ReadConsoleA@20 ; закрыть и выгрузить драйвер PUSH HFILE CALL CloseHandle@4 _EXIT: ; конец работы программы PUSH 0 CALL ExitProcess@4 _ERR: PUSH 0 ; MB_OK PUSH OFFSET CAP PUSH OFFSET MES PUSH 0 ; дескриптор окна CALL MessageBoxA@16 JMP _EXIT _TEXT ENDS END START