Ассемблер для Windows

Динамические виртуальные драйверы



IV

В последнем разделе главы мы рассмотрим динамические виртуальные драйверы. Существует три способа загрузки виртуальных динамических драйверов.

  1. Поместить драйвер в каталог \SYSTEM\IOSUBSYS. Драйверы из этого директория загружаются супервизором ввода- вывода.
  2. Использовать сервис VxDLDR. Эту сервисную функцию можно вызывать только из виртуальных драйверов.
  3. Использовать функцию CreateFile.
  4. Именно последним способом загрузки динамических драйверов мы сейчас и займемся. Схема использования динамических виртуальных драйверов следующая:

    1. Открываем драйвер с помощью функции CreateFile. При удачном открытии функция возвращает идентификатор, который затем используется при вызове функций экспортируемых данным драйвером.
    2. Используем функции динамического драйвера посредством вызова функции API DeviceIoControl.
    3. Закрываем драйвер с помощью CloseHandle, при этом он автоматически выгружается из памяти.
    4. Перейдем теперь к программе загрузки динамического драйвера. Программа показана на Рисунок 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


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