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

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

?? ndisbind.cpp

?? 基于NDIS標準的驅動開發源碼
?? CPP
字號:
///////////////////////////////////////////////
// ndisbind.cpp文件
// NDIS協議入口點,處理綁定和解除綁定的例程


extern "C"
{
	#include <ndis.h>
	#include <ntddk.h>
	#include <stdio.h>
}
#include "nuiouser.h"
#include "ndisprot.h"


VOID 
  ProtocolBindAdapter(
    OUT PNDIS_STATUS Status,
    IN NDIS_HANDLE  BindContext,
    IN PNDIS_STRING  DeviceName,
    IN PVOID  SystemSpecific1,
    IN PVOID  SystemSpecific2
    )
{

	DbgPrint(" ProtoDrv: ProtocolBindAdapter... \n");

	NDIS_STATUS status = STATUS_SUCCESS;
	PDEVICE_OBJECT pDeviceObj = NULL;
	UNICODE_STRING ustrDevName = { 0 };
	OPEN_INSTANCE *pOpen = NULL;

	do
	{
			// 為新發現的設備創建設備對象和符號連接名稱
		// 構建設備對象名稱。
		// 設備名稱的格式是“\Device\{GUID}”,我們的設備對象名稱的格式為“\Device\Packet_{GUID}”,
		// 即在設備名稱前加前綴“Packet_”
		int nLen = DeviceName->Length + 7*sizeof(WCHAR) + sizeof(UNICODE_NULL);
		PWSTR strName = (PWSTR)ExAllocatePool(NonPagedPool, nLen);
		if(strName == NULL)
		{
			*Status = NDIS_STATUS_FAILURE;
			break;
		}
		swprintf(strName, L"\\Device\\Packet_%ws", &DeviceName->Buffer[8]);
		RtlInitUnicodeString(&ustrDevName, strName);
		// 創建設備對象,同時在設備對象的DeviceExtension域申請一個OPEN_INSTANCE結構
		status = IoCreateDevice(g_data.pDriverObj, 
			sizeof(OPEN_INSTANCE),	// 指定DeviceExtension域的大小
			&ustrDevName, 
			FILE_DEVICE_PROTOCOL,
			0,
			TRUE,					// 在同一時間,僅允許用戶打開一個到此對象的句柄
			&pDeviceObj); 
		if(status != STATUS_SUCCESS)
		{
			DbgPrint(" ProtoDrv: CreateDevice() failed \n ");
			*Status = NDIS_STATUS_FAILURE; 
			break;
		}
		// 使用直接I/O傳輸數據,這種方式適合大塊數據的傳輸
		pDeviceObj->Flags |= DO_DIRECT_IO;
		// 取得與本設備對象關聯的OPEN_INSTANCE結構的指針
		pOpen = (OPEN_INSTANCE*)pDeviceObj->DeviceExtension;
		// 保存設備對象指針
		pOpen->pDeviceObj = pDeviceObj;

		// 構建符號連接名稱
		// 符號連接名稱格式為“\DosDevices\Packet_{GUID}”,比設備名稱多4個字
		nLen = ustrDevName.Length + 4*sizeof(WCHAR) + sizeof(UNICODE_NULL);
		strName = (PWSTR)ExAllocatePool(NonPagedPool, nLen);
		if(strName == NULL)
		{
			*Status = NDIS_STATUS_FAILURE;
			break;
		}
		swprintf(strName, L"\\DosDevices\\%ws", &ustrDevName.Buffer[8]);
		RtlInitUnicodeString(&pOpen->ustrLinkName, strName);

		// 為新建設備對象創建符號連接名稱
		status = IoCreateSymbolicLink(&pOpen->ustrLinkName, &ustrDevName); 
		if(status != STATUS_SUCCESS)
		{
			*Status = NDIS_STATUS_FAILURE;
			DbgPrint(" ProtoDrv: Create symbolic failed \n");
			break;
		}
		// 我們不再使用設備對象名稱了,釋放它占用的內存
		ExFreePool(ustrDevName.Buffer);
		ustrDevName.Buffer = NULL;

			// 初始化OPEN_INSTANCE結構. 上面已經初始化了pDeviceObj和ustrLinkName域
		// 申請封包池
		NdisAllocatePacketPool(&status, 
			&pOpen->hPacketPool, 16, sizeof(PACKET_RESERVED));
		if(status != NDIS_STATUS_SUCCESS)
		{
			*Status = NDIS_STATUS_FAILURE;
			break;
		}
		
		// 初始化用來同步打開和關閉的事件
		NdisInitializeEvent(&pOpen->BindEvent);

		// 初始化重置列表和它對應的spinlock
		InitializeListHead(&pOpen->ResetIrpList);
		KeInitializeSpinLock(&pOpen->ResetQueueLock);

		// 初始化保存未決讀請求的列表和它對應的spinlock
		InitializeListHead(&pOpen->RcvList);
		KeInitializeSpinLock(&pOpen->RcvSpinLock);

			// 現在打開下面的適配器
		NDIS_MEDIUM         mediumArray = NdisMedium802_3;
		UINT mediumIndex;
		NdisOpenAdapter(Status,
				  &status,
				  &pOpen->hAdapter,
				  &mediumIndex,
				  &mediumArray,
				  sizeof(mediumArray)/sizeof(NDIS_MEDIUM),
				  g_data.hNdisProtocol,
				  pOpen,
				  DeviceName,
				  0,
				  NULL);
		if(*Status == NDIS_STATUS_PENDING)
        {
			// 打開操作完成之后,NDIS會調用我們注冊的ProtocolOpenAdapterComplete函數,
			// ProtocolOpenAdapterComplete函數設置BindEvent事件,使下面的語句返回。它也設置狀態代碼Status
              NdisWaitEvent(&pOpen->BindEvent, 0);
              *Status = pOpen->Status;
        }
		if(*Status != NDIS_STATUS_SUCCESS)
		{
			DbgPrint(" ProtoDrv: OpenAdapter failed! \n");
			break;
		}

			// 繼續初始化OPEN_INSTANCE結構
		// IRP請求數量初始值為0
		pOpen->nIrpCount = 0;

		// 已經綁定
		InterlockedExchange((PLONG)&pOpen->bBound, TRUE);

		NdisInitializeEvent(&pOpen->CleanupEvent);

		// 可以清除
		NdisSetEvent(&pOpen->CleanupEvent);

		// 保存MAC驅動的名稱
		NdisQueryAdapterInstanceName(&pOpen->ustrAdapterName, pOpen->hAdapter);

		pOpen->Medium = mediumArray;

			// 連接此OPEN_INSTANCE實例到全局的適配器列表(AdapterList),準備接收用戶的I/O請求
		InitializeListHead(&pOpen->AdapterListEntry);
        ExInterlockedInsertTailList(&g_data.AdapterList,
                                    &pOpen->AdapterListEntry, 
                                    &g_data.GlobalLock);
		// 清除設備對象中的DO_DEVICE_INITIALIZING標記。
		// 如果你在DriverEntry之外創建設備對象,必須要這么做。否則,應用程序不能發送I/O請求
		pDeviceObj->Flags &= ~DO_DEVICE_INITIALIZING;
	} 
	while(FALSE);


	// 出錯處理
	if(*Status != NDIS_STATUS_SUCCESS)
	{
		 if(pOpen != NULL && pOpen->hPacketPool != NULL) 
		 {
             NdisFreePacketPool(pOpen->hPacketPool);
        }
		if(pDeviceObj != NULL)
			IoDeleteDevice(pDeviceObj);
		if(ustrDevName.Buffer != NULL)
			ExFreePool(ustrDevName.Buffer);
		if(pOpen->ustrLinkName.Buffer != NULL)
		{
			IoDeleteSymbolicLink(&pOpen->ustrLinkName);
			ExFreePool(pOpen->ustrLinkName.Buffer);
		}
	}
}

VOID
  ProtocolOpenAdapterComplete(
      IN NDIS_HANDLE  ProtocolBindingContext,
      IN NDIS_STATUS  Status,
      IN NDIS_STATUS  OpenErrorStatus
      )
{
	POPEN_INSTANCE pOpen = (POPEN_INSTANCE)ProtocolBindingContext;
	pOpen->Status = Status;
	// 指示綁定已經完成
    NdisSetEvent(&pOpen->BindEvent);
}


VOID
  ProtocolUnbindAdapter(
      OUT PNDIS_STATUS  Status,
      IN NDIS_HANDLE  ProtocolBindingContext,
      IN NDIS_HANDLE  UnbindContext
      )
{
	OPEN_INSTANCE *pOpen = (OPEN_INSTANCE *)ProtocolBindingContext;
	if(pOpen->hAdapter != NULL)
	{
			// 關閉下層適配器
		NdisResetEvent(&pOpen->BindEvent);

		// 說明不再有綁定了
		InterlockedExchange((PLONG)&pOpen->bBound, FALSE);

		// 取消所有未決的讀IRP請求
		CancelReadIrp(pOpen->pDeviceObj);

		// 等待所有IRP完成
		NdisWaitEvent(&pOpen->CleanupEvent, 0);

		// 釋放建立的綁定
		NdisCloseAdapter(Status, pOpen->hAdapter);
		// 等待這個操作完成
		if(*Status == NDIS_STATUS_PENDING)
        {
            NdisWaitEvent(&pOpen->BindEvent, 0); // ProtocolCloseAdapterComplete函數使事件受信
            *Status = pOpen->Status;
        }
        else
        {
            *Status = NDIS_STATUS_FAILURE;
        }

			// 從全局的適配器列表(AdapterList)中刪除這個實例
		KIRQL oldIrql;
		KeAcquireSpinLock(&g_data.GlobalLock, &oldIrql); 
        RemoveEntryList(&pOpen->AdapterListEntry);
        KeReleaseSpinLock(&g_data.GlobalLock, oldIrql);

			// 釋放綁定時申請的資源
        NdisFreePacketPool(pOpen->hPacketPool);
        NdisFreeMemory(pOpen->ustrAdapterName.Buffer, pOpen->ustrAdapterName.Length, 0);
        IoDeleteSymbolicLink(&pOpen->ustrLinkName);
        ExFreePool(pOpen->ustrLinkName.Buffer);
        IoDeleteDevice(pOpen->pDeviceObj);
	}
}


VOID 
  ProtocolCloseAdapterComplete(
      IN NDIS_HANDLE  ProtocolBindingContext,
      IN NDIS_STATUS  Status
      )
{
	POPEN_INSTANCE pOpen = (POPEN_INSTANCE)ProtocolBindingContext;
	pOpen->Status = Status;
    NdisSetEvent(&pOpen->BindEvent);
}
















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91亚洲精品一区二区乱码| 亚洲色图在线播放| 久久爱www久久做| 在线综合视频播放| 麻豆精品一二三| 精品国产成人在线影院| 国产精品99久久久久久有的能看| 国产视频一区在线观看| jlzzjlzz国产精品久久| 亚洲自拍另类综合| 欧美一级二级三级蜜桃| 国产精品一区二区x88av| 成人欧美一区二区三区在线播放| 波多野结衣在线一区| 亚洲精品免费在线观看| 欧美高清在线视频| 狠狠色狠狠色合久久伊人| 国产亚洲视频系列| 91免费在线看| 免费高清视频精品| 日本一区二区三区国色天香 | 国产成人亚洲综合a∨猫咪| 91在线免费播放| 欧美放荡的少妇| 久99久精品视频免费观看| 欧美色倩网站大全免费| 欧美本精品男人aⅴ天堂| 午夜精品久久久久久久久| 日韩欧美一二三区| 风间由美性色一区二区三区| 一区二区三区中文字幕电影| 日韩欧美亚洲国产另类| 91在线观看一区二区| 午夜精品久久久久久久蜜桃app| 精品国产亚洲在线| 欧美视频一区在线| 国产精品1024| 日本亚洲三级在线| 亚洲人成7777| 久久久久国产精品人| 欧美日韩免费观看一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 亚洲永久免费av| 国产精品久久久久久久裸模| 日韩美女视频在线| 国产精品伦理一区二区| 国产亲近乱来精品视频| 欧美一区二区视频在线观看| 99在线热播精品免费| 久久草av在线| 日本三级亚洲精品| 亚洲精品国产无套在线观| 一区二区三区中文在线| 免费观看91视频大全| 亚洲色欲色欲www在线观看| 欧美videos中文字幕| 欧美日韩二区三区| 亚洲18色成人| 在线免费不卡视频| 一区二区三区电影在线播| 粉嫩13p一区二区三区| 久久免费美女视频| 精品国产乱码久久久久久老虎| 国产精品美女久久久久aⅴ国产馆| 日本美女一区二区三区| 视频一区免费在线观看| 久久综合丝袜日本网| 国产麻豆精品一区二区| 一区二区高清在线| 欧美三级欧美一级| 在线看不卡av| 国产很黄免费观看久久| 久久99在线观看| 青椒成人免费视频| 免费观看一级欧美片| 午夜电影久久久| 三级不卡在线观看| 视频一区中文字幕| 视频一区中文字幕| 麻豆成人av在线| 久久99国内精品| 精品一区二区免费| 国产精品一区二区三区99| 国产一区二区视频在线| 95精品视频在线| 99免费精品在线| av网站免费线看精品| 韩国三级电影一区二区| 欧美精品第1页| 日韩一区二区在线播放| 欧美丰满一区二区免费视频| 色噜噜狠狠色综合欧洲selulu | 久久色.com| 欧美专区日韩专区| 成人黄动漫网站免费app| 亚洲成人一区在线| 韩国v欧美v日本v亚洲v| 福利91精品一区二区三区| 白白色 亚洲乱淫| 日本久久一区二区| 精品奇米国产一区二区三区| 久久九九全国免费| 亚洲电影一区二区| 免费观看成人av| 色综合天天综合网天天看片| 精品国产一区二区三区久久久蜜月| 中文字幕av在线一区二区三区| 亚洲美女视频一区| 欧美日韩午夜影院| 成人免费观看av| 欧美乱妇20p| 亚洲九九爱视频| 日韩**一区毛片| 国产成人精品一区二| 色妞www精品视频| 欧美一区二区三区视频在线| 欧美精品一区二区在线观看| 亚洲欧洲av在线| 五月婷婷综合网| 国产69精品久久777的优势| 欧美在线看片a免费观看| 久久综合九色综合97婷婷| 7777精品伊人久久久大香线蕉| 欧美日韩亚洲不卡| 日韩一区二区三区高清免费看看| 国产婷婷色一区二区三区四区 | 在线播放一区二区三区| 国产欧美一区二区精品仙草咪| 亚洲老司机在线| 国产美女娇喘av呻吟久久| 在线视频一区二区免费| 久久精品人人做| 日韩影院免费视频| 99re热视频这里只精品| 精品久久久久久久久久久久久久久| 亚洲精品乱码久久久久久久久| 国产精品一区二区在线播放 | 欧美一级淫片007| 综合分类小说区另类春色亚洲小说欧美| 视频一区二区三区在线| 99riav久久精品riav| 欧美成人a在线| 亚洲超碰精品一区二区| 成人午夜免费av| 日韩精品一区二区三区中文精品| 洋洋成人永久网站入口| av中文一区二区三区| 久久久国产精华| 免费观看成人鲁鲁鲁鲁鲁视频| 在线观看视频一区二区| 18欧美乱大交hd1984| 高清在线成人网| 精品理论电影在线观看| 日日夜夜一区二区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产精品视频一二三区| 国产在线麻豆精品观看| 欧美成人伊人久久综合网| 亚洲一区二区三区四区在线| 91视频在线看| 亚洲天堂福利av| 顶级嫩模精品视频在线看| 久久久精品国产99久久精品芒果 | 日韩一区二区三区精品视频| 日精品一区二区| 欧美久久一二三四区| 午夜伦理一区二区| 欧美日韩国产一级二级| 日韩专区欧美专区| 欧美高清hd18日本| 秋霞午夜av一区二区三区| 欧美一区二区三区啪啪| 日本vs亚洲vs韩国一区三区| 日韩一区二区免费在线观看| 蜜桃久久av一区| 精品国产污污免费网站入口| 国产一区二区三区国产| 久久精品人人做| av网站一区二区三区| 亚洲精品v日韩精品| 欧美日韩国产一级片| 免费高清成人在线| 久久午夜免费电影| 不卡视频一二三| 亚洲一卡二卡三卡四卡五卡| 欧美日韩一区二区在线视频| 老汉av免费一区二区三区| 国产日韩欧美一区二区三区乱码| 成人一区在线观看| 亚洲人午夜精品天堂一二香蕉| 欧美日韩亚洲国产综合| 久久爱www久久做| 国产精品久久久久7777按摩 | 美女尤物国产一区| 久久久精品日韩欧美| 一道本成人在线| 麻豆国产欧美日韩综合精品二区| 国产视频一区在线播放| 欧美做爰猛烈大尺度电影无法无天| 日韩国产精品久久|