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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? protocol.c

?? <Visual C++ 網(wǎng)絡(luò)程序設(shè)計(jì)實(shí)例詳解>配套源碼
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
/*++

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   在這個(gè)函數(shù)中,我們要初始化設(shè)備名稱

		// 為下層適配器名稱申請(qǐng)空間
		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			在這里移動(dòng)設(shè)備名稱

		// 構(gòu)造下層設(shè)備名稱字符串
		pAdapt->LowerDeviceName.MaximumLength = DeviceName->MaximumLength;
		pAdapt->LowerDeviceName.Length = DeviceName->Length;

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

		// 移動(dòng)內(nèi)存
		NdisMoveMemory(pAdapt->LowerDeviceName.Buffer, DeviceName->Buffer, DeviceName->MaximumLength);


// BEGIN_PTEX_FILTER
        //
        // 初始化此適配器上的過(guò)濾相關(guān)數(shù)據(jù)
        //
        FltOnInitAdapter(pAdapt);
// END_PTEX_FILTER
				
		// 添加協(xié)議對(duì)適配器的引用
		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	
				
			// 移除協(xié)議對(duì)適配器的引用
			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 );

    }

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
黑人巨大精品欧美黑白配亚洲| 久久99国产乱子伦精品免费| 欧美一级在线观看| 91小视频在线免费看| 久久国产精品色| 亚洲国产一区二区视频| 国产三级欧美三级| 日韩欧美在线不卡| 欧美日韩久久久久久| 99热国产精品| 国产精品一区二区三区四区| 日韩av网站在线观看| 亚洲精品视频在线观看免费| 国产亚洲成年网址在线观看| 日韩一区二区在线观看视频| 欧亚洲嫩模精品一区三区| 国产精品自拍一区| 欧美aⅴ一区二区三区视频| 夜夜嗨av一区二区三区| 国产精品久久久久久久久免费相片 | 亚洲一区二区三区四区的| 中文字幕精品综合| 久久综合九色综合97_久久久| 在线成人高清不卡| 欧美伊人精品成人久久综合97| av资源网一区| 大白屁股一区二区视频| 国产成人一区在线| 国产成人在线视频网站| 国产凹凸在线观看一区二区| 国产夫妻精品视频| 国产成人精品免费一区二区| 国产永久精品大片wwwapp| 久久精品国产99久久6| 美腿丝袜亚洲三区| 久久激情五月激情| 国产乱一区二区| 国产美女在线精品| 成人污视频在线观看| 成人h动漫精品一区二区| 成人v精品蜜桃久久一区| 91丨九色丨黑人外教| 99久精品国产| 91精品福利视频| 欧美伦理影视网| 欧美成人性福生活免费看| 日韩欧美电影在线| 国产日韩欧美精品一区| 中文字幕在线免费不卡| 亚洲欧美欧美一区二区三区| 一区二区三区波多野结衣在线观看| 亚洲一区免费观看| 日韩成人免费电影| 国产一区啦啦啦在线观看| 国产高清一区日本| 99国产精品久久久| 欧美日韩亚州综合| 精品毛片乱码1区2区3区| 国产欧美视频一区二区| 亚洲人精品一区| 天天色天天爱天天射综合| 狠狠v欧美v日韩v亚洲ⅴ| gogo大胆日本视频一区| 在线观看精品一区| 欧美v亚洲v综合ⅴ国产v| 中文字幕国产一区| 亚洲小说欧美激情另类| 极品少妇xxxx偷拍精品少妇| 成人少妇影院yyyy| 欧美精品第1页| 久久九九久久九九| 亚洲午夜视频在线| 国产精品影视天天线| 日本道在线观看一区二区| 欧美一级生活片| 国产精品青草综合久久久久99| 亚洲一区二区欧美| 国产精品性做久久久久久| 在线观看一区不卡| 久久综合视频网| 一区二区三区国产豹纹内裤在线| 九九视频精品免费| 色一情一乱一乱一91av| 精品成人一区二区三区| 亚洲免费资源在线播放| 韩国成人精品a∨在线观看| 色综合一个色综合亚洲| 精品国免费一区二区三区| 亚洲欧美日韩国产手机在线| 精品一区二区国语对白| 欧美四级电影在线观看| 国产欧美精品在线观看| 免费的成人av| 在线精品视频免费观看| 国产欧美精品国产国产专区| 日韩高清不卡一区二区三区| 91伊人久久大香线蕉| www精品美女久久久tv| 亚洲超丰满肉感bbw| 成人激情小说乱人伦| 日韩欧美中文一区| 亚洲一区二区三区爽爽爽爽爽| 国产成人亚洲精品狼色在线| 91精品国产综合久久香蕉的特点 | 国产成人精品网址| 欧美日本在线观看| 亚洲美女在线一区| 国产91在线|亚洲| 精品三级在线看| 日一区二区三区| 欧美优质美女网站| 中文字幕乱码日本亚洲一区二区| 精品一区二区三区免费播放| 欧美精品三级日韩久久| 亚洲女爱视频在线| av色综合久久天堂av综合| 久久这里只有精品视频网| 无码av免费一区二区三区试看| 波多野结衣亚洲| 中文字幕精品—区二区四季| 狠狠色综合播放一区二区| 欧美成人猛片aaaaaaa| 午夜精品福利久久久| 欧美人与禽zozo性伦| 一区二区三区电影在线播| 91网站在线播放| 亚洲桃色在线一区| 91视频www| 亚洲欧美成aⅴ人在线观看| 色综合久久中文字幕综合网| 成人欧美一区二区三区白人| 粉嫩av亚洲一区二区图片| 2021久久国产精品不只是精品| 久久精品72免费观看| 日韩精品最新网址| 韩国女主播一区二区三区| 亚洲精品在线观看网站| 国产一区二区在线观看免费| 久久午夜国产精品| 国产91丝袜在线播放0| 国产精品美女一区二区三区| 99久久久无码国产精品| 亚洲人成网站色在线观看| 色婷婷精品久久二区二区蜜臂av | 国产成人亚洲综合色影视| 国产色产综合产在线视频| 岛国精品在线播放| 亚洲色图一区二区三区| 欧美天堂一区二区三区| 日本成人在线视频网站| 欧美videos大乳护士334| 国产精品影音先锋| 国产精品久久久久婷婷| 色综合久久66| 午夜av电影一区| 欧美va天堂va视频va在线| 国产激情一区二区三区| 亚洲免费观看高清完整版在线 | 国产午夜一区二区三区| www.欧美日韩国产在线| 亚洲精品成人a在线观看| 69成人精品免费视频| 国产一区二区三区日韩| 成人欧美一区二区三区小说| 欧美日韩亚洲不卡| 国产在线视频精品一区| 国产精品久久久久久亚洲伦| 欧美日韩日日骚| 国产一区视频导航| 亚洲精品写真福利| 欧美v国产在线一区二区三区| 成人激情黄色小说| 日韩一区精品视频| 国产婷婷一区二区| 欧美日韩在线综合| 国产一区二区三区四区五区美女| 中文字幕在线播放不卡一区| 欧美三级韩国三级日本一级| 国产精品1区2区3区| 亚洲国产美国国产综合一区二区| 日韩免费观看高清完整版在线观看| 国产成人精品亚洲午夜麻豆| 亚洲成人手机在线| 久久精品夜夜夜夜久久| 欧美日韩1234| 成人黄页毛片网站| 免费看欧美女人艹b| 综合色中文字幕| 精品日本一线二线三线不卡| 91九色最新地址| 高清不卡一区二区| 免费观看日韩av| 亚洲人精品一区| 久久精品在线免费观看| 欧美人狂配大交3d怪物一区| 成人美女在线观看| 久久精品国产精品亚洲精品 | 国产精品1区2区3区| 午夜精品久久一牛影视| 国产精品成人在线观看|