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

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

?? recvlist.cpp

?? 收集到的orion_ep93xx_wince_bsp_1-3-507紅外收發驅動源碼,未作測試
?? CPP
字號:
//**********************************************************************
//                                                                      
// Filename: recvlist.cpp
//                                                                      
// Description: Recieve Packet list.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
// Copyright(c) Cirrus Logic Corporation 2001, All Rights Reserved                       
//                                                                      
//**********************************************************************

#include <windows.h>
extern "C"
{
    #include <ndis.h>
    #include <ntddndis.h>
}    
#include <linklist.h>
#include <ceddk.h>
#include "settings.h"
#include "debugzone.h"
#include "recvlist.h"
#include "sirstate.h"
#include "irdahw.h"
//#include "miniport.h"



//****************************************************************************
// ReceiveList::ReceiveList
//****************************************************************************
// Constructor to Initialize the ReceiveList.
// 
//

ReceiveList::ReceiveList(NDIS_HANDLE hNdisAdapter):
    m_hPacketPool(0),
    m_hBufferPool(0),
    m_hNdisAdapter(hNdisAdapter)
{
}


//****************************************************************************
// ReceiveList::Initialize
//****************************************************************************
// Initialize the recieve list.
// 
//
NDIS_STATUS     ReceiveList::Initialize()
{
    NDIS_STATUS     status;
    ULONG           i;
    
    //
    // Initialize the list head.
    //
    InitializeListHead(&m_FreeList);
    InitializeListHead(&m_PendingList);
    
    //
    // Initialize the Critical Section to protect the recieve list.
    //
    InitializeCriticalSection(&m_CritSection);
    
    //
    // Allocate memory for the Recieve Packets.
    // I am not exactly clear why we have to allocate this memory.
    //
    NdisAllocatePacketPool
    (
        &status, 
        &m_hPacketPool,
        NUM_RX_BUFFERS,
        16
    );

    //
    // Allocate the Ndis buffer pool.
    //
    if (status == NDIS_STATUS_SUCCESS)
    {
        NdisAllocateBufferPool
        (
            &status,
            &m_hBufferPool,
            NUM_RX_BUFFERS
        );
    }


    //
    // Allocate each packet from the pool allocated above.
    //    
    if(status == NDIS_STATUS_SUCCESS)
    {
        for (i = 0; i < NUM_RX_BUFFERS; i++)
        {
            PRX_BUFFER   pRxBuf;
            PNDIS_BUFFER pNdisBuffer;
            
            //
            // Allocate memory for each recieve structure.
            //
            pRxBuf  = (PRX_BUFFER) LocalAlloc
            (
                LMEM_FIXED | LMEM_ZEROINIT, 
                MAX_IRDA_DATA_SIZE
            );                
            
            //
            // Break out of the loop if we can't allocate the memory.
            //
            if(pRxBuf == 0 )
            {   
                status = NDIS_STATUS_RESOURCES;
                break;
            }
                        
            //
            // Initialize the recieve buffers structure.
            //
            pRxBuf->pbBuffer = (LPBYTE)pRxBuf + sizeof(RX_BUFFER);
            pRxBuf->cbBuffer = RX_BUFFER_SIZE;
            pRxBuf->cbData   = 0;

            //
            // Allocate a Recieve Packet.
            //
            NdisAllocatePacket
            (
                &status,
                &pRxBuf->pPacket,
                m_hPacketPool
            );

            if (status != NDIS_STATUS_SUCCESS)
            {
                NdisFreePacket(pRxBuf->pPacket);
                break;
            }
            
            
            //
            // Allocate a DMA buffer that is non paged.
            // Probably could use the normal memory allocation functions.
            //
            NdisAllocateBuffer
            (
                &status,
                &pNdisBuffer,
                m_hBufferPool,
                pRxBuf->pbBuffer,
                pRxBuf->cbBuffer
            );
            if (status != NDIS_STATUS_SUCCESS)
            {
                NdisFreeBuffer(pNdisBuffer);
                break;
            }
            
            //
            // Chain buffer to packet.
            //
            NdisChainBufferAtFront(pRxBuf->pPacket, pNdisBuffer);

            //
            // Put on free list.
            //
            InsertTailList( &m_FreeList, (LIST_ENTRY *)pRxBuf);
        }
    }
    
    return status;
}


//****************************************************************************
// ReceiveList::~ReceiveList
//****************************************************************************
// Delete the lists
// 
//
ReceiveList::~ReceiveList()
{
    PRX_BUFFER  pRxBuf;

    //
    // Delete the list 
    //
    while(!IsListEmpty(&m_FreeList))
    {
        pRxBuf = (RX_BUFFER *)RemoveTailList(&m_FreeList);
        LocalFree(pRxBuf);
    }    
    
    //
    // Free the buffer pool.
    //
    NdisFreeBufferPool(m_hBufferPool);
    NdisFreePacketPool(m_hPacketPool);
}

//****************************************************************************
// ReceiveList::GetFree
//****************************************************************************
// Get the first NDIS Packet on the free list.
// 
//
PRX_BUFFER  ReceiveList::GetFree()
{
    PNDIS_PACKET_OOB_DATA pOobData;
    PNDIS_BUFFER          pNdisBuffer;
    PRX_BUFFER            pRxBuf;
        
    //
    // Get the first item in the list.
    //
    EnterCriticalSection(&m_CritSection);
    pRxBuf = (PRX_BUFFER)RemoveHeadList (&m_FreeList);
    LeaveCriticalSection(&m_CritSection);

    if (pRxBuf != NULL)
    {
        //
        // Zero data buffer.
        //
        ZeroMemory(pRxBuf->pbBuffer, pRxBuf->cbBuffer);

        //    
        // Zero OOB data in packet.
        //
        pOobData = NDIS_OOB_DATA_FROM_PACKET(pRxBuf->pPacket);
        ASSERT(pOobData);
        
        ZeroMemory(pOobData, sizeof(NDIS_PACKET_OOB_DATA));
    
        //
        // Reset packet/buffer size.
        //
        NdisQueryPacket(pRxBuf->pPacket, NULL, NULL, &pNdisBuffer, NULL);
        NdisAdjustBufferLength(pNdisBuffer, pRxBuf->cbBuffer);
        pRxBuf->cbData = 0;

        //
        // This forces NdisQueryPacket to recalculate #packets and #bytes.
        //
        pRxBuf->pPacket->Private.ValidCounts = FALSE;
    }
    
    return (pRxBuf);
}

//****************************************************************************
// ReceiveList::ReturnBuffer
//****************************************************************************
// Returns a Recieve Buffer to the Free list.
// 
//
void ReceiveList::ReturnBuffer
(
    PRX_BUFFER pRxBuf
)
{
    EnterCriticalSection(&m_CritSection);
    InsertTailList ( &m_FreeList,  pRxBuf);
    LeaveCriticalSection(&m_CritSection);
}    


//****************************************************************************
// ReceiveList::AddPendingBuffer
//****************************************************************************
// Add a receive buffer to the pending queue.
// 
//
void ReceiveList::AddPendingBuffer
(
    PRX_BUFFER      pRxBuf
)
{
    EnterCriticalSection(&m_CritSection);
    InsertTailList(&m_PendingList, pRxBuf );
    LeaveCriticalSection(&m_CritSection);
}


//****************************************************************************
// ReceiveList::RemovePendingBuffer
//****************************************************************************
// Removes a receive buffer from the pending queue, based
// on the associated NDIS_PACKET address.
//
PRX_BUFFER  ReceiveList::RemovePendingBuffer
(
    PNDIS_PACKET pNdisPacket
)
{
    PRX_BUFFER  pRxBuf;
    PLIST_ENTRY pEntry;

    //
    // Protect the list.
    //
    EnterCriticalSection(&m_CritSection);
    
    for (pEntry = m_PendingList.Flink;
         pEntry != &m_PendingList;
         pEntry = pEntry->Flink
         )
    {
        pRxBuf = (PRX_BUFFER)pEntry;

        if (pRxBuf->pPacket == pNdisPacket)
        {
            RemoveEntryList(pEntry);
            break;
        }
    }


    LeaveCriticalSection(&m_CritSection);
    return (pRxBuf);    
}


//****************************************************************************
// ReceiveList::ProcessFrame
//****************************************************************************
// Performs the necessary processing after a frame has been processed.
// 
//
NDIS_STATUS ReceiveList::ProcessFrame
(
    PRX_BUFFER pRxBuf
)
{
    NDIS_HANDLE     hSwitchToMiniport = 0;
    PNDIS_BUFFER    pNdisBuffer;
    BOOL            fSwitchSuccessful;
    NDIS_STATUS     status;

    //
    // Adjust buffer size to actual size of data and not size of the
    // buffer.
    //
    NdisQueryPacket(pRxBuf->pPacket, NULL, NULL, &pNdisBuffer, NULL);
    NdisAdjustBufferLength(pNdisBuffer, pRxBuf->cbData);

    //
    // This forces NdisQueryPacket to recalculate #packets and #bytes.
    //
    pRxBuf->pPacket->Private.ValidCounts = FALSE;

    //
    // Put receive buffer on pending queue before we indicate to the
    // protocol, just in case the protocol can somehow call
    // NdisReturnPacket before we queue it. If the protocol returns
    // the packet immediately, we will just dequeue.
    //
    EnterCriticalSection(&m_CritSection);
    InsertTailList( &m_PendingList,  pRxBuf  );
    LeaveCriticalSection(&m_CritSection);

    //
    // Since this is an intermediate miniport, we must call
    // NdisIMSwitchToMiniport to grab the miniport lock.
    //
    fSwitchSuccessful = NdisIMSwitchToMiniport
    (
        m_hNdisAdapter,
        &hSwitchToMiniport
    );

    if (fSwitchSuccessful == FALSE)
    {
        // WinCE's NdisIMSwitchToMiniport should not fail.
        ASSERT(FALSE);
    }

    NdisMIndicateReceivePacket
    (
        m_hNdisAdapter,
        &pRxBuf->pPacket,
        1
    );

    status = NDIS_GET_PACKET_STATUS(pRxBuf->pPacket);

    if (status != NDIS_STATUS_PENDING)
    {
        //
        // Remove the item from the pending list.
        //
        RemoveEntryList(pRxBuf);

        DEBUGMSG(ZONE_RECV,
                 (TEXT("    Removing packet from pending queue.\r\n")));
        
        //
        // Add the item back into the free list.
        //
        EnterCriticalSection(&m_CritSection);
        InsertTailList(&m_FreeList, pRxBuf);
        LeaveCriticalSection(&m_CritSection);
        pRxBuf = NULL;
    }
    else
    {
        // Protocol has retained ownership of packet. The miniport
        // will regain ownership when IrsirReturnPacket is called.

        DEBUGMSG(ZONE_RECV,
                 (TEXT("    Protocol has retained ownership of packet 0x%.8X.\r\n"),
                  pRxBuf->pPacket)
                 );
        pRxBuf = NULL;
    }

    //
    // Undo the call to NdisIMSwitchToMiniport.
    //
    if(hSwitchToMiniport)
    {
        NdisIMRevertBack(m_hNdisAdapter, hSwitchToMiniport);
    }
    return(status);
}

//****************************************************************************
// ReceiveList::Reset
//****************************************************************************
// Moves all pending buffers and moves them to the free list.
// Occurs when MiniportReset is called.
// 
//
void  ReceiveList::Reset()
{
    PRX_BUFFER  pBuffer;
    
    
    EnterCriticalSection(&m_CritSection);
    
    for(;;)
    {
        pBuffer = (PRX_BUFFER) RemoveHeadList(&m_PendingList);
        if(!pBuffer)
            break;
        InsertTailList(&m_FreeList, pBuffer);
    }
    
    LeaveCriticalSection(&m_CritSection);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美一级片| 精品一区二区三区不卡| 91日韩在线专区| 中文字幕在线不卡| 97久久精品人人爽人人爽蜜臀| 国产精品女主播av| 91视频91自| 亚洲第一激情av| 91精品中文字幕一区二区三区| 美国一区二区三区在线播放| 久久先锋影音av| av毛片久久久久**hd| 一区二区三区小说| 日韩网站在线看片你懂的| 国产一区二区福利视频| 日韩一区欧美小说| 在线不卡中文字幕| 欧美精品久久久久久久多人混战| 国产成人精品亚洲777人妖| 日韩欧美亚洲另类制服综合在线| 久久国产麻豆精品| 国产欧美精品一区二区色综合朱莉 | 色哟哟在线观看一区二区三区| 亚洲免费看黄网站| 日韩免费成人网| 成人av电影在线| 秋霞影院一区二区| 中文字幕佐山爱一区二区免费| 欧美日韩不卡一区二区| 大尺度一区二区| 三级影片在线观看欧美日韩一区二区 | 激情综合色综合久久| 亚洲欧洲av另类| 欧美一区欧美二区| av中文字幕亚洲| 九九热在线视频观看这里只有精品| 亚洲欧洲精品一区二区三区| 日韩一区二区三区在线视频| 91视频观看免费| 国产风韵犹存在线视精品| 图片区小说区国产精品视频| 中文字幕精品一区二区三区精品| 91精品婷婷国产综合久久性色| 99这里只有精品| 久久99在线观看| 婷婷综合另类小说色区| 亚洲欧洲99久久| 国产亚洲欧美一级| 日韩精品一区二区三区在线观看 | 国产人成一区二区三区影院| 欧美日韩国产大片| 色av成人天堂桃色av| 国产福利视频一区二区三区| 久久综合综合久久综合| 亚洲va韩国va欧美va| 亚洲精品日韩一| 国产精品你懂的| 久久精品欧美一区二区三区麻豆| 欧美电影影音先锋| 欧美午夜片在线看| 色吧成人激情小说| 91丨九色丨蝌蚪富婆spa| 国产成a人亚洲| 国产露脸91国语对白| 精品一区二区三区蜜桃| 奇米影视7777精品一区二区| 亚洲福利一区二区| 夜夜精品视频一区二区| 亚洲免费视频成人| 伊人色综合久久天天人手人婷| 国产精品国产三级国产普通话99 | 亚洲欧洲一区二区在线播放| 欧美激情在线一区二区| 久久久.com| 久久久久久免费网| 国产日韩精品一区二区三区 | 99国产精品一区| 99精品久久免费看蜜臀剧情介绍| 成人黄色小视频| 99久久99久久精品国产片果冻| 9l国产精品久久久久麻豆| 91在线免费视频观看| 91免费观看视频在线| 91高清在线观看| 欧美日韩不卡在线| 日韩视频免费观看高清完整版在线观看| 欧美日韩久久久久久| 欧美精品vⅰdeose4hd| 日韩欧美成人午夜| 久久人人97超碰com| 国产精品麻豆99久久久久久| 亚洲三级电影网站| 午夜在线电影亚洲一区| 免费观看成人鲁鲁鲁鲁鲁视频| 久久99蜜桃精品| 成人av在线电影| 91成人免费在线| 欧美一区二区三区视频免费| 久久久久亚洲蜜桃| 亚洲天堂网中文字| 日日夜夜一区二区| 国产麻豆9l精品三级站| 床上的激情91.| 在线观看视频91| 欧美电影一区二区| 久久婷婷综合激情| 亚洲男人的天堂av| 蜜臀久久久久久久| 成人av网站免费观看| 欧美午夜精品一区| 26uuu色噜噜精品一区二区| 亚洲欧洲韩国日本视频| 欧美a一区二区| 不卡一区二区在线| 欧美妇女性影城| 欧美经典一区二区三区| 亚洲一区二区三区中文字幕在线| 青青草原综合久久大伊人精品优势 | 国产精品五月天| 亚洲第一福利一区| 国产精品亚洲午夜一区二区三区| 99久久精品99国产精品| 日韩欧美一区二区三区在线| 国产精品久久久久天堂| 日本欧美久久久久免费播放网| 高清av一区二区| 69堂亚洲精品首页| 一区免费观看视频| 国产在线视频一区二区| 欧美日韩一级大片网址| 国产精品美女久久久久久久| 美女www一区二区| 欧美丝袜丝交足nylons| 日本一区二区三区电影| 精品写真视频在线观看| 欧美日韩亚洲国产综合| 国产精品毛片大码女人| 韩国av一区二区| 欧美伦理电影网| 亚洲精品va在线观看| 国产 日韩 欧美大片| 精品少妇一区二区三区| 亚洲电影中文字幕在线观看| 波多野结衣精品在线| 久久五月婷婷丁香社区| 看国产成人h片视频| 欧美日韩国产高清一区二区三区 | 亚洲va国产天堂va久久en| 成人精品国产免费网站| 久久精品人人做人人爽97| 六月婷婷色综合| 制服丝袜一区二区三区| 亚洲图片欧美一区| 91丨porny丨中文| 国产精品久久三| 丁香婷婷综合五月| 久久精品夜夜夜夜久久| 精一区二区三区| 日韩欧美精品在线视频| 奇米色一区二区| 91麻豆精品国产自产在线| 亚洲国产裸拍裸体视频在线观看乱了| 成人午夜精品在线| 欧美国产激情一区二区三区蜜月| 韩国v欧美v日本v亚洲v| 日韩精品一区二区三区在线| 久久国产精品色婷婷| 欧美xxxx在线观看| 久久成人麻豆午夜电影| 精品久久久久久久久久久久久久久久久 | 99久久久精品| 国产精品久久久久久亚洲伦| www.欧美亚洲| 亚洲激情六月丁香| 欧美在线观看视频一区二区三区 | 欧美一级久久久久久久大片| 蜜桃久久精品一区二区| 日韩欧美国产午夜精品| 久久精品国产99| 久久久久99精品一区| 成人午夜看片网址| 一区二区三区日韩精品视频| 欧洲视频一区二区| 奇米影视一区二区三区小说| 久久综合久久久久88| 成人午夜视频在线| 亚洲欧美日韩国产综合| 欧美日韩国产天堂| 国产一区二区免费视频| 国产精品乱人伦一区二区| 日本精品免费观看高清观看| 午夜av一区二区三区| 精品免费日韩av| 成人高清在线视频| 亚洲成人中文在线| 久久色.com| 欧美又粗又大又爽| 国产真实乱子伦精品视频| 国产精品灌醉下药二区| 欧美精品在线视频|