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


Исполняемый код драйвера - часть 3


В нашем случае он переводится в сигнальное состояние, поскольку прекращение жизни IRP пакета &#8212 это тоже (хотя и своеобразное) завершение работы над ним.

//========================================================================= // Файл driver.cpp (Вариант 2) // Драйвер обслуживания заглушки CheckIt (параллельный порт 378h) // By SVP, 21 June 2004 //========================================================================= #include "driver.h" // Предварительные объявления функций NTSTATUS CreateDevice ( IN PDRIVER_OBJECT pDriverObject, IN ULONG portBase, IN ULONG Irq ); NTSTATUS DispatchCreate ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ); NTSTATUS DispatchClose ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ); VOID DriverUnload ( IN PDRIVER_OBJECT pDriverObject ); NTSTATUS DeviceControlRoutine ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ); VOID StartIo ( IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp ); BOOLEAN Isr ( IN PKINTERRUPT pInterruptObject, IN PVOID pServiceContext ); VOID DpcForIsr ( IN PKDPC pDpc, IN PVOID DeferredContext, IN PVOID pArg1, IN PVOID pArg2 ); //========================================================================= NTSTATUS CompleteIrp( PIRP pIrp, NTSTATUS status, ULONG size) { pIrp-&#62IoStatus.Status = status; pIrp-&#62IoStatus.Information = size; IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return status; } //========================================================================= // Функция: DriverEntry // Назначение: Инициализирует драйвер, подключает объект устройства для // получения прерываний. // Аргументы: pDriverObject - поступает от Диспетчера ввода/вывода // pRegistryPath - указатель на Юникод-строку, // обозначающую раздел Системного Реестра, созданный // для данного драйвера. // Возвращаемое значение: // NTSTATUS - в случае нормального завершения STATUS_SUCCESS // или код ошибки STATUS_Xxx // extern "C" NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) { NTSTATUS status; #if DBG==1 DbgPrint("LPTPORT: in DriverEntry, RegistryPath is:\n %ws. \n", pRegistryPath-&#62Buffer); #endif // Регистрируем рабочие процедуры драйвера: pDriverObject-&#62DriverUnload = DriverUnload; pDriverObject-&#62MajorFunction[IRP_MJ_CREATE] = DispatchCreate; pDriverObject-&#62MajorFunction[IRP_MJ_CLOSE] = DispatchClose; pDriverObject-&#62MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControlRoutine; pDriverObject-&#62DriverStartIo = StartIo; // Работа по созданию объекта устройства, подключению // ресурсов, прерывания, созданию символьной ссылки: status = CreateDevice(pDriverObject, 0x378, 0x7); return status; } //========================================================================= // Функция: CreateDevice // Назначение: Создание устройства с точки зрения системы // Аргументы: pDriverObject - поступает от Диспетчера ввода/вывода // portBase - адрес базового регистра параллельного порта (378h) // Irq - прерывание (в терминах шины ISA) для обслуживания порта // Возвращаемое значение: // NTSTATUS - в случае нормального завершения STATUS_SUCCESS // или код ошибки STATUS_Xxx // NTSTATUS CreateDevice ( IN PDRIVER_OBJECT pDriverObject, IN ULONG portBase, IN ULONG Irq ) { NTSTATUS status; PDEVICE_OBJECT pDevObj; PDEVICE_EXTENSION pDevExt; // Создаем внутреннее имя устройства UNICODE_STRING devName; RtlInitUnicodeString( &devName, L"\\Device\\LPTPORT" ); // Создаем объект устройства status= IoCreateDevice( pDriverObject, sizeof(DEVICE_EXTENSION), &devName, FILE_DEVICE_UNKNOWN, 0, FALSE, // TRUE - for exclusive access &pDevObj ); if (!NT_SUCCESS(status)) return status;




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