1. Если с процедуры StartIo выйти не делая ни IoStartNextPacket, ни IoCompleteRequest, то останется ли текущий IRP в очереди необработаных пакетов? И вызовит ли диспечер ввода/вывода StartIo с этим IRP при следующим вызове IoStartNextPacket? 2. Если даже отработчик IRP_MJ_READ всегда помещает пакет в очередь необработаных пакетом(IoStartPacket) и возвращает STATUS_PENDING, то насамом деле на этот вызов ВЫШЕлежащего драйвера(IoCallDriver) может прийти STATUS_SUCCESS, если очередь необработаных пакетов пуста и IoStartPacket сразу породжает StartIo. Подскажите как это обходиться? В двух словах - дальше я догадаюсь. 3. Я делаю это так: Код (Text): NTSTATUS MouDrv_Read ( IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp ) { ... status = STATUS_PENDING; ... pIrp->IoStatus.Status = status; pIrp->IoStatus.Information = 0; if(status == STATUS_PENDING) { IoStartPacket(DeviceObject, pIrp, (PULONG)NULL, NULL); } else { IoCompleteRequest(pIrp, IO_NO_INCREMENT); } return status; } VOID MouDrv_StartIo ( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ) { .............. //Если запрос к нам в первый раз то, сигнализируем //поток о том, чтобы через некоторое время он нам //напомнил что его нужно обработать if(!pIrp->IoStatus.Information) { pIrp->IoStatus.Information = 1; KeSetEvent( &delayEvent, IO_NO_INCREMENT, FALSE ); return; } .... Обработка запроса .... pIrp->IoStatus.Status = STATUS_SUCCESS; pIrp->IoStatus.Information = sizeof( MOUSE_INPUT_DATA ); IoStartNextPacket( pDeviceObject, FALSE ); IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return ; } // Процедура-напоминалка, она в другом потоке void delayRoutine (PVOID pContext) { do { KeWaitForSingleObject(&delayEvent, Executive, KernelMode, FALSE, NULL); .... Задержка .... //Этот IoStartNextPacket ни к чему не приводит IoStartNextPacket( pDeviceObject, FALSE ); } while (!devExt->Removed); } Проблема в том что последний IoStartNextPacket не приводит к вызову StartIo. В чем я прокололся?
Я заменил в последней процедуре IoStartNextPacket на прямой вызов StartIo: pDeviceObject->DriverObject->DriverStartIo( pDeviceObject, devExt->PendingRequest ); Предварительно сохраняя нужный IRP. Вобшем логика какаято в этом есть: если сам не соизволил обработать IRP, то сам и дорабатывай)) <font color="red]Для драйвера мыши важно делать возможность отмены IRP?</font><!--color--> Что скажете верно я сделал?