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

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

?? miniport.c

?? vc++網絡程序設計實例詳解 人民郵電出版社5-6章源碼
?? 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
   //
   // 調用過濾發送封包的函數,調用者運行在DISPATCH_LEVEL IRQL級別
   //
   if(!FltFilterSendPacket(pAdapt,Packet,TRUE))
   {
	   //
	   // 如果拒絕的話,就欺騙上層,說已經發送成功了(雖然并沒有真正地發送)
	   //
	   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
   //
   // 調用過濾發送封包的函數,調用者運行在IRQL <= DISPATCH_LEVEL級別
   //
   if(!FltFilterSendPacket(pAdapt,Packet,FALSE))
   { 
	   //
	   // 如果拒絕的話,就欺騙上層,說已經發送成功了(雖然并沒有真正地發送)
	   //
	   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)
                    {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩欧美电影| 精品中文字幕一区二区小辣椒| 亚洲午夜激情网页| 国产一区在线看| 在线免费观看不卡av| 亚洲国产精品久久艾草纯爱| 国产麻豆视频精品| 欧美日韩一区二区在线观看 | 久久精品国产网站| 91日韩精品一区| 久久久www免费人成精品| 亚洲mv大片欧洲mv大片精品| 成人高清视频在线| 久久精品亚洲麻豆av一区二区| 午夜激情一区二区| 色综合久久久久综合| 国产午夜精品在线观看| 另类小说视频一区二区| 欧美主播一区二区三区| 最近中文字幕一区二区三区| 国产精品18久久久久久久久 | 色婷婷综合久色| 久久精品一区二区三区不卡| 九九九精品视频| 欧美一二三区在线观看| 午夜成人免费视频| 欧美日本精品一区二区三区| 亚洲乱码中文字幕综合| 91蜜桃在线免费视频| 亚洲同性同志一二三专区| 7777精品伊人久久久大香线蕉经典版下载| 亚洲色图20p| 91色综合久久久久婷婷| 亚洲三级小视频| 91丨九色丨蝌蚪丨老版| 亚洲伦理在线精品| 欧美性大战久久久久久久| 亚洲一区二区三区中文字幕在线| 91久久奴性调教| 亚洲一区二区三区四区在线观看 | 国产一区二区看久久| 精品国产a毛片| 精品一区二区三区久久| 久久久精品2019中文字幕之3| 老司机精品视频一区二区三区| 91精品国产乱| 精品一区二区三区免费播放| 国产亚洲人成网站| 成人av网站免费| 亚洲线精品一区二区三区| 欧美人伦禁忌dvd放荡欲情| 亚洲超丰满肉感bbw| 日韩午夜激情免费电影| 国产高清不卡一区二区| 国产精品久久久久精k8| 91福利在线播放| 色屁屁一区二区| 午夜视频在线观看一区二区三区| 欧美一级二级三级蜜桃| 国产91对白在线观看九色| 亚洲久草在线视频| 欧美一区二区三区影视| 国产精品资源在线| 亚洲精品国产精品乱码不99 | 成人综合日日夜夜| 一区二区三区在线视频观看58 | 成人av网站在线观看免费| 亚洲精品国产a久久久久久 | 91捆绑美女网站| 日韩成人伦理电影在线观看| 国产视频一区在线播放| 欧美午夜寂寞影院| 黑人巨大精品欧美黑白配亚洲| 国产精品成人一区二区三区夜夜夜 | 97久久超碰国产精品| 午夜天堂影视香蕉久久| 中文字幕免费在线观看视频一区| 欧美日韩一区久久| 成人免费视频视频| 日本不卡视频一二三区| 国产精品不卡一区二区三区| 日韩欧美在线综合网| 97精品国产露脸对白| 男人的j进女人的j一区| 综合中文字幕亚洲| 欧美精品一区二| 欧美日韩一区成人| 99免费精品视频| 久久99久久精品| 亚洲国产一二三| 国产精品久久久久久久久搜平片 | 日韩一区二区中文字幕| 99久久精品一区二区| 激情图区综合网| 婷婷开心激情综合| 亚洲黄色小视频| 中文字幕第一区二区| 欧美电视剧免费全集观看| 欧美无砖专区一中文字| 91同城在线观看| 成人午夜视频在线| 国产精品亚洲视频| 国精品**一区二区三区在线蜜桃| 午夜av区久久| 亚洲.国产.中文慕字在线| 一区二区三区在线观看欧美| 国产精品久久三| 中文字幕电影一区| 国产欧美日韩精品在线| 久久久久国产成人精品亚洲午夜| 日韩精品一区二区三区在线观看| 欧美人体做爰大胆视频| 欧美精选在线播放| 欧美日韩国产小视频在线观看| 在线观看不卡一区| 欧美在线观看一区二区| 日本道免费精品一区二区三区| 93久久精品日日躁夜夜躁欧美| 丁香婷婷综合网| 99视频一区二区| 91蝌蚪porny成人天涯| 91久久线看在观草草青青| 色94色欧美sute亚洲线路一ni| 色欧美片视频在线观看在线视频| 91麻豆免费看片| 欧美日韩国产一区二区三区地区| 欧美日韩高清一区二区| 欧美一区二区精品久久911| 日韩女优av电影| 久久精品视频一区二区| 国产欧美一区二区精品性色超碰| 国产精品三级电影| 成人免费一区二区三区在线观看| 日韩一区有码在线| 亚洲综合免费观看高清完整版| 午夜精品影院在线观看| 美女视频一区二区| 成人永久免费视频| 91丨porny丨国产入口| 欧美精品三级日韩久久| 欧美mv日韩mv亚洲| 国产精品久久久久永久免费观看 | 国产亚洲婷婷免费| 亚洲色大成网站www久久九九| 亚洲成av人在线观看| 久久精品免费看| 成人少妇影院yyyy| 欧美日本一区二区| 久久久精品欧美丰满| 亚洲九九爱视频| 老汉av免费一区二区三区| 国产99精品国产| 欧美日韩亚洲综合一区二区三区| 精品日韩99亚洲| 亚洲欧美日韩综合aⅴ视频| 秋霞影院一区二区| aaa亚洲精品| 日韩精品一区二区三区在线观看 | 成人av电影免费观看| 欧美日本一道本| 国产精品国产三级国产普通话三级 | 亚洲成人777| 成人黄色在线看| 日韩一区国产二区欧美三区| 亚洲欧洲av另类| 久久国产综合精品| 日本国产一区二区| 久久久99久久| 日韩极品在线观看| 91亚洲大成网污www| 精品国产一区二区三区av性色| 一区二区三区在线不卡| 国产成+人+日韩+欧美+亚洲| 在线播放/欧美激情| 亚洲精品一二三四区| 国产福利91精品一区二区三区| 91精品国产综合久久精品app| 亚洲天堂成人网| 成人午夜在线视频| 26uuu久久天堂性欧美| 日本美女一区二区三区视频| 色乱码一区二区三区88| 国产精品女人毛片| 国产久卡久卡久卡久卡视频精品| 91精品国产综合久久国产大片| 一级中文字幕一区二区| 成人免费毛片片v| 国产日韩欧美精品一区| 狠狠色综合播放一区二区| 7777精品久久久大香线蕉| 亚洲综合图片区| 在线免费观看日本欧美| 亚洲激情第一区| 91在线国内视频| 国产精品美女久久久久久久| 国产一区二区美女| 亚洲精品在线电影| 麻豆精品一区二区av白丝在线 | 91福利在线导航| 亚洲免费在线看|