Все, казалось бы, тривиально. Код (Text): NTSTATUS FilterDispatchCreate( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ) { DEVICE_EXTENSION* pDevExt = (DEVICE_EXTENSION*)pDeviceObject->DeviceExtension; DbgPrint("FilterDispatchCreate() PDO: 0x%x, PLDO: 0x%x\n", pDevExt->pLowerDevice); IoSkipCurrentIrpStackLocation(pIrp); return IoCallDriver(pDevExt->pLowerDevice, pIrp); } В общем, виснет где-то в одном из низлежащих драйверов (по-моему, уже как раз в основном драйвере). Виснет, потому что KeWaitForMutexObject. Понятия не имею, где косяк.
*Правка, здесь, конечно же DbgPrint("FilterDispatchCreate() PDO: 0x%x, PLDO: 0x%x\n", pDeviceObject, pDevExt->pLowerDevice); Но это к сути вопроса никакого отношения не имеет, есс-но.
Хмм, отбой, проблема не в этом месте. Дело в том, что при создании объекта-фильтра я открываю порт через ZwCreateFile (потом юзаю ObReferenceObjectByHandle), как и у Руссиновича. Если вызывать IoAttachDeviceToDeviceStack до вызова ZwClose, то как раз происходит такой глюк (один раз IRP_MJ_CLOSE нормально обрабатывается, а при следующем закрытии вышеуказанная ситуация). Если попробовать вызвать IoAttachDeviceToDeviceStack после ZwClose, то данный IRP_MJ_CLOSE мой фильтр естественно не обрабатывает, дальнейшие IRP все обрабатываются нормально, кроме IRP_MJ_CLOSE - виснет, когда тестовое юзермодное приложение закрывает порт...