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

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

?? 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);
        }

    }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91免费版在线| 日韩电影免费在线| 波多野结衣中文字幕一区 | 在线免费不卡电影| 亚洲精品视频自拍| 欧美性猛交xxxx黑人交| 日韩av电影一区| 精品日韩在线观看| 国产一区二区在线免费观看| 国产精品久久影院| 色综合久久久久综合99| 亚洲aaa精品| 欧美成人免费网站| 不卡视频一二三| 亚洲国产日韩精品| 日韩女优av电影在线观看| 国产精品亚洲а∨天堂免在线| 亚洲国产成人在线| 欧美色图片你懂的| 久久99在线观看| 亚洲欧美自拍偷拍| 欧美精品成人一区二区三区四区| 精品一区二区av| 国产精品你懂的| 欧美久久一区二区| 国产精品18久久久| 亚洲第一福利一区| 国产肉丝袜一区二区| 色哟哟国产精品免费观看| 麻豆成人久久精品二区三区红| 国产精品网友自拍| 欧美一区二区三区思思人| 成人一区二区视频| 日韩有码一区二区三区| 国产精品三级av| 91精品国产高清一区二区三区| 国产福利91精品一区| 亚洲成人福利片| 国产精品视频九色porn| 在线综合视频播放| 色婷婷综合久久久中文一区二区| 韩国女主播成人在线| 亚洲一区在线观看视频| 久久这里只有精品首页| 欧美日韩国产首页| 成人黄色网址在线观看| 久久69国产一区二区蜜臀| 亚洲精品国产第一综合99久久| 久久综合色综合88| 欧美精品tushy高清| 色呦呦国产精品| 国产精品羞羞答答xxdd| 男人的j进女人的j一区| 亚洲国产一区二区视频| 亚洲欧洲无码一区二区三区| 久久一二三国产| 欧美一区二区三区四区五区| 91国偷自产一区二区三区成为亚洲经典 | 色婷婷精品久久二区二区蜜臀av| 国内精品自线一区二区三区视频| 亚洲va欧美va人人爽午夜| ●精品国产综合乱码久久久久| 久久久国产综合精品女国产盗摄| 91精品国产日韩91久久久久久| 91国产成人在线| 91美女视频网站| 91网站在线观看视频| 成a人片亚洲日本久久| 国产成人综合亚洲91猫咪| 国产一区二区在线影院| 国产一区二区视频在线| 韩国欧美国产一区| 国产经典欧美精品| 国产麻豆成人精品| 国产91丝袜在线播放九色| 国产精品一二二区| 成人亚洲一区二区一| av中文一区二区三区| 波多野结衣在线一区| 99久久精品99国产精品 | 亚洲婷婷在线视频| 国产精品看片你懂得| 国产精品国产三级国产专播品爱网| 国产精品视频yy9299一区| 国产精品国产精品国产专区不蜜| 中文字幕一区不卡| 亚洲男人的天堂av| 亚洲国产精品影院| 天堂久久久久va久久久久| 青青草国产精品亚洲专区无| 免费欧美在线视频| 国产成人免费视| 99久精品国产| 欧美视频精品在线观看| 69p69国产精品| 欧美精品一区二区三区久久久| 国产日韩欧美一区二区三区综合| 中文字幕欧美国产| 一区二区三区不卡视频| 五月天欧美精品| 黄色小说综合网站| 处破女av一区二区| 在线观看中文字幕不卡| 日韩精品一区在线| 欧美激情一区二区三区全黄 | 国产欧美一区二区精品忘忧草| 欧美高清一级片在线观看| 亚洲免费观看在线视频| 日韩高清欧美激情| 国产成人免费视频一区| 一本在线高清不卡dvd| 91精品国产乱| 国产亚洲成av人在线观看导航| 亚洲日本在线视频观看| 日韩成人一级片| 亚洲免费在线视频| 久久综合狠狠综合| 成人欧美一区二区三区黑人麻豆 | 久久久777精品电影网影网 | 欧美sm美女调教| 国产精品电影一区二区三区| 香港成人在线视频| 国产中文字幕一区| 欧美性受xxxx黑人xyx性爽| 日韩视频不卡中文| 亚洲视频 欧洲视频| 久久福利视频一区二区| 色视频成人在线观看免| 久久这里只精品最新地址| 亚洲黄色片在线观看| 国模大尺度一区二区三区| 欧美性大战xxxxx久久久| 国产日韩成人精品| 老司机精品视频线观看86| 色婷婷av久久久久久久| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲国产日韩精品| 99久久精品国产一区二区三区| 欧美成人艳星乳罩| 亚洲国产日产av| 99国产精品国产精品毛片| 精品福利av导航| 婷婷综合久久一区二区三区| 99久久99久久综合| 国产亚洲欧美日韩日本| 美女网站视频久久| 欧美日韩一级二级三级| 亚洲乱码国产乱码精品精小说| 国产精品一区二区91| 日韩欧美一卡二卡| 日韩1区2区日韩1区2区| 欧美日韩美女一区二区| 亚洲综合一区二区三区| 91看片淫黄大片一级在线观看| 国产欧美日韩中文久久| 国产毛片一区二区| 精品女同一区二区| 久久99精品久久久久婷婷| 3d成人h动漫网站入口| 亚洲成人av中文| 欧洲一区二区三区在线| 亚洲精品欧美激情| 91网址在线看| 亚洲宅男天堂在线观看无病毒| 色哟哟亚洲精品| 亚洲精品国产精品乱码不99| 色激情天天射综合网| 亚洲卡通动漫在线| 在线观看一区日韩| 亚欧色一区w666天堂| 777亚洲妇女| 日韩电影在线免费观看| 日韩欧美一级特黄在线播放| 精品一区二区免费在线观看| 精品久久久久一区二区国产| 精品一区二区免费| 国产欧美一区二区在线观看| 成人综合婷婷国产精品久久免费| 国产精品久久久久三级| 91农村精品一区二区在线| 一区二区成人在线| 欧美视频自拍偷拍| 另类人妖一区二区av| 久久久久久免费网| 波多野结衣一区二区三区 | 欧美在线一二三| 天堂蜜桃一区二区三区| 精品国产伦理网| 粉嫩高潮美女一区二区三区| 亚洲乱码日产精品bd| 欧美精品xxxxbbbb| 国产盗摄女厕一区二区三区| 成人欧美一区二区三区| 欧美三级乱人伦电影| 久久精品国产免费看久久精品| 国产精品―色哟哟| 91搞黄在线观看| 国产真实乱子伦精品视频| 国产精品久久久久久户外露出| 欧美亚洲高清一区|