我正在编写简单的TDI过滤器驱动程序(嗯,我记得现在是2013年))。我需要检查HTTP回复的第一个块。所以我截取TDI_RECEIVE请求,设置我的完成例程,并将IRP转发给下一个驱动程序。在完成例程中,我想检查返回的块。
代码如下:
case TDI_RECEIVE:{
PVOID buf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress,HighPagePriority);
ULONG size = MmGetMdlByteCount(Irp->MdlAddress);
IoCopyCurrentIrpStackLocationToNext(Irp);
ntStatus = IoSetCompletionRoutineEx(MntrDevice,Irp,IoCompletion, NULL,TRUE,TRUE,TRUE);
break;
............................................................................
ntStatus = IoCallDriver ( NextDevice , Irp );
return ntStatus ;完成例程:
PVOID buf = MmGetSystemAddressForMdlSafe(irp->MdlAddress,HighPagePriority);
int size = Irp->IoStatus.Information;这很奇怪,但是只有一个TDI_RECEIVE请求的MD大约为3K,并且相应的完整IRP包含网页寻呼机的最后一块(即没有HTTP响应,没有页面开始)。而且我没有看到任何其他recv/read请求。
有什么建议吗?他们藏在哪里(实际上我每个TCP会话只需要第一个HTTP响应的第一个块)?
发布于 2013-05-07 22:38:59
你需要在设置TDI_EVENT_CHAINED_RECEIVE回调时使用make hook (实际上还有更多的回调,但是这个可以用)。在此回调中,您可以分析接收到的数据,然后调用原始回调。
https://stackoverflow.com/questions/16385289
复制相似问题