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

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

?? miniport.c

?? VisualC++網絡設計配套光盤代碼第五章
?? 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一区二区三区免费野_久草精品视频
久久伊99综合婷婷久久伊| 精品在线一区二区三区| www精品美女久久久tv| 91精品欧美综合在线观看最新| 成人精品免费网站| 国产一区二区三区四| 麻豆成人在线观看| 经典三级在线一区| 午夜电影一区二区| 久久夜色精品一区| 欧美精品18+| 在线免费观看日本欧美| 国产成人亚洲综合a∨婷婷| 视频在线观看国产精品| 国产精品超碰97尤物18| 久久影院视频免费| 欧美精品乱人伦久久久久久| 国产成人精品一区二区三区四区| 无吗不卡中文字幕| 亚洲精品写真福利| 国产精品久久久久久户外露出| 精品国产露脸精彩对白 | 蜜臀久久99精品久久久久宅男 | 欧美大片免费久久精品三p| 粉嫩高潮美女一区二区三区 | 99这里只有久久精品视频| 精品在线播放免费| 麻豆精品视频在线观看免费| 亚洲成人福利片| 一区二区三区日韩欧美| 1024精品合集| 国产精品久久福利| 中文久久乱码一区二区| 久久久99精品久久| 久久久噜噜噜久久人人看| 日韩欧美在线一区二区三区| 欧美人体做爰大胆视频| 欧美日韩的一区二区| 欧美性猛交xxxx乱大交退制版| 91欧美一区二区| 色综合久久久久久久久| 91在线精品一区二区三区| 不卡视频一二三| av动漫一区二区| proumb性欧美在线观看| 99久久久久久| 日本高清免费不卡视频| 色先锋aa成人| 欧美色区777第一页| 欧美日韩一区精品| 555www色欧美视频| 欧美成人高清电影在线| 久久综合色婷婷| 国产日韩欧美精品综合| 国产精品久久久久7777按摩| 中文字幕亚洲电影| 亚洲自拍与偷拍| 日韩精品午夜视频| 麻豆精品在线播放| 国产寡妇亲子伦一区二区| 成人激情黄色小说| 91老师片黄在线观看| 欧美性生活久久| 欧美一卡二卡三卡四卡| 亚洲精品在线网站| 国产精品国产三级国产专播品爱网 | 欧美日韩国产另类不卡| 日韩欧美自拍偷拍| 国产蜜臀97一区二区三区 | 国产精品国产三级国产aⅴ入口 | 欧美麻豆精品久久久久久| 日韩视频国产视频| 国产精品网站一区| 一区2区3区在线看| 蜜臀久久久99精品久久久久久| 国产福利一区二区三区视频在线 | 日韩欧美国产一区二区在线播放| 久久网这里都是精品| 成人欧美一区二区三区白人| 亚洲精品成人精品456| 蜜桃久久精品一区二区| 高清不卡一区二区| 欧美色综合影院| 久久久久国色av免费看影院| 亚洲人123区| 蜜桃久久精品一区二区| 99久久久国产精品| 欧美一三区三区四区免费在线看| 国产欧美日韩精品一区| 亚洲成a人片综合在线| 国产精品亚洲а∨天堂免在线| 色综合久久久久网| 久久久欧美精品sm网站| 亚洲国产欧美日韩另类综合| 精品一区二区免费视频| 91福利视频久久久久| 久久亚洲一区二区三区四区| 国产成人av电影在线| 欧美在线播放高清精品| 久久精品一区二区三区不卡| 亚洲丶国产丶欧美一区二区三区| 国产成人99久久亚洲综合精品| 欧美日本精品一区二区三区| 国产精品亲子伦对白| 久久精品国产77777蜜臀| 91精彩视频在线观看| 国产亚洲欧美一级| 欧美a一区二区| 91精品91久久久中77777| 久久精品综合网| 免费成人av在线| 欧美视频一区二区三区在线观看| 国产欧美日韩精品一区| 老汉av免费一区二区三区| 91久久精品一区二区三| 欧美国产丝袜视频| 国内精品在线播放| 欧美高清性hdvideosex| 亚洲一区二区欧美激情| 99久久国产综合精品色伊| 久久精品一区四区| 精品一区二区在线看| 91精品国产乱码久久蜜臀| 一区二区三区成人| 97久久精品人人做人人爽| 欧美激情综合五月色丁香小说| 久久精品国产色蜜蜜麻豆| 欧美日韩国产bt| 亚洲第一久久影院| 欧洲国产伦久久久久久久| 国产精品福利一区二区三区| 国产xxx精品视频大全| 久久免费的精品国产v∧| 久久国产精品一区二区| 欧美一级高清大全免费观看| 五月激情丁香一区二区三区| 欧美三级日本三级少妇99| 亚洲欧美日韩人成在线播放| 99re在线精品| 亚洲另类色综合网站| 久久久久久久久久久久电影 | 国产不卡在线播放| 国产亚洲欧洲一区高清在线观看| 国内成人精品2018免费看| 精品日韩一区二区三区免费视频| 蜜桃久久av一区| 精品欧美一区二区在线观看| 久久99国产精品久久| 日韩欧美黄色影院| 国产一区不卡在线| 国产欧美精品一区二区色综合 | 国产精品久久久久久亚洲毛片| 丁香婷婷深情五月亚洲| 亚洲品质自拍视频网站| 日本韩国精品一区二区在线观看| 亚洲国产精品一区二区久久| 欧美一卡二卡三卡| 国产高清成人在线| 亚洲蜜臀av乱码久久精品| 欧美专区日韩专区| 热久久一区二区| 久久久噜噜噜久久人人看| 99久久久国产精品| 亚洲精品国产精华液| 一区av在线播放| 三级影片在线观看欧美日韩一区二区| 亚洲国产一区在线观看| 偷拍亚洲欧洲综合| 久久99蜜桃精品| 国产一区欧美日韩| 国产xxx精品视频大全| 国产一区二区三区久久久| 日韩中文字幕不卡| 精品制服美女丁香| 国产精品一二三四五| 国产制服丝袜一区| 欧美精品一区二区高清在线观看| 狠狠色综合播放一区二区| 欧美va亚洲va| 国产成人av电影在线| 亚洲精品免费在线观看| 色综合色狠狠综合色| 麻豆国产欧美日韩综合精品二区 | 成人av资源在线观看| 亚洲国产视频a| 日韩欧美www| 不卡av在线免费观看| 美腿丝袜亚洲综合| 欧美精彩视频一区二区三区| 色又黄又爽网站www久久| a4yy欧美一区二区三区| 蜜臀久久久久久久| 日本一区二区三区dvd视频在线| 一本在线高清不卡dvd| 美女国产一区二区| 中文字幕综合网| 欧美一区二区网站| 色视频一区二区| 麻豆国产精品官网| 亚洲丝袜自拍清纯另类|