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

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

?? miniport.c

?? <Visual C++ 網(wǎng)絡(luò)程序設(shè)計實例詳解>配套源碼
?? 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;
        pAdapt->PTDeviceState = 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;
    }

// BEGIN_PTEX_FILTER
   //
   // 調(diào)用過濾發(fā)送封包的函數(shù),調(diào)用者運行在DISPATCH_LEVEL IRQL級別
   //
   if(!FltFilterSendPacket(pAdapt,Packet,TRUE))
   {
	   //
	   // 如果拒絕的話,就欺騙上層,說已經(jīng)發(fā)送成功了(雖然并沒有真正地發(fā)送)
	   //
	   return NDIS_STATUS_SUCCESS;
   }
// END_PTEX_FILTER

#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;

        MyPacket->Private.Flags = Flags;

        //
        // Set up the new packet so that it describes the same
        // data as the original packet.
        //
        MyPacket->Private.Head = Packet->Private.Head;
        MyPacket->Private.Tail = Packet->Private.Tail;
#ifdef WIN9X
        //
        // Work around the fact that NDIS does not initialize this
        // to FALSE on Win9x.
        //
        MyPacket->Private.ValidCounts = 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;
        }

// BEGIN_PTEX_FILTER
   //
   // 調(diào)用過濾發(fā)送封包的函數(shù),調(diào)用者運行在IRQL <= DISPATCH_LEVEL級別
   //
   if(!FltFilterSendPacket(pAdapt,Packet,FALSE))
   { 
	   //
	   // 如果拒絕的話,就欺騙上層,說已經(jīng)發(fā)送成功了(雖然并沒有真正地發(fā)送)
	   //
	   NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                            Packet,
                            NDIS_STATUS_SUCCESS);

	   continue;
   }
// END_PTEX_FILTER

#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)
                    {

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区999| 中文字幕一区视频| 日本怡春院一区二区| 在线不卡的av| 美洲天堂一区二卡三卡四卡视频| 欧美一级搡bbbb搡bbbb| 蜜臀久久99精品久久久久久9 | 欧美性猛片xxxx免费看久爱| 玉米视频成人免费看| 欧美日韩久久久久久| 美女一区二区在线观看| 国产午夜精品久久| 99re这里只有精品6| 亚洲一区二区视频| 日韩一区二区免费在线电影| 狠狠色丁香久久婷婷综合_中| 国产精品欧美久久久久一区二区| 97精品久久久午夜一区二区三区 | 日韩二区在线观看| 精品免费日韩av| 91一区在线观看| 天堂在线一区二区| 久久精品日韩一区二区三区| 99r国产精品| 日本成人在线一区| 国产精品无人区| 欧美日韩日日夜夜| 懂色av一区二区三区免费看| 一区二区三区在线观看网站| 精品免费99久久| 色久综合一二码| 精久久久久久久久久久| 亚洲欧美一区二区三区国产精品 | 2021国产精品久久精品| 色欧美乱欧美15图片| 日韩福利电影在线| 亚洲女同ⅹxx女同tv| 日韩精品一区二| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲电影一级片| 亚洲国产精品av| 欧美欧美欧美欧美| 色呦呦网站一区| 国产伦理精品不卡| 午夜精品久久久| 中文字幕一区二区三区在线不卡 | 精品区一区二区| 91成人网在线| 成人激情免费电影网址| 男女男精品视频| 亚洲综合在线五月| 国产精品久久久久久久裸模| 欧美精品一区二区三区视频 | 欧美一区二区美女| 一本色道久久综合狠狠躁的推荐 | 亚洲男女毛片无遮挡| 久久久无码精品亚洲日韩按摩| 欧美日韩小视频| 91福利视频网站| 色哟哟亚洲精品| 99久久国产综合色|国产精品| 精品一区二区三区蜜桃| 日韩av一区二| 日韩精品一二区| 日韩中文字幕不卡| 五月激情综合网| 五月激情综合网| 亚洲chinese男男1069| 一区二区三区欧美在线观看| 亚洲欧洲日产国产综合网| 国产女人18毛片水真多成人如厕 | 欧美疯狂性受xxxxx喷水图片| 一本久久精品一区二区| 不卡的av网站| 国产一区二区伦理片| 久久成人免费日本黄色| 蜜桃久久久久久久| 免费成人av资源网| 久久不见久久见免费视频1| 日本不卡一二三区黄网| 青青草国产成人99久久| 精品一区二区影视| 国产主播一区二区三区| 国产在线视频不卡二| 91美女在线观看| 国产成人精品一区二| 丁香婷婷综合激情五月色| 国产99久久久国产精品潘金| 成人午夜又粗又硬又大| 成人福利视频网站| 91麻豆文化传媒在线观看| 99国产精品久| 欧美日韩一区二区三区高清| 制服丝袜亚洲播放| 精品区一区二区| 中文字幕高清一区| 亚洲欧美偷拍另类a∨色屁股| 亚洲精品乱码久久久久久日本蜜臀| 亚洲男人天堂一区| 青青草伊人久久| 丁香天五香天堂综合| 欧美亚洲另类激情小说| 91精品国产综合久久婷婷香蕉 | 成人午夜激情片| 91天堂素人约啪| 4438x成人网最大色成网站| 精品国产一二三| 国产精品进线69影院| 亚洲 欧美综合在线网络| 久久国产精品第一页| 成人sese在线| 欧美日韩国产一二三| 精品国产乱码久久| 亚洲欧美国产77777| 免费成人你懂的| av在线免费不卡| 欧美高清www午色夜在线视频| 国产午夜精品在线观看| 亚洲一区在线免费观看| 久久99在线观看| 91视频一区二区| 日韩精品一区二区三区三区免费| 亚洲欧美怡红院| 免费高清视频精品| 91网站在线播放| 久久九九国产精品| 午夜激情一区二区三区| 成人午夜视频网站| 欧美肥大bbwbbw高潮| 国产精品国产三级国产aⅴ中文| 日韩av电影免费观看高清完整版| 国产成人亚洲精品青草天美| 欧美日韩1区2区| 最新高清无码专区| 国内精品自线一区二区三区视频| 欧美这里有精品| 中文字幕欧美三区| 理论电影国产精品| 欧美丝袜丝交足nylons| 国产精品无遮挡| 国产综合久久久久久鬼色| 在线观看91精品国产麻豆| 亚洲欧洲精品一区二区三区 | 欧美国产精品中文字幕| 青青草国产成人99久久| 欧洲精品视频在线观看| 国产精品乱码一区二区三区软件| 美女网站一区二区| 欧美麻豆精品久久久久久| 亚洲乱码国产乱码精品精98午夜| 国模冰冰炮一区二区| 日韩欧美一二三| 亚洲成人午夜影院| 欧美视频精品在线观看| 亚洲综合一区二区三区| 91蜜桃免费观看视频| 亚洲日韩欧美一区二区在线| 国产精品影视网| 久久在线观看免费| 久久国产精品一区二区| 欧美成人伊人久久综合网| 日韩精品久久久久久| 欧美日韩成人在线| 亚洲国产日日夜夜| 欧美日韩国产高清一区| 亚洲一区二区三区免费视频| 91官网在线免费观看| 亚洲黄一区二区三区| 色综合久久99| 亚洲国产精品久久久久婷婷884| 色综合久久久久| 亚洲午夜电影在线观看| 欧美视频精品在线| 午夜在线成人av| 日韩一区二区三区观看| 蜜乳av一区二区| 久久亚洲私人国产精品va媚药| 久久99蜜桃精品| 国产午夜精品久久久久久免费视| 国产成人精品免费一区二区| 国产精品无人区| 日本精品一区二区三区四区的功能| 亚洲美女视频一区| 欧美日韩一区二区在线观看视频| 亚洲二区在线视频| 欧美一区二区三级| 国产二区国产一区在线观看| 国产精品欧美综合在线| 91麻豆国产自产在线观看| 亚洲国产精品久久一线不卡| 69堂亚洲精品首页| 精品一区二区久久久| 中文字幕精品—区二区四季| 色婷婷国产精品久久包臀| 亚洲成a人片在线不卡一二三区| 欧美一区二区国产| 懂色一区二区三区免费观看 | 国产精品美女久久久久久2018| 91视频一区二区| 久久成人免费电影|