Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДП.docx
Скачиваний:
11
Добавлен:
23.09.2019
Размер:
4.64 Mб
Скачать

2.4 Разработка программного обеспечения

Хотелось бы сделать небольшое замечание к данному разделу. Дело в том, что код драйвера довольно, особенно это касается процедур обработки запросов управления питанием и Plug and Play, из которых вызываются немалое количество других вспомогательных процедур-обработчиков. В связи с этим, в данном разделе будет приведен лишь наиболее важные и информативные части кода, которые позволяют понять принцип работы того или иного обработчика.

2.4.1 Процедура DriverEntry

В первом аргументе DriverEntry передается указатель на объект драйвера, пред­ставляющий функциональный драйвер и прошедший минимальную инициализацию. Функция драйвера WDM DriverEntry должна завершить инициализацию объекта и вер­нуть управление. Во втором аргументе DriverEntry передается имя раздела службы в реестре.

UNICODE_STRING servkey; // Глобальная переменная для хранения

// имени раздела в реестре

extern "C" NTSTATUS DriverEntry(

IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath

)

{

NTSTATUS Status = STATUS_SUCCESS;

PDEVICE_OBJECT deviceObject = NULL;

servkey.Buffer = (PWSTR) ExAllocatePool(PagedPool,

RegistryPath->Length + sizeof(WCHAR));

if (!servkey.Buffer)

{

KdPrint((" - Unable to allocate %d bytes for copy of service key name\n", RegistryPath->Length + sizeof(WCHAR)));

return STATUS_INSUFFICIENT_RESOURCES;

}

servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR);

RtlCopyUnicodeString(&servkey, RegistryPath);

servkey.Buffer[RegistryPath->Length / 2] = 0;

Главной задачей функции DriverEntry в WDM является заполнение всевозможных указателей на функции в объекте драйвера. Эти указатели сообщают операционной системе, где находятся функции, которые должны быть включены в драйвер - «контейнер».

DriverObject->MajorFunction[IRP_MJ_CREATE] = USBCreate;

DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBClose;

DriverObject->DriverUnload = DriverUnload;

DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIOCTL;

DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = ProcessSysControlIrp; // Обработчик для WMI

DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnP;

DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;

DriverObject->DriverExtension->AddDevice = AddDevice;

DriverObject->DriverUnload = DriverUnload;

return Status;

}

2.4.2 Процедура DriverUnload

Функция драйвера WDM DriverUnload «убирает мусор» после глобальной ини­циализации, которая была выполнена функцией DriverEntry. На прак­тике она почти ничего не делает. В нашем случае в DriverEntry была скопирована строка RegistryPath, поэтому DriverUnload освобождет память, занимаемую ко­пией:

#pragma PAGEDCODE // Выгружаемый участок памяти

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)

{

KdPrint((" - Entering DriverUnload: DriverObject %8.8lX\n", DriverObject));

RtlFreeUnicodeString(&servkey); // Удаляем UNICODE-строку

}

Даже если бы в нашем драйвере деинициализация не нужна была, присутствие функции DriverUnload все равно необходимо для динамической выгрузки драйвера.