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