亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? protocol.c

?? NDIS Intermediate Driver
?? C
?? 第 1 頁 / 共 4 頁
字號:
    PADAPT            pAdapt  =(PADAPT)ProtocolBindingContext;
    NDIS_STATUS       Status  = NDIS_STATUS_SUCCESS;

    DBGPRINT(("PtPnPHandler: Adapt %p, Event %d\n", pAdapt, pNetPnPEvent->NetEvent));

    switch (pNetPnPEvent->NetEvent)
    {
        case NetEventSetPower:
            Status = PtPnPNetEventSetPower(pAdapt, pNetPnPEvent);
            break;

         case NetEventReconfigure:
            Status = PtPnPNetEventReconfigure(pAdapt, pNetPnPEvent);
            break;

         default:
#ifdef NDIS51
            //
            // Pass on this notification to protocol(s) above, before
            // doing anything else with it.
            //
            if (pAdapt && pAdapt->MiniportHandle)
            {
                Status = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent);
            }
#else
            Status = NDIS_STATUS_SUCCESS;

#endif // NDIS51

            break;
    }

    return Status;
}


NDIS_STATUS
PtPnPNetEventReconfigure(
    IN PADAPT            pAdapt,
    IN PNET_PNP_EVENT    pNetPnPEvent
    )
/*++
Routine Description:

    This routine is called from NDIS to notify our protocol edge of a
    reconfiguration of parameters for either a specific binding (pAdapt
    is not NULL), or global parameters if any (pAdapt is NULL).

Arguments:

    pAdapt - Pointer to our adapter structure.
    pNetPnPEvent - the reconfigure event

Return Value:

    NDIS_STATUS_SUCCESS

--*/
{
    NDIS_STATUS    ReconfigStatus = NDIS_STATUS_SUCCESS;
    NDIS_STATUS    ReturnStatus = NDIS_STATUS_SUCCESS;

    do
    {
        //
        // Is this is a global reconfiguration notification ?
        //
        if (pAdapt == NULL)
        {
            //
            // An important event that causes this notification to us is if
            // one of our upper-edge miniport instances was enabled after being
            // disabled earlier, e.g. from Device Manager in Win2000. Note that
            // NDIS calls this because we had set up an association between our
            // miniport and protocol entities by calling NdisIMAssociateMiniport.
            //
            // Since we would have torn down the lower binding for that miniport,
            // we need NDIS' assistance to re-bind to the lower miniport. The
            // call to NdisReEnumerateProtocolBindings does exactly that.
            //
            NdisReEnumerateProtocolBindings (ProtHandle);        
            break;
        }

#ifdef NDIS51
        //
        // Pass on this notification to protocol(s) above before doing anything
        // with it.
        //
        if (pAdapt->MiniportHandle)
        {
            ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent);
        }
#endif // NDIS51

        ReconfigStatus = NDIS_STATUS_SUCCESS;

    } while(FALSE);

    DBGPRINT(("<==PtPNPNetEventReconfigure: pAdapt %p\n", pAdapt));

#ifdef NDIS51
    //
    // Overwrite status with what upper-layer protocol(s) returned.
    //
    ReconfigStatus = ReturnStatus;
#endif

    return ReconfigStatus;
}


NDIS_STATUS
PtPnPNetEventSetPower(
    IN PADAPT            pAdapt,
    IN PNET_PNP_EVENT    pNetPnPEvent
    )
/*++
Routine Description:

    This is a notification to our protocol edge of the power state
    of the lower miniport. If it is going to a low-power state, we must
    wait here for all outstanding sends and requests to complete.

    NDIS 5.1:  Since we use packet stacking, it is not sufficient to
    check usage of our local send packet pool to detect whether or not
    all outstanding sends have completed. For this, use the new API
    NdisQueryPendingIOCount.

    NDIS 5.1: Use the 5.1 API NdisIMNotifyPnPEvent to pass on PnP
    notifications to upper protocol(s).

Arguments:

    pAdapt            -    Pointer to the adpater structure
    pNetPnPEvent    -    The Net Pnp Event. this contains the new device state

Return Value:

    NDIS_STATUS_SUCCESS or the status returned by upper-layer protocols.

--*/
{
    PNDIS_DEVICE_POWER_STATE       pDeviceState  =(PNDIS_DEVICE_POWER_STATE)(pNetPnPEvent->Buffer);
    NDIS_DEVICE_POWER_STATE        PrevDeviceState = pAdapt->PTDeviceState;  
    NDIS_STATUS                    Status;
    NDIS_STATUS                    ReturnStatus;
#ifdef NDIS51
    ULONG                          PendingIoCount = 0;
#endif // NDIS51

    ReturnStatus = NDIS_STATUS_SUCCESS;

    //
    // Set the Internal Device State, this blocks all new sends or receives
    //
    NdisAcquireSpinLock(&pAdapt->Lock);
    pAdapt->PTDeviceState = *pDeviceState;

    //
    // Check if the miniport below is going to a low power state.
    //
    if (pAdapt->PTDeviceState > NdisDeviceStateD0)
    {
        //
        // If the miniport below is going to standby, fail all incoming requests
        //
        if (PrevDeviceState == NdisDeviceStateD0)
        {
            pAdapt->StandingBy = TRUE;
        }

        NdisReleaseSpinLock(&pAdapt->Lock);

#ifdef NDIS51
        //
        // Notify upper layer protocol(s) first.
        //
        if (pAdapt->MiniportHandle != NULL)
        {
            ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent);
        }
#endif // NDIS51

        //
        // Wait for outstanding sends and requests to complete.
        //
        while (pAdapt->OutstandingSends != 0)
        {
            NdisMSleep(2);
        }

        while (pAdapt->OutstandingRequests == TRUE)
        {
            //
            // sleep till outstanding requests complete
            //
            NdisMSleep(2);
        }

        //
        // If the below miniport is going to low power state, complete the queued request
        //
        NdisAcquireSpinLock(&pAdapt->Lock);
        if (pAdapt->QueuedRequest)
        {
            pAdapt->QueuedRequest = FALSE;
            NdisReleaseSpinLock(&pAdapt->Lock);
            PtRequestComplete(pAdapt, &pAdapt->Request, NDIS_STATUS_FAILURE);
        }
        else
        {
            NdisReleaseSpinLock(&pAdapt->Lock);
        }
            

        ASSERT(NdisPacketPoolUsage(pAdapt->SendPacketPoolHandle) == 0);
        ASSERT(pAdapt->OutstandingRequests == FALSE);
    }
    else
    {
        //
        // If the physical miniport is powering up (from Low power state to D0), 
        // clear the flag
        //
        if (PrevDeviceState > NdisDeviceStateD0)
        {
            pAdapt->StandingBy = FALSE;
        }
        //
        // The device below is being turned on. If we had a request
        // pending, send it down now.
        //
        if (pAdapt->QueuedRequest == TRUE)
        {
            pAdapt->QueuedRequest = FALSE;
        
            pAdapt->OutstandingRequests = TRUE;
            NdisReleaseSpinLock(&pAdapt->Lock);

            NdisRequest(&Status,
                        pAdapt->BindingHandle,
                        &pAdapt->Request);

            if (Status != NDIS_STATUS_PENDING)
            {
                PtRequestComplete(pAdapt,
                                  &pAdapt->Request,
                                  Status);
                
            }
        }
        else
        {
            NdisReleaseSpinLock(&pAdapt->Lock);
        }


#ifdef NDIS51
        //
        // Pass on this notification to protocol(s) above
        //
        if (pAdapt->MiniportHandle)
        {
            ReturnStatus = NdisIMNotifyPnPEvent(pAdapt->MiniportHandle, pNetPnPEvent);
        }
#endif // NDIS51

    }

    return ReturnStatus;
}

VOID
PtQueueReceivedPacket(
    IN PADAPT       pAdapt,
    IN PNDIS_PACKET Packet,
    IN BOOLEAN      DoIndicate
    )
/*++

Routine Description:

    This is to queue the received packets and indicates them up if the given Packet
    status is NDIS_STATUS_RESOURCES, or the array is full.

Arguments:

    pAdapt   -    Pointer to the adpater structure.
    Packet   -    Pointer to the indicated packet.
    DoIndicate -  Do the indication now.
    
Return Value:

    None.
    
--*/
{
    PNDIS_PACKET    PacketArray[MAX_RECEIVE_PACKET_ARRAY_SIZE];
    ULONG           NumberOfPackets = 0, i;
    
    NdisDprAcquireSpinLock(&pAdapt->Lock);
    ASSERT(pAdapt->ReceivedPacketCount < MAX_RECEIVE_PACKET_ARRAY_SIZE);

    //
    // pAdapt->ReceviePacketCount must be less than MAX_RECEIVE_PACKET_ARRAY_SIZE because
    // the thread which held the pVElan->Lock before should already indicate the packet(s) 
    // up if pAdapt->ReceviePacketCount == MAX_RECEIVE_PACKET_ARRAY_SIZE.
    // 
    pAdapt->ReceivedPackets[pAdapt->ReceivedPacketCount] = Packet;
    pAdapt->ReceivedPacketCount++;

    // 
    //  If our receive packet array is full, or the miniport below indicated the packets
    //  with resources, do the indicatin now.
    //  
    if ((pAdapt->ReceivedPacketCount == MAX_RECEIVE_PACKET_ARRAY_SIZE) || DoIndicate)
    {
        NdisMoveMemory(PacketArray,
                       pAdapt->ReceivedPackets,
                       pAdapt->ReceivedPacketCount * sizeof(PNDIS_PACKET));

        NumberOfPackets = pAdapt->ReceivedPacketCount;
        //
        // So other thread can queue the received packets
        //
        pAdapt->ReceivedPacketCount = 0;
               
        NdisDprReleaseSpinLock(&pAdapt->Lock);

        //
        // Here the driver checks if the miniport adapter is in lower power state, do not indicate the 
        // packets, but the check does not close the window, it only minimizes the window. To close
        // the window completely, we need to add synchronization in the receive code path; because 
        // NDIS can handle the case that miniport drivers indicate packets in lower power state,
        // we don't add the synchronization in the hot code path.
        //    
        if ((pAdapt->MiniportHandle != NULL) 
                && (pAdapt->MPDeviceState == NdisDeviceStateD0))
        {
                
            NdisMIndicateReceivePacket(pAdapt->MiniportHandle, PacketArray, NumberOfPackets);
        }
        else
        {
            if (DoIndicate)
            {
                NumberOfPackets  -= 1;
            }
            for (i = 0; i < NumberOfPackets; i++)
            {
                MPReturnPacket(pAdapt, PacketArray[i]);
            }
        }

    }
    else
    {
        NdisDprReleaseSpinLock(&pAdapt->Lock);
    }
                    
}

VOID
PtFlushReceiveQueue(
    IN PADAPT         pAdapt
    )
/*++

Routine Description:

    This routine process the queued the packet, if anything is fine, indicate the packet 
    up, otherwise, return the packet to the underlying miniports.

Arguments:

    pAdapt   -    Pointer to the adpater structure.
    
Return Value:

    None.
*/    
{

    PNDIS_PACKET  PacketArray[MAX_RECEIVE_PACKET_ARRAY_SIZE];
    ULONG         NumberOfPackets = 0, i;

    do
    {
        NdisDprAcquireSpinLock(&pAdapt->Lock);

        if (pAdapt->ReceivedPacketCount > 0)
        {
            NdisMoveMemory(PacketArray,
                            pAdapt->ReceivedPackets,
                            pAdapt->ReceivedPacketCount * sizeof(PNDIS_PACKET));

            NumberOfPackets = pAdapt->ReceivedPacketCount;
            //
            // So other thread can queue the received packets
            //
            pAdapt->ReceivedPacketCount = 0;

            NdisDprReleaseSpinLock(&pAdapt->Lock);
               
            //
            // Here the driver checks if the miniport adapter is in lower power state, do not indicate the 
            // packets, but the check does not close the window, it only minimizes the window. To close
            // the window completely, we need to add synchronization in the receive code path; because 
            // NDIS can handle the case that miniport drivers indicate packets in lower power state,
            // we don't add the synchronization in the hot code path.
            //    
            if ((pAdapt->MiniportHandle)
                    && (pAdapt->MPDeviceState == NdisDeviceStateD0))
            {
                NdisMIndicateReceivePacket(pAdapt->MiniportHandle, 
                                           PacketArray, 
                                           NumberOfPackets);
                break;
            }
            //
            // We need return the packet here
            // 
            for (i = 0; i < NumberOfPackets; i ++)
            {
                MPReturnPacket(pAdapt, PacketArray[i]);
            }
            break;
        }
        
        NdisDprReleaseSpinLock(&pAdapt->Lock);
        
    
    } while (FALSE);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久97三级| 精品视频资源站| 久久嫩草精品久久久久| 久久99精品久久久久久久久久久久| 欧美高清激情brazzers| 日韩成人精品在线| 日韩免费一区二区| 国产成人久久精品77777最新版本| 久久精品在线免费观看| av激情亚洲男人天堂| 亚洲女子a中天字幕| 欧美日韩精品专区| 激情综合色播激情啊| 中文字幕va一区二区三区| 99久久99久久综合| 午夜精品久久久久久不卡8050| 欧美一区二区三区人| 国产不卡视频在线播放| 亚洲日本在线视频观看| 欧美精品色一区二区三区| 国产麻豆精品95视频| 亚洲人成网站影音先锋播放| 91.麻豆视频| 粉嫩嫩av羞羞动漫久久久| 亚洲午夜激情av| 26uuu国产在线精品一区二区| 93久久精品日日躁夜夜躁欧美| 婷婷久久综合九色综合伊人色| 久久日韩精品一区二区五区| 91极品视觉盛宴| 久久国产综合精品| 亚洲色图在线看| 精品国产麻豆免费人成网站| 91蜜桃网址入口| 六月丁香婷婷久久| 夜夜精品视频一区二区| 欧美电视剧免费全集观看| 91麻豆国产在线观看| 另类小说视频一区二区| 一级日本不卡的影视| 久久婷婷国产综合国色天香| 欧美撒尿777hd撒尿| 成人性生交大片免费| 秋霞国产午夜精品免费视频| 亚洲婷婷在线视频| 久久免费偷拍视频| 欧美日韩亚州综合| 97久久超碰国产精品| 国产精品亚洲第一| 日本系列欧美系列| 亚洲愉拍自拍另类高清精品| 欧美国产日韩一二三区| 欧美大尺度电影在线| 欧美日韩视频在线观看一区二区三区 | 精品国产一二三| 在线看国产日韩| 成人午夜免费av| 久久精品国产亚洲一区二区三区 | 精品美女一区二区| 91精品福利视频| 99热这里都是精品| 高清成人免费视频| 国产一区二区三区久久久| 免费成人在线影院| 日韩av不卡在线观看| 91亚洲资源网| 黄色日韩三级电影| 麻豆国产精品官网| 日本不卡高清视频| 日本vs亚洲vs韩国一区三区二区 | 欧美三级电影精品| 91福利国产精品| 91在线观看污| 波多野结衣一区二区三区| 国产凹凸在线观看一区二区| 国产一区二区不卡老阿姨| 久久99精品久久久久久久久久久久| 免费看欧美女人艹b| 日韩av一二三| 免费人成在线不卡| 久久精品99国产国产精| 久久精品免费看| 久久 天天综合| 国产剧情一区二区| 成人激情黄色小说| 91亚洲国产成人精品一区二区三| 97se亚洲国产综合自在线观| 色又黄又爽网站www久久| 91蜜桃传媒精品久久久一区二区| 色哟哟欧美精品| 欧美日韩视频在线第一区| 欧美电影一区二区三区| 日韩欧美国产综合| 久久久一区二区| 国产精品网站在线| 亚洲美女免费在线| 婷婷丁香激情综合| 精品在线亚洲视频| 成人性生交大片免费看视频在线| 99re这里都是精品| 欧美日韩精品久久久| 欧美成人欧美edvon| 中文字幕欧美激情一区| 亚洲另类春色校园小说| 亚洲综合久久久久| 精品一区二区三区免费| 波多野结衣中文字幕一区| 欧美性猛交xxxx乱大交退制版| 56国语精品自产拍在线观看| 久久尤物电影视频在线观看| 亚洲欧洲成人自拍| 首页国产欧美日韩丝袜| 国产精品一区二区不卡| 在线亚洲高清视频| 精品国产乱码久久久久久久久| 国产精品家庭影院| 日韩不卡一区二区三区| 粉嫩一区二区三区在线看| 欧美色图在线观看| 久久女同精品一区二区| 一区二区三区丝袜| 精品无码三级在线观看视频| 一本一本久久a久久精品综合麻豆| 3atv在线一区二区三区| 国产精品美女视频| 美国一区二区三区在线播放| 91在线视频官网| 日韩精品中文字幕在线不卡尤物| 亚洲视频每日更新| 国产真实乱对白精彩久久| 欧美做爰猛烈大尺度电影无法无天| 精品乱人伦小说| 亚洲va欧美va人人爽| 成人激情动漫在线观看| 日韩欧美一卡二卡| 亚洲成人激情自拍| 99久久精品免费观看| 欧美精品一区二区三区视频| 亚洲成人高清在线| 97国产一区二区| 国产欧美一区视频| 蜜臀av性久久久久蜜臀aⅴ | 激情综合亚洲精品| 欧美日韩国产精选| 亚洲美女偷拍久久| 成人a免费在线看| 久久久亚洲欧洲日产国码αv| 日韩中文字幕亚洲一区二区va在线| 99亚偷拍自图区亚洲| 国产亚洲一区二区三区在线观看| 日韩av一级电影| 欧美在线三级电影| 国产精品国产三级国产三级人妇 | 国产精品成人在线观看| 加勒比av一区二区| 日韩一区二区视频| 日本亚洲一区二区| 欧美高清你懂得| 五月激情综合色| 欧美主播一区二区三区美女| 中文字幕人成不卡一区| 成人av电影观看| 国产精品天天摸av网| 国产成人av在线影院| 国产喂奶挤奶一区二区三区| 国产在线精品免费| 久久久午夜电影| 国产一区二区电影| 久久久久久免费毛片精品| 国产精品一区二区在线播放| 国产亚洲欧洲997久久综合 | 欧美剧情电影在线观看完整版免费励志电影 | caoporm超碰国产精品| 中文字幕第一区综合| 成人aa视频在线观看| 1区2区3区欧美| 91久久精品一区二区三| 亚洲成人一区在线| 欧美一区二区三区在线观看| 免费av成人在线| 日韩欧美第一区| 国产美女av一区二区三区| 欧美激情综合五月色丁香小说| 国产成人免费在线视频| 国产精品五月天| 91精品1区2区| 日本不卡高清视频| 久久无码av三级| 91在线观看一区二区| 亚洲最大成人综合| 日韩午夜三级在线| 国产一区二区三区日韩| 国产精品福利av| 欧美另类变人与禽xxxxx| 精品在线一区二区| 亚洲欧洲成人自拍| 欧美电影在哪看比较好| 国产伦精品一区二区三区视频青涩| 国产精品福利av| 91精品国产一区二区人妖|