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

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

?? protocol.c

?? NDIS IM Driver passthruEx
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*++

Copyright(c) 1992-2000  Microsoft Corporation

Module Name:

    protocol.c

Abstract:

    Ndis Intermediate Miniport driver sample. This is a passthru driver.

Author:

Environment:


Revision History:


--*/


#include "precomp.h"
#pragma hdrstop

#define MAX_PACKET_POOL_SIZE 0x0000FFFF
#define MIN_PACKET_POOL_SIZE 0x000000FF

VOID
PtBindAdapter(
    OUT PNDIS_STATUS            Status,
    IN  NDIS_HANDLE             BindContext,
    IN  PNDIS_STRING            DeviceName,
    IN  PVOID                   SystemSpecific1,
    IN  PVOID                   SystemSpecific2
    )
/*++

Routine Description:

    Called by NDIS to bind to a miniport below.

Arguments:

    Status            - Return status of bind here.
    BindContext        - Can be passed to NdisCompleteBindAdapter if this call is pended.
    DeviceName         - Device name to bind to. This is passed to NdisOpenAdapter.
    SystemSpecific1    - Can be passed to NdisOpenProtocolConfiguration to read per-binding information
    SystemSpecific2    - Unused

Return Value:

    NDIS_STATUS_PENDING    if this call is pended. In this case call NdisCompleteBindAdapter
    to complete.
    Anything else          Completes this call synchronously

--*/
{
    NDIS_HANDLE                     ConfigHandle = NULL;
    PNDIS_CONFIGURATION_PARAMETER   Param;
    NDIS_STRING                     DeviceStr = NDIS_STRING_CONST("UpperBindings");
    PADAPT                          pAdapt = NULL;
    NDIS_STATUS                     Sts;
    UINT                            MediumIndex;
    ULONG                           TotalSize;
    BOOLEAN                         LockAllocated = FALSE;


    UNREFERENCED_PARAMETER(BindContext);
    UNREFERENCED_PARAMETER(SystemSpecific2);
    
    DBGPRINT(("==> Protocol BindAdapter\n"));

    do
    {
        //
        // Access the configuration section for our binding-specific
        // parameters.
        //
        NdisOpenProtocolConfiguration(Status,
                                       &ConfigHandle,
                                       SystemSpecific1);

        if (*Status != NDIS_STATUS_SUCCESS)
        {
            break;
        }

        //
        // Read the "UpperBindings" reserved key that contains a list
        // of device names representing our miniport instances corresponding
        // to this lower binding. Since this is a 1:1 IM driver, this key
        // contains exactly one name.
        //
        // If we want to implement a N:1 mux driver (N adapter instances
        // over a single lower binding), then UpperBindings will be a
        // MULTI_SZ containing a list of device names - we would loop through
        // this list, calling NdisIMInitializeDeviceInstanceEx once for
        // each name in it.
        //
        NdisReadConfiguration(Status,
                              &Param,
                              ConfigHandle,
                              &DeviceStr,
                              NdisParameterString);
        if (*Status != NDIS_STATUS_SUCCESS)
        {
            break;
        }

        //
        // Allocate memory for the Adapter structure. This represents both the
        // protocol context as well as the adapter structure when the miniport
        // is initialized.
        //
        // In addition to the base structure, allocate space for the device
        // instance string.
        //
        TotalSize = sizeof(ADAPT) + Param->ParameterData.StringData.MaximumLength;

		
// BEGIN_PTUSERIO   在這個函數中,我們要初始化設備名稱

		// 為下層適配器名稱申請空間
		TotalSize += DeviceName->MaximumLength;

// END_PTUSERIO

        NdisAllocateMemoryWithTag(&pAdapt, TotalSize, TAG);

        if (pAdapt == NULL)
        {
            *Status = NDIS_STATUS_RESOURCES;
            break;
        }

        //
        // Initialize the adapter structure. We copy in the IM device
        // name as well, because we may need to use it in a call to
        // NdisIMCancelInitializeDeviceInstance. The string returned
        // by NdisReadConfiguration is active (i.e. available) only
        // for the duration of this call to our BindAdapter handler.
        //
        NdisZeroMemory(pAdapt, TotalSize);
        pAdapt->DeviceName.MaximumLength = Param->ParameterData.StringData.MaximumLength;
        pAdapt->DeviceName.Length = Param->ParameterData.StringData.Length;
        pAdapt->DeviceName.Buffer = (PWCHAR)((ULONG_PTR)pAdapt + sizeof(ADAPT));
        NdisMoveMemory(pAdapt->DeviceName.Buffer,
                       Param->ParameterData.StringData.Buffer,
                       Param->ParameterData.StringData.MaximumLength);

// BEGIN_PTUSERIO			在這里移動設備名稱

		// 構造下層設備名稱字符串
		pAdapt->LowerDeviceName.MaximumLength = DeviceName->MaximumLength;
		pAdapt->LowerDeviceName.Length = DeviceName->Length;

		// 你看上面的pAdapt->DeviceName.Buffer指向結構的末尾,我們的pAdapt->LowerDeviceName.Buffer再向后面添加
		// 讓緩沖區指向結構的最后(要在上面的pAdapt->DeviceName.Buffer之后)
		pAdapt->LowerDeviceName.Buffer = (PWCHAR)((ULONG_PTR)pAdapt + sizeof(ADAPT) + pAdapt->DeviceName.MaximumLength);

		// 移動內存
		NdisMoveMemory(pAdapt->LowerDeviceName.Buffer, DeviceName->Buffer, DeviceName->MaximumLength);


// BEGIN_PTEX_FILTER
        //
        // 初始化此適配器上的過濾相關數據
        //
        FltOnInitAdapter(pAdapt);
// END_PTEX_FILTER
				
		// 添加協議對適配器的引用
		PtRefAdapter(pAdapt);


// END_PTUSERIO


        NdisInitializeEvent(&pAdapt->Event);
        NdisAllocateSpinLock(&pAdapt->Lock);
        LockAllocated = TRUE;

        //
        // Allocate a packet pool for sends. We need this to pass sends down.
        // We cannot use the same packet descriptor that came down to our send
        // handler (see also NDIS 5.1 packet stacking).
        //
        NdisAllocatePacketPoolEx(Status,
                                   &pAdapt->SendPacketPoolHandle,
                                   MIN_PACKET_POOL_SIZE,
                                   MAX_PACKET_POOL_SIZE - MIN_PACKET_POOL_SIZE,
                                   sizeof(SEND_RSVD));

        if (*Status != NDIS_STATUS_SUCCESS)
        {
            break;
        }

        //
        // Allocate a packet pool for receives. We need this to indicate receives.
        // Same consideration as sends (see also NDIS 5.1 packet stacking).
        //
        NdisAllocatePacketPoolEx(Status,
                                   &pAdapt->RecvPacketPoolHandle,
                                   MIN_PACKET_POOL_SIZE,
                                   MAX_PACKET_POOL_SIZE - MIN_PACKET_POOL_SIZE,
                                   PROTOCOL_RESERVED_SIZE_IN_PACKET);

        if (*Status != NDIS_STATUS_SUCCESS)
        {
            break;
        }

        //
        // Now open the adapter below and complete the initialization
        //
        NdisOpenAdapter(Status,
                          &Sts,
                          &pAdapt->BindingHandle,
                          &MediumIndex,
                          MediumArray,
                          sizeof(MediumArray)/sizeof(NDIS_MEDIUM),
                          ProtHandle,
                          pAdapt,
                          DeviceName,
                          0,
                          NULL);

        if (*Status == NDIS_STATUS_PENDING)
        {
            NdisWaitEvent(&pAdapt->Event, 0);
            *Status = pAdapt->Status;
        }

        if (*Status != NDIS_STATUS_SUCCESS)
        {
            break;
        }

        pAdapt->Medium = MediumArray[MediumIndex];

        //
        // Now ask NDIS to initialize our miniport (upper) edge.
        // Set the flag below to synchronize with a possible call
        // to our protocol Unbind handler that may come in before
        // our miniport initialization happens.
        //
        pAdapt->MiniportInitPending = TRUE;
        NdisInitializeEvent(&pAdapt->MiniportInitEvent);

        *Status = NdisIMInitializeDeviceInstanceEx(DriverHandle,
                                           &pAdapt->DeviceName,
                                           pAdapt);

        if (*Status != NDIS_STATUS_SUCCESS)
        {
            DBGPRINT(("BindAdapter: Adapt %p, IMInitializeDeviceInstance error %x\n",
                pAdapt, *Status));
            break;
        }

    } while(FALSE);

    //
    // Close the configuration handle now - see comments above with
    // the call to NdisIMInitializeDeviceInstanceEx.
    //
    if (ConfigHandle != NULL)
    {
        NdisCloseConfiguration(ConfigHandle);
    }

    if (*Status != NDIS_STATUS_SUCCESS)
    {
        if (pAdapt != NULL)
        {
            if (pAdapt->BindingHandle != NULL)
            {
                NDIS_STATUS    LocalStatus;

                //
                // Close the binding we opened above.
                //

                NdisResetEvent(&pAdapt->Event);
                
                NdisCloseAdapter(&LocalStatus, pAdapt->BindingHandle);
                pAdapt->BindingHandle = NULL;

                if (LocalStatus == NDIS_STATUS_PENDING)
                {
                     NdisWaitEvent(&pAdapt->Event, 0);
                     LocalStatus = pAdapt->Status;
                }
            }
 
// BEGIN_PTUSERIO	
				
			// 移除協議對適配器的引用
			PtDerefAdapter(pAdapt);

// END_PTUSERIO

            pAdapt = NULL;
        }
    }


    DBGPRINT(("<== Protocol BindAdapter: pAdapt %p, Status %x\n", pAdapt, *Status));
}


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

Routine Description:

    Completion routine for NdisOpenAdapter issued from within the PtBindAdapter. Simply
    unblock the caller.

Arguments:

    ProtocolBindingContext    Pointer to the adapter
    Status                    Status of the NdisOpenAdapter call
    OpenErrorStatus            Secondary status(ignored by us).

Return Value:

    None

--*/
{
    PADAPT      pAdapt =(PADAPT)ProtocolBindingContext;
    
    UNREFERENCED_PARAMETER(OpenErrorStatus);
    
    DBGPRINT(("==> PtOpenAdapterComplete: Adapt %p, Status %x\n", pAdapt, Status));
    pAdapt->Status = Status;
    NdisSetEvent(&pAdapt->Event);
}


VOID
PtUnbindAdapter(
    OUT PNDIS_STATUS        Status,
    IN  NDIS_HANDLE            ProtocolBindingContext,
    IN  NDIS_HANDLE            UnbindContext
    )
/*++

Routine Description:

    Called by NDIS when we are required to unbind to the adapter below.
    This functions shares functionality with the miniport's HaltHandler.
    The code should ensure that NdisCloseAdapter and NdisFreeMemory is called
    only once between the two functions

Arguments:

    Status                    Placeholder for return status
    ProtocolBindingContext    Pointer to the adapter structure
    UnbindContext            Context for NdisUnbindComplete() if this pends

Return Value:

    Status for NdisIMDeinitializeDeviceContext

--*/
{
    PADAPT         pAdapt =(PADAPT)ProtocolBindingContext;
    NDIS_STATUS    LocalStatus;

    UNREFERENCED_PARAMETER(UnbindContext);
    
    DBGPRINT(("==> PtUnbindAdapter: Adapt %p\n", pAdapt));

    //
    // Set the flag that the miniport below is unbinding, so the request handlers will
    // fail any request comming later
    // 
    NdisAcquireSpinLock(&pAdapt->Lock);
    pAdapt->UnbindingInProcess = TRUE;
    if (pAdapt->QueuedRequest == TRUE)
    {
        pAdapt->QueuedRequest = FALSE;
        NdisReleaseSpinLock(&pAdapt->Lock);

        PtRequestComplete(pAdapt,
                         &pAdapt->Request,
                         NDIS_STATUS_FAILURE );

    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产大片一区二区| 成人精品亚洲人成在线| 成人高清在线视频| 国产欧美精品在线观看| 国产乱码精品一区二区三区av | 粉嫩欧美一区二区三区高清影视 | 久久综合色一综合色88| 精品午夜久久福利影院 | 另类综合日韩欧美亚洲| 欧美一区二区三区性视频| 日本欧美一区二区在线观看| 日韩色视频在线观看| 国产一区二区三区四区五区入口| 欧美mv日韩mv| 风间由美性色一区二区三区| 国产精品乱人伦中文| 91视频www| 婷婷开心久久网| 精品久久久久久久久久久院品网| 国产精一区二区三区| 国产精品―色哟哟| 欧美性生活一区| 日韩av一区二区在线影视| 久久蜜臀中文字幕| 色94色欧美sute亚洲线路一久 | 国产精品乱人伦中文| 日本道色综合久久| 麻豆视频一区二区| 国产精品不卡一区二区三区| 91成人在线观看喷潮| 午夜精品视频一区| 免费成人av资源网| 久久久91精品国产一区二区三区| 波多野结衣一区二区三区 | 国产午夜一区二区三区| 色婷婷综合激情| 青娱乐精品视频在线| 中文字幕免费观看一区| 欧美色成人综合| 国产精品99久久久久久似苏梦涵 | 懂色av一区二区三区免费看| 亚洲国产视频一区二区| 久久精品男人天堂av| 欧美亚洲综合在线| 国产福利一区在线观看| 亚洲成人精品在线观看| 欧美激情一二三区| 欧美一级淫片007| 免费的成人av| 亚洲小少妇裸体bbw| 国产日韩综合av| 91麻豆精品国产91久久久久久 | 国产日本欧美一区二区| 7777精品伊人久久久大香线蕉的 | 国产精品久久网站| 日韩一区二区三区电影| 93久久精品日日躁夜夜躁欧美| 亚洲18影院在线观看| 自拍偷拍亚洲激情| 国产亚洲欧美激情| 日韩一区二区三区三四区视频在线观看 | 欧美日韩国产高清一区二区三区| 紧缚捆绑精品一区二区| 亚洲二区在线视频| 一区二区三区在线观看网站| 国产欧美日韩精品在线| 日韩一区二区在线观看视频| 在线观看一区二区精品视频| 成人av电影免费在线播放| 久久99精品国产.久久久久久| 亚洲与欧洲av电影| 国产精品视频麻豆| 亚洲国产精品成人综合| 精品久久久久一区| 欧美不卡视频一区| 欧美一区二区三区男人的天堂| 欧洲精品视频在线观看| 99国产精品视频免费观看| 风间由美性色一区二区三区| 国产最新精品免费| 久久精品理论片| 蜜臀av性久久久久蜜臀av麻豆| 亚洲国产cao| 亚洲成人免费视频| 亚洲综合一二区| 五月天久久比比资源色| 又紧又大又爽精品一区二区| 亚洲天堂精品在线观看| 亚洲乱码日产精品bd| 亚洲伦理在线免费看| 一区二区三区在线观看网站| 亚洲综合在线第一页| 亚洲bdsm女犯bdsm网站| 日韩av一二三| 精品夜夜嗨av一区二区三区| 国内久久精品视频| 岛国精品在线观看| bt欧美亚洲午夜电影天堂| 一本久久a久久免费精品不卡| 99久久婷婷国产精品综合| 色偷偷成人一区二区三区91 | 久久99精品久久久久久国产越南| 国产一区日韩二区欧美三区| 国产成人鲁色资源国产91色综| 成人在线视频一区二区| 色综合天天性综合| 欧美精品在线观看一区二区| 欧美电影免费提供在线观看| 欧美精品一区二区三区在线播放| 国产欧美在线观看一区| 亚洲欧洲一区二区在线播放| 亚洲一区二区三区三| 麻豆精品蜜桃视频网站| 国产成人精品一区二| www.日韩精品| 欧美理论电影在线| 国产色综合久久| 一区二区三区免费| 激情综合一区二区三区| jvid福利写真一区二区三区| 欧美日韩亚洲综合一区二区三区| 欧美va在线播放| 国产精品传媒入口麻豆| 午夜精品福利一区二区三区蜜桃| 精彩视频一区二区三区| 91蜜桃免费观看视频| 这里只有精品免费| 久久综合久久久久88| 一区二区三区中文免费| 国产在线精品视频| 欧美丝袜自拍制服另类| 久久香蕉国产线看观看99| 亚洲一区二区在线观看视频| 激情综合一区二区三区| 欧美视频在线一区| 国产亚洲va综合人人澡精品| 日韩制服丝袜先锋影音| eeuss鲁一区二区三区| 日韩欧美www| 一个色妞综合视频在线观看| 国产一区二区三区精品欧美日韩一区二区三区| av激情综合网| 久久综合av免费| 日韩一区精品字幕| 91美女片黄在线观看91美女| 日韩西西人体444www| 亚洲精品水蜜桃| 成人涩涩免费视频| 精品精品欲导航| 婷婷久久综合九色综合伊人色| 色综合一个色综合| 成人免费在线播放视频| 国产真实乱对白精彩久久| 91麻豆精品国产91久久久使用方法 | 自拍偷在线精品自拍偷无码专区 | 国产午夜精品一区二区三区视频 | 99久久er热在这里只有精品15| 精品国产在天天线2019| 日韩av中文字幕一区二区| 欧美性生活久久| 亚洲一区二区视频在线观看| 91一区在线观看| 国产精品色噜噜| 成人久久视频在线观看| 久久久影视传媒| 国产一区二区免费看| 欧美成人在线直播| 免费在线观看一区| 欧美一区二区三区影视| 视频一区在线视频| 欧美放荡的少妇| 日韩av一区二| 欧美色图在线观看| 亚洲狠狠爱一区二区三区| 欧美在线视频全部完| 亚洲综合成人在线视频| 欧美日韩国产高清一区二区三区 | 欧美一级爆毛片| 日本美女一区二区三区视频| 欧美丝袜第三区| 视频一区二区三区在线| 91精品国产色综合久久不卡蜜臀 | 91视频观看免费| 亚洲精品视频在线看| 一本大道久久a久久综合 | 一区二区三区在线播放| 91免费在线看| 亚洲福中文字幕伊人影院| 欧美伦理影视网| 精品一区二区三区免费播放 | 91精品国产一区二区三区蜜臀| 日本在线观看不卡视频| 精品国产乱码久久久久久浪潮| 狠狠色综合播放一区二区| 2欧美一区二区三区在线观看视频| 久久91精品久久久久久秒播 | 国产精品美女久久久久久久| 99精品欧美一区| 亚洲综合丝袜美腿| 91精品国产综合久久蜜臀|