阅读:1301回复:7
各位大侠请帮忙!关于在自定义函数中发自定义包的问题,30分酬谢!!
我在驱动程序中开了一个定时器,定时发送自定义的包,
我直接调用NdisMIndicateReceivePacket函数仿真网卡的动作,可是第一个参数 IN NDIS_HANDLE MiniportAdapterHandle该从哪里得到啊? |
|
沙发#
发布于:2003-07-18 13:22
从全局ADAPT里来
|
|
|
板凳#
发布于:2003-07-18 13:48
我现在就是这样做的,全局的adapt是从MPInitialize里得到的,可我执行下面一段程序会死机:
if((Seconds-LiveSeconds)>20)//如果>20秒 { NdisDprAllocatePacket(&Status, &MyPacket, MyAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { NdisAllocateBuffer(&Status, &pPacketBuffer, MyAdapt->RecvBufferPoolHandle, m_BufferSystemVirtualAddress, 54); if(Status == NDIS_STATUS_SUCCESS) { NdisChainBufferAtFront(MyPacket, pPacketBuffer); MyPacket->Private.Head->Next = NULL; MyPacket->Private.Tail = NULL; Rsvd=(PRSVD)(MyPacket->MiniportReserved); Rsvd->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE(MyPacket, 14); NdisMIndicateReceivePacket(MyAdapt->MiniportHandle, &MyPacket, 1); NdisFreeBuffer(pPacketBuffer); NdisDprFreePacket(MyPacket); } } 还有,如果执行NdisMIndicateReceivePacket函数时,返回的Status==NDIS_STATUS_PENDING时,那么程序分配的packet和buffer在哪里释放呢? |
|
地板#
发布于:2003-07-18 15:22
MPRETURNPACKET中
看样子哥们是定时向自己的机器提交ARP的包 建议你将包的长度改为60,将多余的6个字节用0X20补上 |
|
|
地下室#
发布于:2003-07-18 15:29
其实处理的流程是:
当你NdisMIndicateReceivePacket,NDIS调用PROTOCOLRECEIVEPACKET函数把包传了TCPIP.SYS,SYS得到包的数据后,告诉底层\"包我已经拿到了,你们把资源释放吧\",告诉底层的这个函数就是MPRETURNPACKET |
|
|
5楼#
发布于:2003-07-18 16:06
antspower:
我不太明白你两个回帖的意思, 1、“MPRETURNPACKET中”是指的释放包资源的函数? 2、不是定时发arp的包,是发rst包,自己组建的包,一定要补齐60 字节么? 3、我刚才又作试验,上面的代码一运行到 NdisMIndicateReceivePacket就死机,\"从MPInitialize里得到全 局的adapt\",我的思路是对的吧? :o |
|
6楼#
发布于:2003-07-18 17:03
1。你申请的所有资源应该在MPRETURNPAKCET中释放。
2。可能不要,但是我觉得加上没错吧,因为无论是什么到,只要是通过INTERNET到你的机器上,他就不可能少于60个字节。 所以我觉得如果你把数据交给上层的时候,最好是让他和网络上的一个样。 对了你的那个定时器调用NDISMINDICATEPACKET是在哪个函数中调用的? 你是参考的PASSTHRU吗? 如果是你可以用哪个ADAPT的全局链得到你要的ADAPT |
|
|
7楼#
发布于:2003-07-18 17:22
用softice看一下死在哪,再来说
|
|