【问题标题】:TDI_RECEIVE request handlingTDI_RECEIVE 请求处理
【发布时间】:2013-05-07 22:38:59
【问题描述】:

我正在编写简单的 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 响应的第一块)?

【问题讨论】:

    标签: tcp kernel driver


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2013-09-06
      相关资源
      最近更新 更多