Программирование драйверов Windows


Исполняемый код драйвера


Как и в первом варианте драйвера, исходный текст всех функций драйвера представлен файлом Driver.cpp.

Часто повторяющийся код по завершению обработки IRP пакетов собран в функции CompleteIrp.

В процедуре DriverEntry дополнительно (по сравнению с первым вариантом) выполняется регистрация функции StartIo, которая будет использоваться при старте процесса обработки IRP пакетов, откладываемых в системную очередь обработчиком IOCTL запросов с IOCTL кодом IOCTL_SEND_TO_PORT.

Функция CreateDevice по-прежнему выполняет создание объекта устройства, регистрацию символьной ссылки и подключение драйвера к прерыванию. Однако теперь иначе выполняется регистрация DPC процедуры: при помощи вызова IoInitializeDpcRequest

(таблица 8.14) с передачей ссылки на объект устройства создается DPC объект в "недрах" системы. И тот код, который пожелает запланировать вызов функции DpcForIsr (регистрируемой таким образом), должен выполнить вызов IoRequestDpc. Еще раз следует отметить, что в WDM драйвере реального PnP устройства эти операции следовало бы выполнять в процедуре AddDevice и обработчике IR_MJ_PNP + IRP_MN_START_DEVICE, так как загрузка драйвера является только частью старта настоящего PnP устройства.

Процедура DriverUnload (она отвечает за завершающие операции при выгрузке драйвера) более не занимается DPC объектами (считается, что драйвер теперь не имеет прямого доступа ни к одному такому объекту). Однако в обязанности этой функции теперь входит выполнение вызова ObDereferenceObject

для уменьшения числа ссылок на используемый объект события, чтобы разрешить операционной системе его удаление, если эта операция будет сочтена целесообразной.

Обработчики DispatchCreate (при получении клиентом дескриптора для доступа к драйверу) и DispatchClose (при закрытии дескриптора, полученного в DispatchCreate) не претерпели изменений. Обработчики DispatchWrite и DispatchRead теперь в драйвере отсутствуют, а обработка запросов от клиента на чтение и запись данных в параллельный порт переложена на плечи функции DeviceControlRoutine (обработчик IRP пакетов, поступающих вследствие клиентских вызовов от Win32 функции DeviceIoControl).




Начало  Назад  Вперед