Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 31 стр.

UptoLike

Составители: 

31
Эта функция должна присутствовать, даже, если деинициализация не
нужна. Она необходима для динамической выгрузки драйвера.
DriverExtension
Æ
AddDeviceуказатель на функцию AddDevice
драйвера. Диспетчер PnP однократно вызывает эту функцию для каждого
экземпляра оборудования, обслуживаемого драйвером.
DriverStartIo в этом поле содержится указатель на функцию StartIo,
если драйвер использует стандартный метод формирования очередей
запросов ввода-вывода.
MajorFunction диспетчер ввода-вывода помещает сюда указатели на
фиктивную диспетчерскую функцию,
которая сообщает о неудачной
обработке запроса. Ранее уже говорилось, что драйвер должен
обрабатывать какие-то IRP, поэтому хотя бы некоторые из указателей
должны ссылаться на ваши диспетчерские функции. Драйвер обязательно
должен обрабатывать запросы ввода-вывода PnP _ POWER и
SYSTEM_CONTROL.
Итак, рассмотрим примерный код функции DriverEntry:
extern “C” NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload = DriverUnload; //1
DriverObject->DriverExtension->AddDevice = AddDevice;
DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp; //2
DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] =
DispatchWmi;
//3
servkey.Buffer = (PWSTR) ExAllocatePool(PagePool, //4
RegistryPath->Length + sizeof(WCHAR));
if (!servkey.Buffer)
return STATUS_INSUFFICIENT_RESOURCES;
servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR));
RtlCopyUnicodeString(&servkey, RegistryPath);
        Эта функция должна присутствовать, даже, если деинициализация не
        нужна. Она необходима для динамической выгрузки драйвера.
      − DriverExtension Æ AddDevice – указатель на функцию AddDevice
        драйвера. Диспетчер PnP однократно вызывает эту функцию для каждого
        экземпляра оборудования, обслуживаемого драйвером.
      − DriverStartIo – в этом поле содержится указатель на функцию StartIo,
        если драйвер использует стандартный метод формирования очередей
        запросов ввода-вывода.
      − MajorFunction – диспетчер ввода-вывода помещает сюда указатели на
        фиктивную диспетчерскую функцию, которая сообщает о неудачной
        обработке запроса. Ранее уже говорилось, что драйвер должен
        обрабатывать какие-то IRP, поэтому хотя бы некоторые из указателей
        должны ссылаться на ваши диспетчерские функции. Драйвер обязательно
        должен обрабатывать запросы ввода-вывода PnP _ POWER и
        SYSTEM_CONTROL.
      Итак, рассмотрим примерный код функции DriverEntry:
extern “C” NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
 IN PUNICODE_STRING RegistryPath)
 {
 DriverObject->DriverUnload = DriverUnload;                  //1
 DriverObject->DriverExtension->AddDevice = AddDevice;
 DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp; //2
 DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
 DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] =
     DispatchWmi;
 …                                                           //3
 servkey.Buffer = (PWSTR) ExAllocatePool(PagePool,           //4
     RegistryPath->Length + sizeof(WCHAR));
 if (!servkey.Buffer)
     return STATUS_INSUFFICIENT_RESOURCES;
 servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR));
 RtlCopyUnicodeString(&servkey, RegistryPath);
                                     31