阅读:1885回复:3
NDIS中间层驱动中怎么发报文给本机?
我已经有了一个可以过滤出站和入站全部报文的NDIS中间层驱动,现在我需要在这个驱动中发个自己组建的报文给本机的某个端口。我先试了把这个自组报文的源IP、目的IP、源MAC、目的MAC都设置为本机的,TCP端口也相应设置,然后调用NdisSend发送(对PtSendComplete也进行了相应处理),结果这个驱动的过滤接收的函数并没报告收到了这个报文。然后我又试了不经过发送,直接调用NdisMIndicateReceivePacket试图叫上层接收,结果蓝屏。我想请教这两种方案哪个可行?应该怎么做才正确?我确认报文的各种头部都是正确的。至于SEQ和ACK,简单起见,我是用SYN报文做的实验。我是在局域网内。
|
|
沙发#
发布于:2012-12-24 11:06
用NdisMIndicateReceivePacket比较简单。
如果用NdisSend的话,必须保证那个网卡驱动够回传报文。具体规则我还不清楚,以前有个同事,他在中间层模拟发送一个保证,不希望报文往回传,但它反而会往协议层传。 这是我以前写的一个虚拟网卡驱动,收到writefile信息之后,往协议层传报文,节选代码: …… irpStack = IoGetCurrentIrpStackLocation(Irp); …… switch (irpStack->MajorFunction) { …… case IRP_MJ_WRITE: Irp->IoStatus.Information = irpStack->Parameters.Write.Length; NdisMEthIndicateReceive (aAdapter->AdapterHandle, (NDIS_HANDLE) aAdapter, (PCHAR) Irp->AssociatedIrp.SystemBuffer, ETH_HEADER_SIZE, (PCHAR) Irp->AssociatedIrp.SystemBuffer + ETH_HEADER_SIZE, irpStack->Parameters.Write.Length - ETH_HEADER_SIZE, irpStack->Parameters.Write.Length - ETH_HEADER_SIZE); NdisMEthIndicateReceiveComplete (aAdapter->AdapterHandle); Irp->IoStatus.Status = status = STATUS_SUCCESS; IoCompleteRequest (Irp, IO_NO_INCREMENT); return status; …… |
|
板凳#
发布于:2012-12-25 12:10
回 zhangfresh 的帖子
zhangfresh:用NdisMIndicateReceivePacket比较简单。 谢谢! |
|
地板#
发布于:2012-12-30 15:55
1 ndissend
2 indicate方法。 |
|
|