Tcp TDI_接收请求处理

Tcp TDI_接收请求处理,tcp,kernel,driver,Tcp,Kernel,Driver,我正在编写简单的TDI过滤器驱动程序(我记得现在是2013年)。我需要检查HTTP应答的第一块。所以我截取TDI_接收请求,设置完成例程,并将IRP转发给下一个驱动程序。在完成例行程序中,我想检查返回的块 代码如下: case TDI_RECEIVE:{ PVOID buf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress,HighPagePriority); ULONG size = MmGetM

我正在编写简单的TDI过滤器驱动程序(我记得现在是2013年)。我需要检查HTTP应答的第一块。所以我截取TDI_接收请求,设置完成例程,并将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_接收请求,其中一个MD约为3K,相应的完整IRP包含网页寻呼机的最后一块(即没有HTTP响应,没有页面开始)。我没有看到任何其他recv/read请求


任何关于它们隐藏在哪里的建议(实际上,每个TCP会话我只需要第一个HTTP响应的第一块)?

您需要在set TDI\u EVENT\u CHAINED\u RECEIVE callback上设置钩子(实际上有更多回调,但这一个有效)。在此回调中,您可以分析接收到的数据,然后调用原始回调