我们正在为 NDIS6 修改过滤器,它使用将原始数据包包装到自己的层协议中。
在添加我们自己的标头之前,我们调用 NdisRetreatNetBufferDataStart(pNetBuffer, sizeof(OurHeader), 0, NULL),假设 NDIS 将通过其“默认”函数自行分配额外的 MDL,如http://msdn.microsoft中所述.com/en-us/library/windows/hardware/ff570697%28v=vs.85%29.aspx(“如果入口点为 NULL,NDIS 使用默认方法分配 MDL。”)
我们注意 FilterSendNetBufferListsComplete 中的 NdisAdvanceNetBufferDataStart(pNetBuffer, sizeof(OurHeader), TRUE, NULL)。
但是,我们得到一个 BSOD DRIVER_IRQL_NOT_LESS_OR_EQUAL,这意味着从 IRQ 处理程序中访问了一些分页内存(读取操作,根据错误检查的第三个参数判断)。
我们怀疑我们的 RetratXxx 调用导致分配分页内存,并且在尝试发送该数据时被困微型端口?如果是这样,那是“默认”内存分配行为,在这种情况下我们应该如何调用 NdisRetreatNetBufferDataStart ?