Создание VxD на Visual C++ без ассемблерных модулей - Системные средства поддержки VxD

ОГЛАВЛЕНИЕ

 

Системные средства поддержки VxD

Некоторые системные сообщения

DEVICE_INIT - инициализация статического драйвера

  • EBX — идентификатор системной виртуальной машины.
  • ESI — адрес командной строки VMM в его PSP. Первый байт строки определяет ее длину.

Сообщение посылается после загрузки статического драйвера для его инициализации.

SYS_DYNAMIC_DEVICE_INIT - инициализация динамического драйвераСообщение посылается после загрузки динамического драйвера для его инициализации.

SYS_DYNAMIC_DEVICE_EXIT - завершение динамического драйвераСообщение посылается перед выгрузкой динамического драйвера для завершения его работы.CREATE_VM - создание новой виртуальной машины

  • EBX — идентификатор создаваемой виртуальной машины.

Посылается в процессе создания новой виртуальной машины (VM), но до ее фактического запуска. На этом этапе VxD может определить, сможет ли он поддерживать создаваемую виртуальную машину, и запросить необходимые для поддержки ресурсы. Возврат установленного флага CF предотвращает создание машины.

VM_INIT - инициализация новой виртуальной машины

  • EBX — идентификатор виртуальной машины.

Посылается в начале работы новой виртуальной машины, при ее инициализации, в контексте этой виртуальной машины. На этом этапе VxD может инициализировать ресурсы, выделенные для поддержки новой виртуальной машины.Флаг CF всегда должен возвращаться сброшенным.

VM_TERMINATE - завершение виртуальной машины

  • EBX — идентификатор завершаемой машины.

Посылается в начале процесса завершения виртуальной машины.Флаг CF всегда должен возвращаться сброшенным.

DESTROY_VM - уничтожение виртуальной машины

  • EBX — идентификатор уничтожаемой машины.

Посылается в конце процесса завершения машины, перед непосредственным удалением ее из системы.Флаг CF всегда должен возвращаться сброшенным.

CREATE_THREAD - создание новой задачи

  • EDI — идентификатор создаваемой задачи.
Посылается при создании в системе новой задачи. Создаваемая задача в этот момент еще не является текущей.Возврат установленного флага CF предотвращает создание задачи.THREAD_INIT - инициализация новой задачи EDI — идентификатор задачи.Посылается при инициализации задачи, в начале ее работы, в контексте задачи (новая задача является текущей).Флаг CF всегда должен возвращаться сброшенным.TERMINATE_THREAD - завершение задачи
  • EDI — идентификатор завершаемой задачи.

Посылается в начале процесса завершения задачи. Завершаемая задача еще какое-то время может оставаться в системе, пока не будут завершены все ждущие операции ввода/вывода.Флаг CF всегда должен возвращаться сброшенным.

DESTROY_THREAD - уничтожение задачи

  • EDI — идентификатор уничтожаемой задачи.

Посылается в конце процесса завершения задачи, перед непосредственным удалением задачи из системы.Флаг CF всегда должен возвращаться сброшенным.

SYSTEM_EXIT - завершение работы системы

  • EBX — идентификатор системной виртуальной машины.

Посылается в начале процесса завершения работы системы, при запросе закрытия системы (shutdown), перезагрузки (reboot) или при аварийном завершении.

W32_DEVICEIOCONTROL - запрос от приложения Win32

  • EBX — идентификатор текущей виртуальной машины.
  • ESI — адрес блока параметров DIOCParams.
  • Сообщение всегда посылается в контексте вызвавшей задачи Win32, так что драйверу напрямую доступно адресное пространство приложения. Драйвер обрабатывает запрос, извлекая из блока параметров и исходного буфера данные запроса, и возвращает в EAX код завершения:

0 — обработка завершена успешно;-1 — начата асинхронная операция. Возвращается только в том случае, если параметру был задан ненулевой параметр lpoOverlapped.код ошибки — если операция завершена неудачно.Вместе с возвратом результата в EAX драйвер может заносить необходимую информацию в буфер результата, если он указан в блоке параметров.