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


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


pDriverObject-&#62MajorFunction[IRP_MJ_CREATE] = DispatchCreate; pDriverObject-&#62MajorFunction[IRP_MJ_CLOSE] = DispatchClose; pDriverObject-&#62MajorFunction[IRP_MJ_WRITE] = DispatchWrite; pDriverObject-&#62MajorFunction[IRP_MJ_READ] = DispatchRead;

// Работа по созданию объекта устройства, подключению // ресурсов, прерывания, созданию символьной ссылки: 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, TRUE, &pDevObj ); if (!NT_SUCCESS(status)) return status;

// Будем использовать метод буферизации BUFFERED_IO pDevObj-&#62Flags |= DO_BUFFERED_IO; // Заполняем данными структуру Device Extension pDevExt = (PDEVICE_EXTENSION)pDevObj-&#62DeviceExtension; pDevExt-&#62pDevice = pDevObj; // сохраняем - это пригодится pDevExt-&#62ustrDeviceName = devName; pDevExt-&#62Irq = Irq; pDevExt-&#62portBase = (PUCHAR)portBase; pDevExt-&#62pIntObj = NULL; pDevExt-&#62xferRest = 0; // сейчас нет неотправленных данных pDevExt-&#62pIntObj = NULL; //================================================ // Инициализируем объект DPC для последующего использования // при обработки прерываний: KeInitializeDpc( &(pDevExt-&#62DpcForIsr_Object), DpcForIsr, pDevExt // &#60- pDeferredContext в функции DpcForIsr ); //================================================ // На всякий случай блокируем поступление прерываний: WriteControlRegister ( pDevExt, CR_DEFAULT ); //================================================ // Создаем и подключаем объект прерываний: KIRQL kIrql; KAFFINITY kAffinity;




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