Исполняемый код драйвера - часть 5
// Проход по всем устройствам, контролирумым драйвером for( ; pNextObj!=NULL; ) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension; // Удаляем объект прерываний: if (pDevExt->pIntObj) { // На всякий случай блокируем поступление прерываний // и очищаем DPC очередь от нашего DPC объекта WriteControlRegister( pDevExt, CR_DEFAULT); KeRemoveQueueDpc( &(pDevExt->DpcForIsr_Object) ); IoDisconnectInterrupt( pDevExt->pIntObj ); } // Удаляем символьную ссылку: IoDeleteSymbolicLink(&pDevExt->ustrSymLinkName); #if DBG==1 DbgPrint("LPTPORT: SymLink %ws deleted\n", pDevExt->ustrSymLinkName.Buffer); #endif // Сохраняем ссылку на следующее устройство и удаляем // текущий объект устройства: pNextObj = pNextObj->NextDevice; IoDeleteDevice( pDevExt->pDevice ); } // Замечание. Поскольку мы использовали ресурс (параллельный порт) // объявленные не нами, то освобождение этого ресурса можно опустить. } //========================================================================= // Функция: DispatchCreate // Назначение: Обрабатывает запрос по поводу Win32 вызова CreateFile // Аргументы: pDevObj - поступает от Диспетчера ввода/вывода // pIrp - поступает от Диспетчера ввода/вывода // Возвращаемое значение: STATUS_SUCCESS // NTSTATUS DispatchCreate ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ) { #if DBG==1 DbgPrint("LPTPORT: in DispatchCreate now\n"); #endif pIrp->IoStatus.Status = STATUS_SUCCESS; pIrp->IoStatus.Information = 0; // ни одного байта не передано IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } //========================================================================= // Функция: DispatchClose // Назначение: Обрабатывает запрос по поводу Win32 вызова CloseHandle // Аргументы: pDevObj - поступает от Диспетчера ввода/вывода // pIrp - поступает от Диспетчера ввода/вывода // Возвращаемое значение: STATUS_SUCCESS // NTSTATUS DispatchClose ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ) { #if DBG==1 DbgPrint("LPTPORT: in DispatchClose now\n"); #endif pIrp->IoStatus.Status = STATUS_SUCCESS; pIrp->IoStatus.Information = 0; // ни одного байта не передано IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } //========================================================================= // Функция: DispatchWrite // Назначение: Обрабатывает запрос по поводу Win32 вызова WriteFile // Аргументы: pDevObj - поступает от Диспетчера ввода/вывода // pIrp - поступает от Диспетчера ввода/вывода // Возвращаемое значение: // NTSTATUS - в случае нормального завершения STATUS_SUCCESS // или код ошибки STATUS_Xxx // NTSTATUS DispatchWrite ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ) { #if DBG==1 DbgPrint("LPTPORT: in DispatchWrite now\n"); #endif PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp ); PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pDevObj->DeviceExtension; ULONG xferSize = pIrpStack->Parameters.Write.Length;