kok5168
驱动牛犊
驱动牛犊
  • 注册日期2010-03-07
  • 最后登录2010-06-06
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望211点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2621回复:2

我哭!!passthru里的MPSendPackets里头 为什么一直返回NDIS_STATUS_PENDING?

楼主#
更多 发布于:2010-04-18 11:00
passthru里的MPSendPackets里头 为什么一直返回NDIS_STATUS_PENDING?   帮帮小生啊,小生感激不尽!!!!!VOID
MPSendPackets(
    IN NDIS_HANDLE             MiniportAdapterContext,
    IN PPNDIS_PACKET           PacketArray,
    IN UINT                    NumberOfPackets
    )
{
    PADAPT              pAdapt = (PADAPT)MiniportAdapterContext;
    NDIS_STATUS         Status;
    UINT                i;
    PVOID               MediaSpecificInfo = NULL;
    UINT                MediaSpecificInfoSize = 0;
    
    

    for (i = 0; i < NumberOfPackets; i++)
    {
        PNDIS_PACKET    Packet, MyPacket;

        Packet = PacketArray;
        if (pAdapt->MPDeviceState > NdisDeviceStateD0)
        {
            NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                            Packet,
                            NDIS_STATUS_FAILURE);
            continue;
        }

        do
        {
            NdisAcquireSpinLock(&pAdapt->Lock);
            if (pAdapt->PTDeviceState > NdisDeviceStateD0)
            {
                NdisReleaseSpinLock(&pAdapt->Lock);
                Status = NDIS_STATUS_FAILURE;
                break;
            }
            pAdapt->OutstandingSends++;
            NdisReleaseSpinLock(&pAdapt->Lock);
            
            NdisAllocatePacket(&Status,
                               &MyPacket,
                               pAdapt->SendPacketPoolHandle);

            if (Status == NDIS_STATUS_SUCCESS)
            {
                    PSEND_RSVD        SendRsvd;
                    SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved);
                    SendRsvd->OriginalPkt = Packet;

                    if (BuildMyPacket(pAdapt, Packet, MyPacket) == FALSE)
                    {
                        SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved);
                        SendRsvd->OriginalPkt = Packet;

                        NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);

                        NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet);
                        NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet);

                        NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket),
                                    NDIS_OOB_DATA_FROM_PACKET(Packet),
                                    sizeof(NDIS_PACKET_OOB_DATA));

                        NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet,
                                                            &MediaSpecificInfo,
                                                            &MediaSpecificInfoSize);

                        if (MediaSpecificInfo || MediaSpecificInfoSize)
                        {
                            NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket,
                                                                MediaSpecificInfo,
                                                                MediaSpecificInfoSize);
                        }
                        // 如果处理失败,则把原始的包信息Copy到MyPacket。
                        // 这是为了在处理失败的情况下,也让原始的信息能发出去。
                        NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet);
                        NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet);
                    }
                    NdisSend(&Status,
                         pAdapt->BindingHandle,
                         MyPacket);
            
                if (Status != NDIS_STATUS_PENDING)
                {
                    DbgPrint("===============> is not NDIS_STATUS_PENDING.................!!.<===============\n");
                    DestroyMyPacket(MyPacket);
                    NdisFreePacket(MyPacket);
                    ADAPT_DECR_PENDING_SENDS(pAdapt);
                }else
                {
                    DbgPrint("===============>  NDIS_STATUS_PENDING.................!!.<===============\n");
                }
            }
            else
            {
                ADAPT_DECR_PENDING_SENDS(pAdapt);
            }
        }
        while (FALSE);

        if (Status != NDIS_STATUS_PENDING)
        {
            NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                              Packet,
                              Status);
        }else
        {
            DbgPrint("===============>  NDIS_STATUS_PENDING.................!!.<===============\n");
        }
    }
}
vincent_1011
驱动牛犊
驱动牛犊
  • 注册日期2009-03-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-04-19 10:35
我也正在搞个ARP数据包的拦截,有兴趣一起研究,QQ5771067
liuguo0225
驱动牛犊
驱动牛犊
  • 注册日期2010-01-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-05-04 12:18
一直返回Penging 的,这很正常,在PtSendComplete中释放自己的包即可
游客

返回顶部