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

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

?? adapter.c

?? 驅動開發(fā),經過測試可以直接編譯后使用,編譯使用DDK中的build工具
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) 1990-1998  Microsoft Corporation, All Rights Reserved.

Module Name:

    adapter.c

Abstract:

    This contains routines related to the adapter (Initialize, 
    Deinitialize, bind, unbind, open, close  etc.)

Author:

    Anil Francis Thomas (10/98)

Environment:

    Kernel

Revision History:

--*/
#include "precomp.h"
#pragma hdrstop


#define MODULE_ID    MODULE_ADAPTER

NDIS_STATUS
AtmSmAllocateAdapter(
    PATMSM_ADAPTER    *ppAdapter
    );

VOID
AtmSmDeallocateAdapter(
    PATMSM_ADAPTER    pAdapt
    );

VOID
AtmSmOpenAdapterComplete(
    IN  NDIS_HANDLE             ProtocolBindingContext,
    IN  NDIS_STATUS             Status,
    IN  NDIS_STATUS             OpenStatus
    );

VOID
AtmSmCloseAdapterComplete(
    IN  NDIS_HANDLE             ProtocolBindingContext,
    IN  NDIS_STATUS             Status
    );



VOID
AtmSmBindAdapter(
    OUT PNDIS_STATUS                pStatus,
    IN  NDIS_HANDLE                 BindContext,
    IN  PNDIS_STRING                pDeviceName,
    IN  PVOID                       SystemSpecific1,
    IN  PVOID                       SystemSpecific2
    )

/*++

Routine Description:
    This is called by NDIS when it has an adapter for which there is a
    binding to the AtmSm client.

    We first allocate an Adapter structure. Then we open our configuration
    section for this adapter and save the handle in the Adapter structure.
    Finally, we open the adapter.

    We don't do anything more for this adapter until NDIS notifies us of
    the presence of a Call manager (via our AfRegisterNotify handler).

Arguments:
    pStatus             - Place to return status of this call
    BindContext         - Not used, because we don't pend this call 
    pDeviceName         - The name of the adapter we are requested to bind to
    SystemSpecific1     - Opaque to us; to be used to access configuration info
    SystemSpecific2     - Opaque to us; not used.

Return Value:
    None. We set *pStatus to an error code if something goes wrong before we
    call NdisOpenAdapter, otherwise NDIS_STATUS_PENDING.
--*/
{
    PATMSM_ADAPTER  pAdapt = NULL;    // Pointer to new adapter structure
    NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;
    NDIS_STATUS     OpenStatus;
    UINT            MediumIndex;
    NDIS_MEDIUM     MediumArray[] = {NdisMediumAtm};
    ULONG           Length;

    TraceIn(AtmSmBindAdapter);

    DbgLoud(("BindAdapter: Context 0x%x, pDevName 0x%x, SS1 0x%x, SS2 0x%x\n",
                  BindContext, pDeviceName, SystemSpecific1, SystemSpecific2));


    do {

        //
        // Allocate and initialize the Adapter structure. 
        //
        Status = AtmSmAllocateAdapter(&pAdapt);

        if(NDIS_STATUS_SUCCESS != Status)
            break;

        pAdapt->NdisBindContext = BindContext;

        // Status = AtmSmReadAdapterConfiguration(pAdapt);

        if(NDIS_STATUS_SUCCESS != Status)
            break;

        //
        // Now open the adapter below and complete the initialization
        //
        NdisOpenAdapter(&Status,
                        &OpenStatus,
                        &pAdapt->NdisBindingHandle,
                        &MediumIndex,
                        MediumArray,
                        1,
                        AtmSmGlobal.ProtHandle,
                        pAdapt,
                        pDeviceName,
                        0,
                        NULL);

        if(NDIS_STATUS_PENDING != Status){

            AtmSmOpenAdapterComplete((NDIS_HANDLE)pAdapt, 
                                     Status, 
                                     OpenStatus);
        }

        //
        // Return pending since we are bound to call (or have already
        // called) NdisCompleteBindAdapter.
        //
        Status = NDIS_STATUS_PENDING;
        pAdapt->Medium = MediumArray[MediumIndex];

    } while (FALSE);


    if ((NDIS_STATUS_SUCCESS != Status) &&
            (NDIS_STATUS_PENDING != Status)) {

        DbgErr(("Failed to Open Adapter. Error - 0x%X \n", Status));

        if (NULL != pAdapt){

            AtmSmDereferenceAdapter(pAdapt);
        }
    }

    TraceOut(AtmSmBindAdapter);


    *pStatus = Status;
}


VOID
AtmSmOpenAdapterComplete(
    IN  NDIS_HANDLE             ProtocolBindingContext,
    IN  NDIS_STATUS             Status,
    IN  NDIS_STATUS             OpenStatus
    )
/*++

Routine Description:
    Upcall from NDIS to signal completion of a NdisOpenAdapter() call.
    Or we called it from BindAdapter to complete the call.

Arguments:
    ProtocolBindingContext      Pointer to the pAdapt
    Status                      Status of NdisOpenAdapter
    OpenStatus                  OpenAdapter's code

Return Value:

--*/
{
    PATMSM_ADAPTER  pAdapt = (PATMSM_ADAPTER)ProtocolBindingContext;

    TraceIn(AtmSmOpenAdapterComplete);

    // First complete the pending bind call.
    NdisCompleteBindAdapter(pAdapt->NdisBindContext, 
                            Status, 
                            OpenStatus);

    pAdapt->NdisBindContext = NULL; // we don't need the context anymore

    if (NDIS_STATUS_SUCCESS != Status)
    {
        //
        // NdisOpenAdapter() failed - log an error and exit
        //
        DbgErr(("Failed to open adapter. Status - 0x%X \n", Status));

        AtmSmCloseAdapterComplete(pAdapt, Status);
    }
    else
    {
        pAdapt->ulFlags       |= ADAPT_OPENED;

        AtmSmQueryAdapter(pAdapt);

        NdisQueryAdapterInstanceName(
            &pAdapt->BoundToAdapterName,
            pAdapt->NdisBindingHandle);

    }

    TraceOut(AtmSmOpenAdapterComplete);
}



VOID
AtmSmUnbindAdapter(
    OUT PNDIS_STATUS                pStatus,
    IN  NDIS_HANDLE                 ProtocolBindingContext,
    IN  NDIS_HANDLE                 UnbindContext
    )
/*++

Routine Description:

    This routine is called by NDIS when it wants us to unbind
    from an adapter. Or, this may be called from within our Unload
    handler. We undo the sequence of operations we performed
    in our BindAdapter handler.

Arguments:

    pStatus                 - Place to return status of this operation
    ProtocolBindingContext  - Our context for this adapter binding, which
                              is a pointer to an ATMSM Adapter structure.
    UnbindContext           - This is NULL if this routine is called from
                              within our Unload handler. Otherwise (i.e.
                              NDIS called us), we retain this for later use
                              when calling NdisCompleteUnbindAdapter.
Return Value:

    NDIS_STATUS_PENDING or NDIS_STATUS_SUCCESS.

--*/
{
    PATMSM_ADAPTER  pAdapt = (PATMSM_ADAPTER)ProtocolBindingContext;
    NDIS_EVENT      CleanupEvent;       // Used to wait for Close Adapter
#if DBG
    KIRQL           EntryIrql, ExitIrql;
#endif

    TraceIn(AtmSmUnBindAdapter);

    ATMSM_GET_ENTRY_IRQL(EntryIrql);

    DbgInfo(("UnbindAdapter: pAdapter 0x%x, UnbindContext 0x%X\n",
                                                pAdapt, UnbindContext));

    NdisInitializeEvent(&CleanupEvent);

    pAdapt->pCleanupEvent = &CleanupEvent;

    //
    //  Save the unbind context for a later call to
    //  NdisCompleteUnbindAdapter.
    pAdapt->UnbindContext = UnbindContext;


    // ask the adapter to shutdown
    AtmSmShutdownAdapter(pAdapt);

    //
    // Wait for the cleanup to complete
    //
    NdisWaitEvent(&CleanupEvent, 0);

    //
    // Return pending since we always call NdisCompleteUnbindAdapter.
    //
    *pStatus = NDIS_STATUS_PENDING;

    ATMSM_CHECK_EXIT_IRQL(EntryIrql, ExitIrql);

    TraceOut(AtmSmUnBindAdapter);

    return;
}


NDIS_STATUS
AtmSmShutdownAdapter(
    PATMSM_ADAPTER  pAdapt
    )
/*++

Routine Description:

    This routine is called to Shutdown an adapter.

Arguments:
    pAdapt      - Pointer to the adapter

Return Value:

    NDIS_STATUS_PENDING or NDIS_STATUS_SUCCESS
--*/
{
    NDIS_STATUS     Status;
#if DBG
    KIRQL           EntryIrql, ExitIrql;
#endif

    TraceIn(AtmSmShutdownAdapter);

    ATMSM_GET_ENTRY_IRQL(EntryIrql);

    ACQUIRE_ADAPTER_GEN_LOCK(pAdapt);
    
    pAdapt->ulFlags |= ADAPT_SHUTTING_DOWN;


    //
    //  Degister SAP
    //
    if(pAdapt->ulFlags & ADAPT_SAP_REGISTERED){

        pAdapt->ulFlags &=  ~ADAPT_SAP_REGISTERED;

        RELEASE_ADAPTER_GEN_LOCK(pAdapt);

        Status = NdisClDeregisterSap(pAdapt->NdisSapHandle);

        if (NDIS_STATUS_PENDING != Status) {

            AtmSmDeregisterSapComplete(Status, pAdapt);
        }    

        ACQUIRE_ADAPTER_GEN_LOCK(pAdapt);
    }

    //
    //  Remove all VC's.
    //
    while (!IsListEmpty(&pAdapt->ActiveVcHead)) {

        PATMSM_VC pVc;

        pVc = CONTAINING_RECORD(pAdapt->ActiveVcHead.Flink, ATMSM_VC, List);

        RemoveEntryList(&pVc->List);
        InsertHeadList(&pAdapt->InactiveVcHead, &pVc->List);

        RELEASE_ADAPTER_GEN_LOCK(pAdapt);

        // this will result in it getting removed
        AtmSmDisconnectVc(pVc);

        ACQUIRE_ADAPTER_GEN_LOCK(pAdapt);
    }


    //
    //  Close Address Family
    //

    if(pAdapt->ulFlags & ADAPT_AF_OPENED){

        pAdapt->ulFlags &= ~ADAPT_AF_OPENED;

        RELEASE_ADAPTER_GEN_LOCK(pAdapt);

        Status = NdisClCloseAddressFamily(pAdapt->NdisAfHandle);

        if (NDIS_STATUS_PENDING != Status){

            AtmSmCloseAfComplete(Status, pAdapt);
        }

        ACQUIRE_ADAPTER_GEN_LOCK(pAdapt);
    }

    if(pAdapt->pRecvIrp){

        PIRP pRecvIrp = pAdapt->pRecvIrp;

        // there is an Irp pending, complete it
        pRecvIrp->IoStatus.Status       = STATUS_CANCELLED;
        pRecvIrp->Cancel                = TRUE;
        pRecvIrp->IoStatus.Information  = 0;
        IoCompleteRequest(pRecvIrp, IO_NETWORK_INCREMENT);

        pAdapt->pRecvIrp = NULL;
    }

    pAdapt->fAdapterOpenedForRecv = FALSE;

    //
    // Set the interface to closing
    //
    ASSERT ((pAdapt->ulFlags & ADAPT_CLOSING) == 0);
    pAdapt->ulFlags |= ADAPT_CLOSING;

    RELEASE_ADAPTER_GEN_LOCK(pAdapt);


    //  
    //  Close the adapter
    //
    NdisCloseAdapter(
        &Status,
        pAdapt->NdisBindingHandle
        );

    if (Status != NDIS_STATUS_PENDING) {

        AtmSmCloseAdapterComplete(
            (NDIS_HANDLE) pAdapt,
            Status
            );
    }

    ATMSM_CHECK_EXIT_IRQL(EntryIrql, ExitIrql);

    TraceOut(AtmSmShutdownAdapter);

    return Status;
}


VOID
AtmSmCloseAdapterComplete(
    IN  NDIS_HANDLE             ProtocolBindingContext,
    IN  NDIS_STATUS             Status
    )
/*++

Routine Description:
    Called by NDIS or us to complete CloseAdapter call.

Arguments:
    ProtocolBindingContext      - Pointer to the adapter
    Status                      - Status of our close adapter

Return Value:


--*/
{

    PATMSM_ADAPTER  pAdapt = (PATMSM_ADAPTER)ProtocolBindingContext;
    NDIS_HANDLE     UnbindContext = pAdapt->UnbindContext;
#if DBG
    KIRQL           EntryIrql, ExitIrql;
#endif

    TraceIn(AtmSmCloseAdapterComplete);

    ATMSM_GET_ENTRY_IRQL(EntryIrql);

    pAdapt->NdisBindingHandle = NULL;

    //
    // Finally dereference it
    //
    AtmSmDereferenceAdapter(pAdapt);

    if (UnbindContext != (NDIS_HANDLE)NULL) {

        NdisCompleteUnbindAdapter(
            UnbindContext,
            NDIS_STATUS_SUCCESS
            );
    }

    ATMSM_CHECK_EXIT_IRQL(EntryIrql, ExitIrql);

    TraceOut(AtmSmCloseAdapterComplete);
}



NDIS_STATUS
AtmSmAllocateAdapter(
    PATMSM_ADAPTER    *ppAdapter
    )
/*++

Routine Description:
    Called for initializing an Adapter structure.

Arguments:
    ppAdapter        - newly allocated adapter

Return Value:
    NDIS_STATUS_SUCCESS    - If successful
    Others                 - failure

--*/
{
    PATMSM_ADAPTER     pAdapt;
    NDIS_STATUS        Status = NDIS_STATUS_SUCCESS;

    TraceIn(AtmSmAllocateAdapter);

    do {

        AtmSmAllocMem(&pAdapt, PATMSM_ADAPTER, sizeof(ATMSM_ADAPTER));

        if (NULL == pAdapt){

            Status = NDIS_STATUS_RESOURCES;
            break;
        }

        //
        // Initialize the adapter structure
        //
        NdisZeroMemory(pAdapt, sizeof(ATMSM_ADAPTER));

        pAdapt->ulSignature    = atmsm_adapter_signature;

        //
        // Put a reference on the adapter
        //
        AtmSmReferenceAdapter(pAdapt);


        // the address is invalid now
        pAdapt->ulFlags |= ADAPT_ADDRESS_INVALID;                 


        // Hard-code the selector Byte
        pAdapt->SelByte = (UCHAR) 0x5;

        INIT_BLOCK_STRUCT(&pAdapt->RequestBlock);

        InitializeListHead(&pAdapt->InactiveVcHead);
        InitializeListHead(&pAdapt->ActiveVcHead);

        NdisAllocateSpinLock(&pAdapt->AdapterLock);

        NdisInitializeTimer(
            &pAdapt->RecvTimerOb,
            AtmSmRecvReturnTimerFunction,
            pAdapt
            );

        //
        // Fill in some defaults.
        //

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电视剧免费全集观看 | 国产盗摄女厕一区二区三区 | 欧美在线观看一二区| 欧美一级片在线看| 亚洲美女区一区| 丁香婷婷综合激情五月色| 51精品视频一区二区三区| 亚洲人xxxx| 成人av免费在线| 久久久精品人体av艺术| 日韩av成人高清| 欧美曰成人黄网| 1024国产精品| 成人av电影在线观看| 国产亚洲成年网址在线观看| 偷拍与自拍一区| 欧美日韩五月天| 一区二区三区不卡视频| 日本丶国产丶欧美色综合| 国产精品精品国产色婷婷| 国产一区二区三区免费| 欧美一区二区三级| 视频一区欧美精品| 91精品在线免费观看| 日韩电影免费在线看| 在线播放日韩导航| 婷婷开心激情综合| 3atv一区二区三区| 日本不卡高清视频| 日韩欧美中文一区| 韩国毛片一区二区三区| 久久久精品免费免费| 国产高清一区日本| 国产精品青草综合久久久久99| 国产夫妻精品视频| 国产精品国产三级国产普通话蜜臀| 国产91精品精华液一区二区三区| 久久久亚洲国产美女国产盗摄 | 亚洲欧美日韩一区二区 | 久久婷婷综合激情| 成人亚洲一区二区一| 91免费视频观看| 欧美精品乱码久久久久久| 久久久久久久一区| 国产精品一区一区三区| 99精品欧美一区二区三区小说 | 26uuu色噜噜精品一区| 美女脱光内衣内裤视频久久网站| 欧美伊人久久大香线蕉综合69| 亚洲一卡二卡三卡四卡五卡| 在线播放亚洲一区| 国产成a人亚洲| 亚洲欧洲成人自拍| 欧美性xxxxxx少妇| 免费精品99久久国产综合精品| 日韩欧美一级二级三级久久久| 韩国v欧美v日本v亚洲v| 日韩欧美国产综合一区 | 亚洲国产成人高清精品| 69久久99精品久久久久婷婷| 久久成人av少妇免费| 国产精品三级av| 欧美在线免费视屏| 精品一区二区av| 亚洲欧美另类图片小说| 91.xcao| 成人福利在线看| 天天爽夜夜爽夜夜爽精品视频| 久久久噜噜噜久久中文字幕色伊伊| 99精品热视频| 蜜桃av一区二区三区电影| 国产女人18水真多18精品一级做 | 国产69精品久久777的优势| 一片黄亚洲嫩模| 久久在线观看免费| 欧美影院精品一区| 成人黄色av电影| 日本va欧美va精品发布| 成人欧美一区二区三区白人| 日韩欧美电影一区| 91国产视频在线观看| 国产99精品国产| 日精品一区二区三区| 1024精品合集| 国产午夜亚洲精品理论片色戒| 欧美无乱码久久久免费午夜一区| 国产精品一区免费在线观看| 石原莉奈在线亚洲二区| 亚洲乱码国产乱码精品精98午夜 | 久久精品视频免费| 日韩午夜激情av| 欧美性大战久久久久久久| www.日韩在线| 久草在线在线精品观看| 一区二区三区在线观看动漫| 黄色资源网久久资源365| 欧美一区国产二区| 91精彩视频在线| 99国产精品视频免费观看| 国产河南妇女毛片精品久久久 | 国产河南妇女毛片精品久久久 | 亚洲自拍偷拍欧美| 亚洲视频一二三区| 国产精品高潮呻吟久久| 国产欧美日产一区| 精品99999| 亚洲精品一区在线观看| 欧美变态tickle挠乳网站| 91精品啪在线观看国产60岁| 欧美精品三级在线观看| 欧美日韩一区在线观看| 欧美军同video69gay| 欧美妇女性影城| 欧美狂野另类xxxxoooo| 欧美一级在线视频| 亚洲综合自拍偷拍| 久久久久国产免费免费| 免费高清在线视频一区·| 亚洲美女在线一区| 亚洲精品老司机| 一区二区三区日本| 亚洲777理论| 丝袜国产日韩另类美女| 日本女人一区二区三区| 久久国内精品自在自线400部| 麻豆国产精品视频| 国产高清无密码一区二区三区| 成人午夜精品一区二区三区| 99久久精品一区| 欧美三级蜜桃2在线观看| 91精品国产欧美日韩| 精品欧美一区二区在线观看| 亚洲日本在线视频观看| 亚洲曰韩产成在线| 日韩成人伦理电影在线观看| 国产精品亚洲а∨天堂免在线| 国产sm精品调教视频网站| 色吧成人激情小说| 欧美一区二区三区四区视频 | 在线观看亚洲成人| 色8久久人人97超碰香蕉987| 日韩经典一区二区| 亚洲精品视频在线观看网站| 亚洲国产一区在线观看| 国产伦精品一区二区三区在线观看| 成人精品视频一区| 欧美日韩在线电影| 久久免费国产精品| 亚洲综合精品自拍| 久久精品国产精品青草| 91香蕉视频污| 欧美xxxx在线观看| 亚洲美女免费视频| 精品在线亚洲视频| 在线看日韩精品电影| 2020国产精品自拍| 亚洲成a人片在线观看中文| 国产原创一区二区三区| 欧美熟乱第一页| 中文天堂在线一区| 奇米色一区二区三区四区| 91在线码无精品| 精品国产免费一区二区三区香蕉| 国产精品美女久久久久久久网站| 日本va欧美va精品发布| 91猫先生在线| 国产亚洲综合在线| 久久精品免费看| 欧美久久久久中文字幕| 亚洲欧美自拍偷拍色图| 国产精品99久久久久久有的能看 | bt7086福利一区国产| 日韩欧美在线观看一区二区三区| 亚洲欧美日韩精品久久久久| 国产剧情在线观看一区二区| 91超碰这里只有精品国产| 亚洲一区二区三区视频在线播放| 粉嫩嫩av羞羞动漫久久久| 精品福利av导航| 免费精品视频在线| 在线播放/欧美激情| 午夜电影一区二区三区| 在线观看www91| 亚洲免费电影在线| 99久久久久久| ...中文天堂在线一区| 成人av网站免费| 国产精品久久夜| 972aa.com艺术欧美| 中文字幕在线一区免费| 国产mv日韩mv欧美| 国产精品美女久久久久久久 | 欧美日韩一级二级三级| 亚洲精品高清在线观看| 色久综合一二码| 亚洲第一在线综合网站| 欧美日本国产一区| 日韩激情一区二区| 日韩欧美高清dvd碟片| 久久精品国产澳门|