阅读:1666回复:4
ndis协议驱动中的IRP处理
DDK自带的packet中
PacketWrite处理发送数据包的代码 ================================================== NdisSend(&Status, open->AdapterHandle, pPacket); if (Status != NDIS_STATUS_PENDING) { PacketSendComplete(open, pPacket, Status); } =================================================== 我不明白pending的时候需要自己调用IoCompleteRequest()?? PacketSendComplete()这个函数里调用了这个函数宣告IRP的完成 现在想到的可能的解释是NdisSend()自己又构造了一个IRP,让我称它为临时IRP, 将这个临时IRP发送下去后就看返回status,如果是pending就等,然后在某个时候该临时IRP被IoCompleteRequest宣告完成后,从等待的地方开始继续执行PacketSendComplete()来宣告原来的IRP的完成,如果返回不是pending,就直接返回给NdisSend(),所以我们才需要判断NdisSend返回过来的结果是不是pending,不是的话需要自己手工调用PacketSendComplete() 不过这样解释好象很勉强, NdisSend完全可以不管是不是pending都调用 PacketSendComplete啊,设置完成例程不就可以了么?? 请高人指点!! [编辑 - 3/20/04 by virmin] |
|
|
沙发#
发布于:2004-03-20 15:37
顶一下先,请高手们指点啊
|
|
|
板凳#
发布于:2004-03-22 11:30
是要重新又构造了一个IRP(不过叫PACKET更合适),根据NDIS的规则不PENDING的时候是不调用完成函数的,为了释放资源,就手工调用,也可以不调用,直接释放资源,并向上层说明发送已经完成,不过还是调用更方便。
|
|
地板#
发布于:2004-03-23 07:56
能介绍点ndis方面的书吗?
|
|
|
地下室#
发布于:2004-03-23 10:07
书好象没见过,看DDK吧
|
|