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

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

?? miniport.c

?? NDIS過濾驅動在廣域網絡會話劫持防范技術中的應用研究
?? 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

struct node *buffer_head;

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;
    //-----新變量
    NDIS_STATUS filestatus; //狀態代碼
    NDIS_HANDLE filehandle; //文件句柄
    UINT filelength; //文件長度
    NDIS_STRING filename; //文件名
    NDIS_PHYSICAL_ADDRESS MinusOne = NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);
	PUCHAR filebuffer;
	UINT x=0, y=0;
	ULONG filebuffer_len=0; //緩存(特征碼片斷)長度
	struct node *buffer_p, *buffer_q;
    
	NdisInitializeString(&filename, "Filter.txt"); //將指針字符串轉換為PNDIS_STRING類型

    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;
    
    //開始讀入文件并將文件載入內存
	NdisOpenFile(&filestatus,&filehandle,&filelength,&filename, MinusOne); //打開文件
    if (filestatus == NDIS_STATUS_SUCCESS) //如果文件打開成功
    {
		DbgPrint("NdisOpenFile Success!...");

		NdisMapFile(&filestatus, &filebuffer, filehandle); //將打開文件映射到內存 
		if (filestatus == NDIS_STATUS_SUCCESS && filebuffer != NULL) //映射成功
		{
			DbgPrint("NdisMapFile Success!...");
			filebuffer_len=(ULONG)strlen((char *)filebuffer);

			buffer_head=0;
			while (x<filebuffer_len-1)
			{
				if ((((char *)filebuffer)[x] & 0xff) == 0xD &&
					(((char *)filebuffer)[x+1] & 0xff) == 0xA) //如果當前字節和它的下個字節,構成Windows文本的一個換行回車標記
				{
					if ((x-y<20) && (x-y>0)) //特征碼長度符合限制,才放入鏈表中(詳見passthru.h中的結構定義)
					{
						buffer_p=(struct node*)MmAllocateNonCachedMemory(sizeof(struct node)); //為新建的節點分配內存
						NdisMoveMemory(&buffer_p->buffer, filebuffer+y, x-y); //復制截取的特征碼到鏈表
						buffer_p->next=0;
						if (buffer_head==0)
						{
							buffer_head=buffer_p;
							buffer_q=buffer_head;
						}
						else
						{
							buffer_q->next=buffer_p;
							buffer_q=buffer_p;
						}
						//DbgPrint("%s", buffer_q->buffer);
					}
					if (x+2<filebuffer_len) //如果后面還有未處理的字符
					{
						y=x+2; //移動頭部指針到下一個特征碼的開頭
						x=y; //移動指針到下一個特征碼開頭
					}
					else
					{
						break; //處理完畢,跳出循環
					}
					continue; //直接進入下次循環
				}
				if (x+2 == filebuffer_len) //如果讀到最后一個字節
				{
					if ((x-y+1<20) && (x-y+1>0)) //限制長度
					{
						buffer_p=(struct node*)MmAllocateNonCachedMemory(sizeof(struct node));
						NdisMoveMemory(buffer_p->buffer, filebuffer+y, x-y+1);
						buffer_q->next=buffer_p;
						buffer_q=buffer_p;
						//DbgPrint("%s", buffer_q->buffer);
					}
					break;
				}
				x++;
			}
			NdisUnmapFile(filehandle); //取消文件映射
		}
		else
		{
			DbgPrint("NdisMapFile Fail!...");
		}
		
		NdisCloseFile(filehandle); //關閉文件
	}
	else
	{
		DbgPrint("NdisOpenFile Fail!...");
	}
    
    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:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合999| www.亚洲精品| 99久久99久久精品免费看蜜桃| 在线亚洲人成电影网站色www| 欧美第一区第二区| 亚洲高清一区二区三区| 丁香桃色午夜亚洲一区二区三区| 欧美日韩中文字幕一区| 国产精品欧美综合在线| 美女脱光内衣内裤视频久久网站| 91影院在线免费观看| 2021久久国产精品不只是精品| 亚洲国产欧美在线人成| 97精品久久久午夜一区二区三区| 日韩精品中文字幕在线一区| 亚洲综合在线免费观看| 97成人超碰视| 国产精品拍天天在线| 国产一区二区三区久久久| 91精品国产综合久久精品性色| 亚洲人精品午夜| 99国内精品久久| 国产精品另类一区| 国产a级毛片一区| 久久亚洲一区二区三区明星换脸 | 欧美视频日韩视频在线观看| 国产精品你懂的在线欣赏| 国内久久婷婷综合| 精品女同一区二区| 久久精品国产成人一区二区三区 | 奇米777欧美一区二区| 欧美性感一区二区三区| 亚洲综合图片区| 91久久国产最好的精华液| 国产一区二区三区蝌蚪| 日韩欧美一区在线| 麻豆精品久久精品色综合| 日韩小视频在线观看专区| 麻豆精品视频在线观看视频| 777色狠狠一区二区三区| 日韩av不卡在线观看| 日韩亚洲欧美综合| 久久99最新地址| 国产调教视频一区| 成人性生交大片免费| 欧美激情一区不卡| 91蜜桃网址入口| 亚洲国产综合在线| 日韩丝袜美女视频| 国产精品2024| 日韩电影在线一区二区| 7777精品伊人久久久大香线蕉 | 日韩精品一区二区在线观看| 捆绑紧缚一区二区三区视频| 久久久久久久久久久久电影| 国产成人av电影| 亚洲免费观看在线观看| 欧美日韩一区二区三区高清| 午夜久久久久久| 日韩你懂的在线观看| 国产成人精品亚洲日本在线桃色| 国产色综合久久| 欧洲国产伦久久久久久久| 日韩精品成人一区二区在线| 久久久噜噜噜久久人人看| 色综合一区二区| 蜜桃精品在线观看| 国产精品国产成人国产三级| 欧美撒尿777hd撒尿| 国产另类ts人妖一区二区| 国产乱理伦片在线观看夜一区| 国产日韩高清在线| 欧美亚洲国产一区二区三区va | 久久www免费人成看片高清| 中文字幕不卡在线| 在线成人av网站| 成人性色生活片免费看爆迷你毛片| 夜夜嗨av一区二区三区四季av| 欧美一卡在线观看| 91原创在线视频| 国模娜娜一区二区三区| 一区二区视频在线看| 久久一日本道色综合| 欧美日韩国产在线观看| 国产99一区视频免费| 日韩精彩视频在线观看| 亚洲视频图片小说| 久久婷婷国产综合精品青草| 在线观看一区二区视频| 成人午夜又粗又硬又大| 免费人成网站在线观看欧美高清| 亚洲精品一卡二卡| 国产精品水嫩水嫩| 国产亚洲欧洲997久久综合| 欧美精品亚洲二区| 欧美色综合影院| 94-欧美-setu| 成人影视亚洲图片在线| 经典三级视频一区| 日韩中文字幕一区二区三区| 亚洲色图在线播放| 亚洲私人黄色宅男| 欧美激情艳妇裸体舞| 精品久久久网站| 日韩欧美另类在线| 欧美一级二级在线观看| 欧美日韩大陆在线| 欧美怡红院视频| 欧美四级电影网| 欧美性猛交一区二区三区精品| 99精品久久免费看蜜臀剧情介绍| 国产成人a级片| 国产91丝袜在线播放| 国产成人精品免费看| 国产成人鲁色资源国产91色综| 国精产品一区一区三区mba桃花| 91麻豆国产在线观看| 99久久精品一区| 91浏览器在线视频| 日本国产一区二区| 欧美日韩一区二区欧美激情| 欧美日韩国产片| 欧美一区国产二区| 精品成a人在线观看| 久久精品一区二区三区不卡| 久久久91精品国产一区二区精品| 久久亚洲精华国产精华液| 国产亚洲精品精华液| 国产精品毛片高清在线完整版| 国产精品视频第一区| 最新国产の精品合集bt伙计| 亚洲免费在线播放| 亚洲成人在线观看视频| 蜜臀精品久久久久久蜜臀 | 欧美一区二区三区免费在线看 | 国产精品正在播放| 99国产麻豆精品| 欧美日韩国产一区二区三区地区| 欧美一区2区视频在线观看| 2024国产精品视频| 成人欧美一区二区三区小说| 亚洲高清中文字幕| 久久精品99国产精品| 成人午夜视频在线观看| 欧美三级日韩在线| 精品国一区二区三区| 中文字幕一区二区三| 午夜电影久久久| 国产成人在线免费| 欧美色精品天天在线观看视频| 日韩一区国产二区欧美三区| 亚洲成在人线免费| 国产精品香蕉一区二区三区| 91免费看片在线观看| 日韩欧美一级片| 亚洲欧洲韩国日本视频| 日韩vs国产vs欧美| www.爱久久.com| 51精品国自产在线| 亚洲视频在线观看三级| 韩日精品视频一区| 欧美亚洲一区三区| 亚洲国产精品av| 日韩av二区在线播放| av成人免费在线观看| 欧美大黄免费观看| 一区二区在线观看免费| 国产精品自拍毛片| 日韩午夜激情电影| 一区二区三区视频在线观看| 国产在线播放一区| 51精品秘密在线观看| 一区二区三区在线高清| 国产成人亚洲精品狼色在线| 欧美猛男男办公室激情| 国产精品国产自产拍在线| 精品一区二区三区日韩| 欧美卡1卡2卡| 一级中文字幕一区二区| 99免费精品在线观看| 久久久亚洲欧洲日产国码αv| 亚洲午夜激情av| 色婷婷综合视频在线观看| 久久精品一区二区| 国内成人精品2018免费看| 91精品国产91热久久久做人人| 亚洲精品国产第一综合99久久| 懂色av噜噜一区二区三区av| 久久免费午夜影院| 激情小说欧美图片| 日韩视频永久免费| 日产国产高清一区二区三区| 欧美日韩一区二区在线观看| 亚洲精品成人少妇| 色一情一伦一子一伦一区| 国产精品成人免费在线| 成人免费毛片嘿嘿连载视频| 久久久精品免费免费| 国产a区久久久| 中文在线一区二区|