亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
中文字幕制服丝袜成人av| 欧美日高清视频| 青青草91视频| 五月天视频一区| 亚洲国产日韩精品| 亚洲国产毛片aaaaa无费看| 亚洲同性同志一二三专区| 国产精品视频第一区| 国产精品乱码一区二三区小蝌蚪| 国产欧美一区二区精品久导航 | 亚洲一区二区高清| 日韩理论片中文av| 亚洲激情自拍偷拍| 亚洲一卡二卡三卡四卡无卡久久| 亚洲欧美福利一区二区| 亚洲一区二区欧美日韩| 日韩影院免费视频| 精品一区二区三区在线视频| 国产精品亚洲专一区二区三区 | 国产精品久久久久精k8| 国产精品久久久久久久久久免费看| 国产精品嫩草久久久久| 亚洲人成精品久久久久久| 亚洲综合一二三区| 日韩成人午夜电影| 国产在线精品不卡| av在线一区二区| 欧美系列一区二区| 亚洲精品在线电影| 国产精品久久久久aaaa樱花 | 日韩国产精品久久久| 精品一区二区在线播放| 96av麻豆蜜桃一区二区| 欧美区一区二区三区| 日韩一级二级三级| 中文一区二区在线观看| 亚洲午夜私人影院| 精品亚洲成a人| 色综合天天综合网天天狠天天 | 久久国产精品第一页| 99热在这里有精品免费| 这里是久久伊人| 国产精品久久二区二区| 日韩电影免费一区| 99国产精品一区| 日韩精品一区二区三区四区| 亚洲男人的天堂网| 国产一区二区久久| 欧美日韩国产精品成人| 国产精品人成在线观看免费| 婷婷国产在线综合| 99久久99久久久精品齐齐| 日韩视频永久免费| 亚洲国产视频一区二区| 国产v日产∨综合v精品视频| 911国产精品| 一区二区在线观看免费| 国产美女娇喘av呻吟久久| 7777精品伊人久久久大香线蕉经典版下载 | 国产不卡在线视频| 欧美一区二区三区四区在线观看| 国产精品免费丝袜| 国产麻豆9l精品三级站| 欧美精品久久99| 亚洲另类在线视频| 成人免费毛片片v| 精品国产乱码久久久久久浪潮| 亚洲线精品一区二区三区八戒| 99久久er热在这里只有精品66| 久久久美女毛片| 久久99热99| 日韩三级视频在线观看| 日本vs亚洲vs韩国一区三区二区 | 国产成人午夜99999| 日韩亚洲电影在线| 首页亚洲欧美制服丝腿| 欧洲激情一区二区| 一区二区三区av电影| 91久久精品午夜一区二区| 1024成人网| 色综合久久久久久久久久久| 亚洲视频一区二区在线| 欧美在线观看你懂的| 亚洲欧美一区二区三区孕妇| 99国产欧美另类久久久精品| 亚洲精品少妇30p| 91久久精品一区二区| 午夜精品久久久久| 欧美一区二区三区日韩| 老司机免费视频一区二区 | 国产福利不卡视频| 国产精品私人影院| 91性感美女视频| 亚洲国产成人精品视频| 51精品国自产在线| 久久成人久久爱| 国产精品久久久久久亚洲毛片| 99精品偷自拍| 亚洲18影院在线观看| 日韩欧美一区在线观看| 国产精品1区2区3区在线观看| 国产精品传媒入口麻豆| 色综合久久久久综合| 日韩国产在线一| 久久精品亚洲国产奇米99 | 亚洲欧美国产77777| 欧美日韩国产综合视频在线观看| 日日夜夜精品免费视频| 久久久久国产精品厨房| 91蝌蚪国产九色| 九九九久久久精品| 亚洲人成小说网站色在线| 欧美一级二级三级蜜桃| heyzo一本久久综合| 丝袜亚洲另类丝袜在线| 中文字幕精品在线不卡| 欧美肥大bbwbbw高潮| 国产91精品精华液一区二区三区 | 欧美精品视频www在线观看| 国产尤物一区二区| 一区二区三区不卡视频 | 国产成人av在线影院| 午夜激情综合网| 中文字幕免费在线观看视频一区| 欧美日韩一区二区不卡| 成人性色生活片| 精品一区二区三区影院在线午夜| 日韩理论片中文av| 久久久噜噜噜久久中文字幕色伊伊 | 久久综合成人精品亚洲另类欧美 | 亚洲图片一区二区| 国产精品国产自产拍高清av王其| 欧美一区二区在线观看| 色国产精品一区在线观看| 国产剧情一区二区| 日韩精品电影在线| 亚洲一区二区三区小说| 成人免费一区二区三区在线观看| 精品久久国产97色综合| 欧美日韩成人一区| 欧美专区日韩专区| 91麻豆蜜桃一区二区三区| 福利一区二区在线观看| 狠狠久久亚洲欧美| 男男视频亚洲欧美| 日韩国产精品久久| 午夜激情一区二区三区| 亚洲成人在线观看视频| 一区二区三区小说| 亚洲欧美日韩电影| 亚洲欧美国产三级| 综合激情成人伊人| √…a在线天堂一区| 中文字幕一区三区| 亚洲欧洲精品一区二区精品久久久| 久久久久9999亚洲精品| 久久久精品黄色| 亚洲国产精品激情在线观看| 国产欧美日韩中文久久| 亚洲国产精品v| 国产精品素人视频| 自拍偷拍亚洲欧美日韩| 综合分类小说区另类春色亚洲小说欧美| 国产精品久久久久久久久动漫| 国产精品少妇自拍| 亚洲婷婷在线视频| 亚洲一区二区四区蜜桃| 午夜精品福利久久久| 美女网站一区二区| 国产一区三区三区| 成人国产电影网| 91搞黄在线观看| 欧美日本在线播放| 精品国产91乱码一区二区三区 | 91国产精品成人| 欧美日韩你懂得| 日韩欧美一区二区免费| 精品国产1区2区3区| 国产精品传媒在线| 亚洲不卡在线观看| 精品在线免费观看| 99久久综合精品| 欧美精品777| 精品国产一区二区三区忘忧草| 欧美激情综合五月色丁香小说| 一区二区在线观看免费视频播放| 日本不卡中文字幕| 波多野结衣视频一区| 欧美日韩精品福利| 久久久久国产精品麻豆ai换脸| 亚洲美女区一区| 经典一区二区三区| 91黄色免费观看| 精品免费国产一区二区三区四区| 欧美激情中文不卡| 免费看精品久久片| 91网站黄www| 精品国产乱子伦一区| 亚洲国产sm捆绑调教视频 | 99热99精品|