Уроки Iczelion'а



Каркас VxD - часть 3


PERF_INIT_ORDER EQU 000900000H APM_INIT_ORDER EQU 001000000H

  • Вы можете видеть, что VMM, DEBUG и DEBUGCMD - это первые VxD, которые загружаются, за ними следуют PERF и APM. VxD с наименьшим значением загружается первым. Если вашему VxD требуются сервисы других VxD во время инициализации, вам следует указать значение данного поля большее, чем у VxD, сервисы которого вам потребуются. Если вашему VxD порядок загрузки не важен, укажите UNDEFINED_INIT_ORDER.
  • V86Proc и PMProc - VxD может экспортировать API, для использования программами V86 и защищенного режима. V86Proc и PMProc задают адреса этих API. Помните, что VxD существует в основном для управления виртуальными машинами, в том числе и теми, что отличаются от системной виртуальной машины. Вот почему VxD зачастую предоставляют поддержку API для DOS-программ и программ защищенного режима. Если вы не экспортирует эти API, вы можете пропустить эти поля.
  • RefDataReference - данные, используемые Input Output Supervisor (IOS). Единственным случаем, когда вам нужно будет использовать это поле - это когда вы программирует драйвер, работающий с IOS.
  • Затем идет Begin_Control_Dispatch.

    Begin_control_dispatch FIRSTVXD End_control_dispatch FIRSTVXD

    Этот макрос и его заключительная часть определяет контрольную процедуру устройства, которая будет вызываться при поступлении контрольных сообщений. Вы должны указать первую половину имени этой процедуры, в нашем примере мы используем 'FIRSTVXD'. Макрос прибавит _Control к имени, которое вы укажите. Это имя должно совпадать с тем, что вы указали в параметре CtrlPoc, передаваемый макросу Declare_virtual_device. Процедура всегда находится в "запертом" сегменте (VxD_LOCKED_CODE_SEG). Вышеприведенная процедура не делает ничего. Вы должны указать, какие контрольные сообщения должны обрабатываться вашим VxD и функции, которые будут их обрабатывать. Для этих целей используется макрос Control_Dispatch.

    Control_Dispatchmessage, function

    Hапример, если ваш VxD обрабатывает только сообщение Device_Init, контрольная процедура устройства будет выглядеть так:

    Begin_Control_Dispatch FIRSTVXD Control_Dispatch Device_Init, OnDeviceInit End_Control_DispatchFIRSTVXD

    OnDeviceInit - это имя функции, которая будет обрабатывать сообщение Device_Init. Вы можете назвать эту функцию как угодно. Вы заканчиваете VxD заключительной директивой.

    Подводя pезюме, можно сказать, что VxD, как минимум, должно иметь DDB и контрольную процедуру устройства. Вы объявляете DDB с помощью макроса Declare_Virtual_Device и контрольную процедуру устройства с помощью макроса Begin_Control_Disрatch. Вы должны экспортировать DDB, указав его имя в директиве EXPORT в .DEF-файле.




    Содержание  Назад  Вперед