阅读:1163回复:0
TDI 过滤驱动中IRP处理的问题
本人在处理TDI_CONNECT的IRP时候出了问题,哪位大侠能帮忙看看,谢谢!
在TDI_CONNECT的DISPATCHER例程中 WorkItem = ExAllocatePoolWithTag(......); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine( Irp, TdiConnectComplete, WorkItem, TRUE, TRUE, TRUE); Status = IoCallDriver(DeviceExtension->LowerDeviceObject, Irp); return Status; 在完成例程中 ExInterlockedInsertTailList(......); // 将workitem放入到一个post processing 队列中 KeSetEvent(&QueueEvent, IO_NO_INCREMENT, FALSE); // 设置队列事件对象 return STATUS_MORE_PROCESSING_REQUIRED; 在自己开的处理线程中 dequeue(workitem); IoCompleteRequest(Irp, IO_NO_INCREMENT); // complete irp ExFreePoolWithTag(......); // free workitem 然后我写了一个小程序来测试。发觉目标ip能够连接成功的情况下,connect能正常返回。但是 在连不通的情况下,就死在connect函数那儿了。。。 还有,对于连接成功的情况下,如果我做了一些额外处理,这些处理返回了失败。 我想让原始的IRP也失败,因此设置了Irp->IoStatus.Status = xxx(失败代码), 再调用IoComplete,然后也不行了。。。 |
|