0

我正在编写简单的 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包含WEB-pager的LAST chunk(即没有HTTP响应,没有页面开始)。而且我没有看到任何其他接收/读取请求。

有什么建议它们隐藏在哪里(实际上我只需要每个 TCP 会话的第一个 HTTP 响应的第一块)?

4

1 回答 1

0

您需要在设置 TDI_EVENT_CHAINED_RECEIVE 回调上挂上钩子(实际上还有更多回调,但这个有效)。在此回调中,您可以分析接收到的数据,然后调用原始回调。

于 2013-05-07T14:38:59.153 回答