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

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

?? miniport.c

?? NDIS Intermediate Driver
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*++

Copyright (c) 1992-2000  Microsoft Corporation

Module Name:

    miniport.c

Abstract:

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

Author:

Environment:


Revision History:


--*/

#include "precomp.h"
#pragma hdrstop



NDIS_STATUS
MPInitialize(
    OUT PNDIS_STATUS             OpenErrorStatus,
    OUT PUINT                    SelectedMediumIndex,
    IN  PNDIS_MEDIUM             MediumArray,
    IN  UINT                     MediumArraySize,
    IN  NDIS_HANDLE              MiniportAdapterHandle,
    IN  NDIS_HANDLE              WrapperConfigurationContext
    )
/*++

Routine Description:

    This is the initialize handler which gets called as a result of
    the BindAdapter handler calling NdisIMInitializeDeviceInstanceEx.
    The context parameter which we pass there is the adapter structure
    which we retrieve here.

    Arguments:

    OpenErrorStatus            Not used by us.
    SelectedMediumIndex        Place-holder for what media we are using
    MediumArray                Array of ndis media passed down to us to pick from
    MediumArraySize            Size of the array
    MiniportAdapterHandle    The handle NDIS uses to refer to us
    WrapperConfigurationContext    For use by NdisOpenConfiguration

Return Value:

    NDIS_STATUS_SUCCESS unless something goes wrong

--*/
{
    UINT            i;
    PADAPT          pAdapt;
    NDIS_STATUS     Status = NDIS_STATUS_FAILURE;
    NDIS_MEDIUM     Medium;

    UNREFERENCED_PARAMETER(WrapperConfigurationContext);
    
    do
    {
        //
        // Start off by retrieving our adapter context and storing
        // the Miniport handle in it.
        //
        pAdapt = NdisIMGetDeviceContext(MiniportAdapterHandle);
        pAdapt->MiniportHandle = MiniportAdapterHandle;

        DBGPRINT(("==> Miniport Initialize: Adapt %p\n", pAdapt));

        //
        // Usually we export the medium type of the adapter below as our
        // virtual miniport's medium type. However if the adapter below us
        // is a WAN device, then we claim to be of medium type 802.3.
        //
        Medium = pAdapt->Medium;

        if (Medium == NdisMediumWan)
        {
            Medium = NdisMedium802_3;
        }

        for (i = 0; i < MediumArraySize; i++)
        {
            if (MediumArray[i] == Medium)
            {
                *SelectedMediumIndex = i;
                break;
            }
        }

        if (i == MediumArraySize)
        {
            Status = NDIS_STATUS_UNSUPPORTED_MEDIA;
            break;
        }


        //
        // Set the attributes now. NDIS_ATTRIBUTE_DESERIALIZE enables us
        // to make up-calls to NDIS without having to call NdisIMSwitchToMiniport
        // or NdisIMQueueCallBack. This also forces us to protect our data using
        // spinlocks where appropriate. Also in this case NDIS does not queue
        // packets on our behalf. Since this is a very simple pass-thru
        // miniport, we do not have a need to protect anything. However in
        // a general case there will be a need to use per-adapter spin-locks
        // for the packet queues at the very least.
        //
        NdisMSetAttributesEx(MiniportAdapterHandle,
                             pAdapt,
                             0,                                        // CheckForHangTimeInSeconds
                             NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT    |
                                NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT|
                                NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER |
                                NDIS_ATTRIBUTE_DESERIALIZE |
                                NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND,
                             0);

        //
        // Initialize LastIndicatedStatus to be NDIS_STATUS_MEDIA_CONNECT
        //
        pAdapt->LastIndicatedStatus = NDIS_STATUS_MEDIA_CONNECT;
        
        //
        // Initialize the power states for both the lower binding (PTDeviceState)
        // and our miniport edge to Powered On.
        //
        pAdapt->MPDeviceState = NdisDeviceStateD0;

        //
        // Add this adapter to the global pAdapt List
        //
        NdisAcquireSpinLock(&GlobalLock);

        pAdapt->Next = pAdaptList;
        pAdaptList = pAdapt;

        NdisReleaseSpinLock(&GlobalLock);
        
        //
        // Create an ioctl interface
        //
        (VOID)PtRegisterDevice();

        Status = NDIS_STATUS_SUCCESS;
    }
    while (FALSE);

    //
    // If we had received an UnbindAdapter notification on the underlying
    // adapter, we would have blocked that thread waiting for the IM Init
    // process to complete. Wake up any such thread.
    //
    ASSERT(pAdapt->MiniportInitPending == TRUE);
    pAdapt->MiniportInitPending = FALSE;
    NdisSetEvent(&pAdapt->MiniportInitEvent);

    DBGPRINT(("<== Miniport Initialize: Adapt %p, Status %x\n", pAdapt, Status));

    *OpenErrorStatus = Status;
    
    return Status;
}


NDIS_STATUS
MPSend(
    IN NDIS_HANDLE             MiniportAdapterContext,
    IN PNDIS_PACKET            Packet,
    IN UINT                    Flags
    )
/*++

Routine Description:

    Send Packet handler. Either this or our SendPackets (array) handler is called
    based on which one is enabled in our Miniport Characteristics.

Arguments:

    MiniportAdapterContext    Pointer to the adapter
    Packet                    Packet to send
    Flags                     Unused, passed down below

Return Value:

    Return code from NdisSend

--*/
{
    PADAPT              pAdapt = (PADAPT)MiniportAdapterContext;
    NDIS_STATUS         Status;
    PNDIS_PACKET        MyPacket;
    PVOID               MediaSpecificInfo = NULL;
    ULONG               MediaSpecificInfoSize = 0;

    //
    // The driver should fail the send if the virtual miniport is in low 
    // power state
    //
    if (pAdapt->MPDeviceState > NdisDeviceStateD0)
    {
         return NDIS_STATUS_FAILURE;
    }

#ifdef NDIS51
    //
    // Use NDIS 5.1 packet stacking:
    //
    {
        PNDIS_PACKET_STACK        pStack;
        BOOLEAN                   Remaining;

        //
        // Packet stacks: Check if we can use the same packet for sending down.
        //

        pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining);
        if (Remaining)
        {
            //
            // We can reuse "Packet".
            //
            // NOTE: if we needed to keep per-packet information in packets
            // sent down, we can use pStack->IMReserved[].
            //
            ASSERT(pStack);
            //
            // If the below miniport is going to low power state, stop sending down any packet.
            //
            NdisAcquireSpinLock(&pAdapt->Lock);
            if (pAdapt->PTDeviceState > NdisDeviceStateD0)
            {
                NdisReleaseSpinLock(&pAdapt->Lock);
                return NDIS_STATUS_FAILURE;
            }
            pAdapt->OutstandingSends++;
            NdisReleaseSpinLock(&pAdapt->Lock);
            NdisSend(&Status,
                     pAdapt->BindingHandle,
                     Packet);

            if (Status != NDIS_STATUS_PENDING)
            {
                ADAPT_DECR_PENDING_SENDS(pAdapt);
            }

            return(Status);
        }
    }
#endif // NDIS51

    //
    // We are either not using packet stacks, or there isn't stack space
    // in the original packet passed down to us. Allocate a new packet
    // to wrap the data with.
    //
    //
    // If the below miniport is going to low power state, stop sending down any packet.
    //
    NdisAcquireSpinLock(&pAdapt->Lock);
    if (pAdapt->PTDeviceState > NdisDeviceStateD0)
    {
        NdisReleaseSpinLock(&pAdapt->Lock);
        return NDIS_STATUS_FAILURE;
    
    }
    pAdapt->OutstandingSends++;
    NdisReleaseSpinLock(&pAdapt->Lock);
    
    NdisAllocatePacket(&Status,
                       &MyPacket,
                       pAdapt->SendPacketPoolHandle);

    if (Status == NDIS_STATUS_SUCCESS)
    {
        PSEND_RSVD            SendRsvd;

        //
        // Save a pointer to the original packet in our reserved
        // area in the new packet. This is needed so that we can
        // get back to the original packet when the new packet's send
        // is completed.
        //
        SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved);
        SendRsvd->OriginalPkt = Packet;

        NdisGetPacketFlags(MyPacket) = Flags;

        //
        // Set up the new packet so that it describes the same
        // data as the original packet.
        //
        NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet);
        NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet);
#ifdef WIN9X
        //
        // Work around the fact that NDIS does not initialize this
        // to FALSE on Win9x.
        //
        NDIS_PACKET_VALID_COUNTS(MyPacket) = FALSE;
#endif

        //
        // Copy the OOB Offset from the original packet to the new
        // packet.
        //
        NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket),
                       NDIS_OOB_DATA_FROM_PACKET(Packet),
                       sizeof(NDIS_PACKET_OOB_DATA));

#ifndef WIN9X
        //
        // Copy the right parts of per packet info into the new packet.
        // This API is not available on Win9x since task offload is
        // not supported on that platform.
        //
        NdisIMCopySendPerPacketInfo(MyPacket, Packet);
#endif
        
        //
        // Copy the Media specific information
        //
        NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet,
                                            &MediaSpecificInfo,
                                            &MediaSpecificInfoSize);

        if (MediaSpecificInfo || MediaSpecificInfoSize)
        {
            NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket,
                                                MediaSpecificInfo,
                                                MediaSpecificInfoSize);
        }

        NdisSend(&Status,
                 pAdapt->BindingHandle,
                 MyPacket);


        if (Status != NDIS_STATUS_PENDING)
        {
#ifndef WIN9X
            NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
#endif
            NdisFreePacket(MyPacket);
            ADAPT_DECR_PENDING_SENDS(pAdapt);
        }
    }
    else
    {
        ADAPT_DECR_PENDING_SENDS(pAdapt);
        //
        // We are out of packets. Silently drop it. Alternatively we can deal with it:
        //    - By keeping separate send and receive pools
        //    - Dynamically allocate more pools as needed and free them when not needed
        //
    }

    return(Status);
}


VOID
MPSendPackets(
    IN NDIS_HANDLE             MiniportAdapterContext,
    IN PPNDIS_PACKET           PacketArray,
    IN UINT                    NumberOfPackets
    )
/*++

Routine Description:

    Send Packet Array handler. Either this or our SendPacket handler is called
    based on which one is enabled in our Miniport Characteristics.

Arguments:

    MiniportAdapterContext     Pointer to our adapter
    PacketArray                Set of packets to send
    NumberOfPackets            Self-explanatory

Return Value:

    None

--*/
{
    PADAPT              pAdapt = (PADAPT)MiniportAdapterContext;
    NDIS_STATUS         Status;
    UINT                i;
    PVOID               MediaSpecificInfo = NULL;
    UINT                MediaSpecificInfoSize = 0;
    

    for (i = 0; i < NumberOfPackets; i++)
    {
        PNDIS_PACKET    Packet, MyPacket;

        Packet = PacketArray[i];
        //
        // The driver should fail the send if the virtual miniport is in low 
        // power state
        //
        if (pAdapt->MPDeviceState > NdisDeviceStateD0)
        {
            NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                            Packet,
                            NDIS_STATUS_FAILURE);
            continue;
        }

#ifdef NDIS51

        //
        // Use NDIS 5.1 packet stacking:
        //
        {
            PNDIS_PACKET_STACK        pStack;
            BOOLEAN                   Remaining;

            //
            // Packet stacks: Check if we can use the same packet for sending down.
            //
            pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining);
            if (Remaining)
            {
                //
                // We can reuse "Packet".
                //
                // NOTE: if we needed to keep per-packet information in packets
                // sent down, we can use pStack->IMReserved[].
                //
                ASSERT(pStack);
                //
                // If the below miniport is going to low power state, stop sending down any packet.
                //
                NdisAcquireSpinLock(&pAdapt->Lock);
                if (pAdapt->PTDeviceState > NdisDeviceStateD0)
                {
                    NdisReleaseSpinLock(&pAdapt->Lock);
                    NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                                        Packet,
                                        NDIS_STATUS_FAILURE);
                }
                else
                {
                    pAdapt->OutstandingSends++;
                    NdisReleaseSpinLock(&pAdapt->Lock);
                
                    NdisSend(&Status,
                              pAdapt->BindingHandle,
                              Packet);
        
                    if (Status != NDIS_STATUS_PENDING)
                    {
                        NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                                            Packet,
                                            Status);
                   
                        ADAPT_DECR_PENDING_SENDS(pAdapt);
                    }
                }
                continue;
            }
        }
#endif
        do 
        {
            NdisAcquireSpinLock(&pAdapt->Lock);
            //
            // If the below miniport is going to low power state, stop sending down any packet.
            //

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产综合成人久久大片91| 日韩免费性生活视频播放| 成人国产精品免费观看动漫| 国产在线国偷精品免费看| 精品一区二区三区在线观看国产| 视频一区二区三区在线| 偷偷要91色婷婷| 蜜桃视频第一区免费观看| 久久电影网站中文字幕| 国模无码大尺度一区二区三区| 韩国视频一区二区| 国产成人欧美日韩在线电影| 国产sm精品调教视频网站| av在线一区二区| 91久久奴性调教| 欧美久久一二三四区| 精品久久久久久久人人人人传媒| 久久久久久久综合日本| 亚洲欧美综合另类在线卡通| 亚洲一区二区三区视频在线| 人人超碰91尤物精品国产| 精品午夜久久福利影院| 不卡高清视频专区| 欧美性受极品xxxx喷水| 91精品国产色综合久久久蜜香臀| 精品国产凹凸成av人网站| 久久九九国产精品| 一区二区三区四区不卡视频| 日日夜夜免费精品| 国产成人aaa| 在线精品亚洲一区二区不卡| 亚洲精品美国一| 日韩高清一区二区| 国产黄人亚洲片| 日本道色综合久久| 精品日韩一区二区三区免费视频| 中文字幕不卡三区| 午夜免费欧美电影| 国产精品小仙女| 欧美日韩精品欧美日韩精品| 久久久综合精品| 一区二区三区在线看| 寂寞少妇一区二区三区| 91麻豆国产自产在线观看| 日韩三级视频在线看| 中文字幕一区二区三区四区| 午夜不卡av在线| 不卡一二三区首页| 日韩欧美国产综合一区| 亚洲人成影院在线观看| 蜜桃视频一区二区| 91豆麻精品91久久久久久| 2017欧美狠狠色| 亚洲一级电影视频| 国产一区二区h| 欧美高清精品3d| 国产精品美女久久久久aⅴ| 日本成人中文字幕在线视频 | 国产精品亚洲一区二区三区在线| 91香蕉视频污| 久久在线观看免费| 亚洲成人动漫精品| 91一区二区在线| 久久久综合网站| 日本中文字幕不卡| 在线观看欧美黄色| 中文字幕av一区二区三区免费看| 日韩国产精品久久久| 色综合色综合色综合色综合色综合 | 91天堂素人约啪| 久久综合av免费| 视频一区中文字幕| 欧美在线短视频| 亚洲视频一区二区在线观看| 国产成人综合网站| 精品黑人一区二区三区久久| 亚洲一线二线三线久久久| 懂色av一区二区三区免费观看 | 国产日韩精品视频一区| 亚洲第一久久影院| 色婷婷久久一区二区三区麻豆| 久久精品人人做人人综合 | 亚洲va国产va欧美va观看| caoporn国产精品| 久久视频一区二区| 久久国产精品色婷婷| 6080午夜不卡| 午夜精品视频在线观看| 91成人在线观看喷潮| 国产精品国产三级国产a| 国产成人午夜99999| 久久人人爽爽爽人久久久| 麻豆国产一区二区| 91精品视频网| 午夜av一区二区| 欧美老肥妇做.爰bbww视频| 一区二区三区**美女毛片| 不卡av电影在线播放| 久久久久久久久久久久久久久99| 麻豆精品一区二区三区| 欧美mv日韩mv国产网站app| 久久精品72免费观看| 日韩视频免费观看高清完整版在线观看| 亚洲成av人片观看| 91精品一区二区三区久久久久久| 亚洲国产一区二区视频| 欧美日韩成人综合在线一区二区 | 在线一区二区三区做爰视频网站| √…a在线天堂一区| jlzzjlzz亚洲日本少妇| 亚洲色欲色欲www在线观看| 在线视频一区二区免费| 亚洲成人动漫精品| 日韩女优av电影| 精品一区二区在线视频| 国产亚洲欧美日韩日本| proumb性欧美在线观看| 伊人夜夜躁av伊人久久| 欧美亚男人的天堂| 美洲天堂一区二卡三卡四卡视频| 精品成人在线观看| 成人av午夜影院| 亚洲视频一二三| 欧美日韩综合色| 麻豆久久一区二区| 国产精品久久久久永久免费观看| 91免费视频网址| 午夜激情一区二区三区| 欧美成人video| 国产成人免费高清| 亚洲视频在线观看一区| 在线播放91灌醉迷j高跟美女 | 亚洲一区二区美女| 91精品中文字幕一区二区三区| 精品一区二区三区在线观看| 国产精品欧美极品| 在线观看国产一区二区| 麻豆免费看一区二区三区| 国产精品天美传媒沈樵| 在线观看不卡一区| 久久er精品视频| 中文字幕五月欧美| 欧美日韩一区二区在线观看 | 国产成人一区在线| 一区二区三区四区亚洲| 欧美xfplay| av在线不卡电影| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产日本欧美一区二区| 欧美日韩在线精品一区二区三区激情| 久久国产日韩欧美精品| 亚洲欧美综合色| 欧美成人三级在线| 欧美在线免费观看亚洲| 国产一区二区三区av电影| 亚洲男人都懂的| 精品成人一区二区三区四区| 在线免费av一区| 国产成人精品免费看| 日韩主播视频在线| 国产精品成人一区二区三区夜夜夜| 欧美精品久久一区| 91麻豆国产在线观看| 国产精品888| 丝袜美腿一区二区三区| 中文字幕一区二区三区蜜月| 日韩视频国产视频| 欧美写真视频网站| 国产91清纯白嫩初高中在线观看 | 国产精品 欧美精品| 香蕉成人伊视频在线观看| 国产精品午夜春色av| 日韩精品一区二区三区蜜臀 | 亚洲精品在线观| 7777女厕盗摄久久久| 在线中文字幕一区二区| 成人av免费在线观看| 九一久久久久久| 午夜久久久久久久久| 亚洲人午夜精品天堂一二香蕉| 国产日韩影视精品| 欧美va亚洲va在线观看蝴蝶网| 在线免费视频一区二区| www.久久久久久久久| 国产精品一区二区久久不卡| 蜜桃在线一区二区三区| 午夜国产不卡在线观看视频| 亚洲精品写真福利| ㊣最新国产の精品bt伙计久久| 久久精品视频免费| 久久中文字幕电影| 久久综合九色综合97_久久久| 日韩三级电影网址| 欧美一区午夜精品| 51午夜精品国产| 欧美巨大另类极品videosbest| 欧美性色欧美a在线播放| 欧美亚洲日本国产| 欧洲一区在线观看| 色老汉一区二区三区|