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

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

?? protocol.c

?? NDIS Intermediate Driver
?? 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;
        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);

        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;
        }
        
        pAdapt->PTDeviceState = NdisDeviceStateD0;

        //
        // 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;
                }
            }

            if (pAdapt->SendPacketPoolHandle != NULL)
            {
                 NdisFreePacketPool(pAdapt->SendPacketPoolHandle);
            }

            if (pAdapt->RecvPacketPoolHandle != NULL)
            {
                 NdisFreePacketPool(pAdapt->RecvPacketPoolHandle);
            }
            
            if (LockAllocated == TRUE)
            {
                NdisFreeSpinLock(&pAdapt->Lock);
            }

            NdisFreeMemory(pAdapt, 0, 0);
            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;
    PNDIS_PACKET   PacketArray[MAX_RECEIVE_PACKET_ARRAY_SIZE];
    ULONG          NumberOfPackets = 0, i;
    BOOLEAN        CompleteRequest = FALSE;
    BOOLEAN        ReturnPackets = FALSE;

    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;
        CompleteRequest = TRUE;
    }
    if (pAdapt->ReceivedPacketCount > 0)
    {

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

        NumberOfPackets = pAdapt->ReceivedPacketCount;

        pAdapt->ReceivedPacketCount = 0;
        ReturnPackets = TRUE;
    }
        
        
    NdisReleaseSpinLock(&pAdapt->Lock);

    if (CompleteRequest == TRUE)
    {
        PtRequestComplete(pAdapt,
                         &pAdapt->Request,
                         NDIS_STATUS_FAILURE );

    }
    if (ReturnPackets == TRUE)
    {
        for (i = 0; i < NumberOfPackets; i++)
        {
            MPReturnPacket(pAdapt, PacketArray[i]);
        }
    }

    
#ifndef WIN9X
    //
    // Check if we had called NdisIMInitializeDeviceInstanceEx and
    // we are awaiting a call to MiniportInitialize.
    //
    if (pAdapt->MiniportInitPending == TRUE)
    {
        //
        // Try to cancel the pending IMInit process.
        //
        LocalStatus = NdisIMCancelInitializeDeviceInstance(
                        DriverHandle,
                        &pAdapt->DeviceName);

        if (LocalStatus == NDIS_STATUS_SUCCESS)
        {
            //
            // Successfully cancelled IM Initialization; our
            // Miniport Initialize routine will not be called
            // for this device.
            //
            pAdapt->MiniportInitPending = FALSE;
            ASSERT(pAdapt->MiniportHandle == NULL);
        }
        else
        {
            //
            // Our Miniport Initialize routine will be called
            // (may be running on another thread at this time).
            // Wait for it to finish.
            //
            NdisWaitEvent(&pAdapt->MiniportInitEvent, 0);
            ASSERT(pAdapt->MiniportInitPending == FALSE);
        }

    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区三区很污很色的 | 成人深夜在线观看| 精品精品欲导航| 激情丁香综合五月| 久久久久久久久久久久久夜| 国产成人在线免费| 久久久高清一区二区三区| 成人午夜激情片| 亚洲猫色日本管| 欧美日韩色综合| www.成人网.com| 成人免费高清在线观看| 欧美成人精品1314www| 精品人在线二区三区| 国产精品福利影院| 亚洲成人av一区二区| 国产在线乱码一区二区三区| 成人av午夜影院| 欧美一区二区人人喊爽| 国产色爱av资源综合区| 亚洲一区免费观看| 麻豆91精品91久久久的内涵| 久久精品一区二区三区不卡| 色婷婷一区二区| 麻豆精品一区二区综合av| 亚洲国产激情av| 欧美亚洲日本一区| 国产又粗又猛又爽又黄91精品| 中文字幕欧美激情| 7777精品伊人久久久大香线蕉最新版 | 国产风韵犹存在线视精品| 亚洲精品老司机| 欧美成人性战久久| 一本色道久久综合亚洲91| 毛片av一区二区| 亚洲欧美国产高清| 精品伦理精品一区| 欧美一a一片一级一片| 国产在线播精品第三| 亚洲尤物在线视频观看| 精品国内片67194| 日本高清视频一区二区| 国产福利一区在线观看| 婷婷丁香激情综合| 亚洲色图在线播放| 久久久久88色偷偷免费| 在线电影欧美成精品| 成人高清视频免费观看| 久久国产精品99精品国产| 亚洲香肠在线观看| 中文在线资源观看网站视频免费不卡| 欧美麻豆精品久久久久久| 91麻豆免费观看| 懂色av中文字幕一区二区三区| 日韩精品一二区| 亚洲一区二区中文在线| 中文字幕佐山爱一区二区免费| 久久亚洲综合色| 欧美大胆人体bbbb| 欧美一区二区精品| 欧美日韩视频不卡| 欧美在线你懂得| 色婷婷综合激情| 95精品视频在线| 久久久www免费人成精品| 精品黑人一区二区三区久久| 欧美一区欧美二区| 蜜桃精品视频在线| 日韩精品一区二区三区视频播放| 日韩电影在线观看一区| 最新国产の精品合集bt伙计| 日韩影院精彩在线| 日本成人在线一区| 久久精品国产精品亚洲综合| 国产91清纯白嫩初高中在线观看| 欧美日韩一区二区在线观看视频 | 亚洲日本va午夜在线电影| 精品国产一区二区三区久久久蜜月| 国产成人在线色| 久久超级碰视频| 日本不卡123| 91蜜桃传媒精品久久久一区二区| 精品在线观看免费| 麻豆精品视频在线观看| 午夜激情一区二区| 日韩av二区在线播放| 亚洲风情在线资源站| 亚洲精品国产第一综合99久久 | 国产成人精品一区二区三区四区| 精品一区二区精品| 国产乱人伦偷精品视频不卡| 韩国精品主播一区二区在线观看 | 亚洲欧美综合网| 亚洲欧美另类久久久精品 | 亚洲午夜激情av| 日产欧产美韩系列久久99| 日韩av电影免费观看高清完整版 | 欧美电影在哪看比较好| 91精品国产入口| 精品久久久网站| 欧美激情艳妇裸体舞| 中文字幕一区在线观看| 亚洲影院在线观看| 美女任你摸久久| 国产女人18水真多18精品一级做| 亚洲欧美一区二区三区孕妇| 91丝袜呻吟高潮美腿白嫩在线观看| 成人国产精品免费网站| 高清久久久久久| 不卡一二三区首页| 日韩一区二区电影| 亚洲欧美日韩精品久久久久| 色综合久久综合中文综合网| 精品国产一区二区三区不卡| 激情文学综合插| 国产精品夫妻自拍| 宅男在线国产精品| 成人美女视频在线观看| 亚洲色图在线看| 日韩三级中文字幕| 国产一区二区h| 在线视频你懂得一区| 国产精品青草综合久久久久99| 午夜伦理一区二区| 在线看国产一区二区| 久久你懂得1024| 人人爽香蕉精品| 欧美精品 国产精品| 亚洲国产精品精华液ab| 亚洲自拍都市欧美小说| 欧美日韩午夜影院| 国内精品久久久久影院薰衣草| 成人白浆超碰人人人人| 欧美日韩国产区一| 日韩一区二区在线播放| 欧美国产丝袜视频| 日本不卡一二三区黄网| 色哟哟一区二区三区| 亚洲三级在线播放| 欧美日本高清视频在线观看| 日韩av午夜在线观看| 亚洲永久免费视频| 亚洲欧洲成人精品av97| 欧美α欧美αv大片| 91精品国产综合久久国产大片| 91久久久免费一区二区| 91亚洲精品一区二区乱码| 成人福利视频网站| 成人免费毛片a| 亚洲午夜久久久久久久久电影院| 欧美二区三区91| 99久久免费国产| 久久激情五月激情| 国产亚洲一区字幕| 91精品在线观看入口| 激情综合网激情| 亚洲精品菠萝久久久久久久| 8v天堂国产在线一区二区| 秋霞成人午夜伦在线观看| 777色狠狠一区二区三区| 欧美唯美清纯偷拍| 日韩二区三区四区| 在线电影欧美成精品| 亚洲成a天堂v人片| 亚洲欧洲日产国产综合网| 欧美成人一区二区| 日韩一级片网站| 亚洲va欧美va人人爽| 久久久777精品电影网影网| 亚洲福利视频一区| 国产精品一线二线三线精华| 色综合天天综合网天天看片| 91麻豆精品国产91久久久| 亚洲精品在线三区| 亚洲小少妇裸体bbw| 国产99久久久精品| 成人亚洲一区二区一| 成人久久视频在线观看| 激情深爱一区二区| 精品在线播放午夜| 国产精品一区在线观看你懂的| 蜜臀精品一区二区三区在线观看 | 亚洲一级在线观看| 色美美综合视频| 成人午夜碰碰视频| 成人av在线看| 99国产精品国产精品久久| 懂色av一区二区夜夜嗨| 欧美性猛交xxxx黑人交| 97se亚洲国产综合在线| 99精品桃花视频在线观看| 丁香网亚洲国际| 91在线小视频| www.av亚洲| 欧美精品一区二区三区视频| 日韩一卡二卡三卡| 欧美剧在线免费观看网站| 色综合天天综合网国产成人综合天| 精品在线免费视频| 蜜臀av性久久久久av蜜臀妖精|