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

ОФТАЛЬМОСКОПИЧЕСКИЕ ЛИНЗЫ подробности здесь. |

Процедура DriverEntry и предварительные объявления - часть 2


// Хотя и нехорошо делать глобальные переменные в драйвере... KSPIN_LOCK MySpinLock; #pragma code_seg("INIT") // начало секции INIT ///////////////////////////////////////////////////////////////////// // (Файл init.cpp) // DriverEntry - инициализация драйвера и необходимых объектов // Аргументы: указатель на объект драйвера // раздел реестра (driver service key) в UNICODE // Возвращает: STATUS_Xxx

extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS status = STATUS_SUCCESS; PDEVICE_OBJECT fdo; UNICODE_STRING devName;

#if DBG DbgPrint("=Example= In DriverEntry."); DbgPrint("=Example= RegistryPath = %ws.", RegistryPath->Buffer); #endif

// Экспорт точек входа в драйвер (AddDevice объявлять не будем) // DriverObject->DriverExtension->AddDevice= OurAddDeviceRoutine; DriverObject->DriverUnload = UnloadRoutine; DriverObject->MajorFunction[IRP_MJ_CREATE]= Create_File_IRPprocessing; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Close_HandleIRPprocessing; DriverObject->MajorFunction[IRP_MJ_READ] = ReadWrite_IRPhandler; DriverObject->MajorFunction[IRP_MJ_WRITE] = ReadWrite_IRPhandler; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]= DeviceControlRoutine; //======================================================== // Действия по созданию символьной ссылки // (их нужно было бы делать в OurAddDeviceRoutine, но у нас // очень простой драйвер и эта процедура отсутствует): RtlInitUnicodeString( &devName, L"\\Device\\EXAMPLE" );

// Создаем наш Functional Device Object (FDO) и получаем // указатель на созданный FDO в нашей переменной fdo. // (В WDM драйвере эту работу также следовало бы выполнять // в процедуре OurAddDeviceRoutine.) При создании FDO // будет выделено место и под структуру расширения устройства // EXAMPLE_DEVICE_EXTENSION (для этого мы передаем в вызов // ее размер, вычисляемый оператором sizeof): status = IoCreateDevice(DriverObject, sizeof(EXAMPLE_DEVICE_EXTENSION), &devName, // может быть и NULL FILE_DEVICE_UNKNOWN, 0, FALSE, // без эксклюзивного доступа &fdo); if(!NT_SUCCESS(status)) return status;




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



Книжный магазин