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

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

?? driver.cpp

?? 《Windows驅動開發技術詳解》隨書源碼
?? CPP
字號:
/************************************************************************
* 文件名稱:Driver.cpp                                                 
* 作    者:張帆
* 完成日期:2007-11-1
*************************************************************************/

#include "Driver.h"

/************************************************************************
* 函數名稱:DriverEntry
* 功能描述:初始化驅動程序,定位和申請硬件資源,創建內核對象
* 參數列表:
      pDriverObject:從I/O管理器中傳進來的驅動對象
      pRegistryPath:驅動程序在注冊表的中的路徑
* 返回 值:返回初始化驅動狀態
*************************************************************************/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
			IN PDRIVER_OBJECT pDriverObject,
			IN PUNICODE_STRING pRegistryPath	) 
{
	NTSTATUS status;
	KdPrint(("Enter DriverEntry\n"));

	//設置卸載函數
	pDriverObject->DriverUnload = HelloDDKUnload;

	//設置派遣函數
	for (int i = 0; i < arraysize(pDriverObject->MajorFunction); ++i)
		pDriverObject->MajorFunction[i] = HelloDDKDispatchRoutin;

	pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HelloDDKDeviceIOControl;
	
	//創建驅動設備對象
	status = CreateDevice(pDriverObject);

	KdPrint(("Leave DriverEntry\n"));
	return status;
}

/************************************************************************
* 函數名稱:CreateDevice
* 功能描述:初始化設備對象
* 參數列表:
      pDriverObject:從I/O管理器中傳進來的驅動對象
* 返回 值:返回初始化狀態
*************************************************************************/
#pragma INITCODE
NTSTATUS CreateDevice (
		IN PDRIVER_OBJECT	pDriverObject) 
{
	NTSTATUS status;
	PDEVICE_OBJECT pDevObj;
	PDEVICE_EXTENSION pDevExt;
	
	//創建設備名稱
	UNICODE_STRING devName;
	RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
	
	//創建設備
	status = IoCreateDevice( pDriverObject,
						sizeof(DEVICE_EXTENSION),
						&(UNICODE_STRING)devName,
						FILE_DEVICE_UNKNOWN,
						0, TRUE,
						&pDevObj );
	if (!NT_SUCCESS(status))
		return status;

	pDevObj->Flags |= DO_DIRECT_IO;
	pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
	pDevExt->pDevice = pDevObj;
	pDevExt->ustrDeviceName = devName;

	//申請模擬文件的緩沖區
	pDevExt->buffer = (PUCHAR)ExAllocatePool(PagedPool,MAX_FILE_LENGTH);
	//設置模擬文件大小
	pDevExt->file_length = 0;

	//創建符號鏈接
	UNICODE_STRING symLinkName;
	RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
	pDevExt->ustrSymLinkName = symLinkName;
	status = IoCreateSymbolicLink( &symLinkName,&devName );
	if (!NT_SUCCESS(status)) 
	{
		IoDeleteDevice( pDevObj );
		return status;
	}
	return STATUS_SUCCESS;
}

/************************************************************************
* 函數名稱:HelloDDKUnload
* 功能描述:負責驅動程序的卸載操作
* 參數列表:
      pDriverObject:驅動對象
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
{
	PDEVICE_OBJECT	pNextObj;
	KdPrint(("Enter DriverUnload\n"));
	pNextObj = pDriverObject->DeviceObject;
	while (pNextObj != NULL) 
	{
		PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
			pNextObj->DeviceExtension;
		if (pDevExt->buffer)
		{
			ExFreePool(pDevExt->buffer);
			pDevExt->buffer = NULL;
		}

		//刪除符號鏈接
		UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
		IoDeleteSymbolicLink(&pLinkName);
		pNextObj = pNextObj->NextDevice;
		IoDeleteDevice( pDevExt->pDevice );
	}
}

/************************************************************************
* 函數名稱:HelloDDKDispatchRoutin
* 功能描述:對讀IRP進行處理
* 參數列表:
      pDevObj:功能設備對象
      pIrp:從IO請求包
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutin(IN PDEVICE_OBJECT pDevObj,
								 IN PIRP pIrp) 
{
	KdPrint(("Enter HelloDDKDispatchRoutin\n"));

	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
	//建立一個字符串數組與IRP類型對應起來
	static char* irpname[] = 
	{
		"IRP_MJ_CREATE",
		"IRP_MJ_CREATE_NAMED_PIPE",
		"IRP_MJ_CLOSE",
		"IRP_MJ_READ",
		"IRP_MJ_WRITE",
		"IRP_MJ_QUERY_INFORMATION",
		"IRP_MJ_SET_INFORMATION",
		"IRP_MJ_QUERY_EA",
		"IRP_MJ_SET_EA",
		"IRP_MJ_FLUSH_BUFFERS",
		"IRP_MJ_QUERY_VOLUME_INFORMATION",
		"IRP_MJ_SET_VOLUME_INFORMATION",
		"IRP_MJ_DIRECTORY_CONTROL",
		"IRP_MJ_FILE_SYSTEM_CONTROL",
		"IRP_MJ_DEVICE_CONTROL",
		"IRP_MJ_INTERNAL_DEVICE_CONTROL",
		"IRP_MJ_SHUTDOWN",
		"IRP_MJ_LOCK_CONTROL",
		"IRP_MJ_CLEANUP",
		"IRP_MJ_CREATE_MAILSLOT",
		"IRP_MJ_QUERY_SECURITY",
		"IRP_MJ_SET_SECURITY",
		"IRP_MJ_POWER",
		"IRP_MJ_SYSTEM_CONTROL",
		"IRP_MJ_DEVICE_CHANGE",
		"IRP_MJ_QUERY_QUOTA",
		"IRP_MJ_SET_QUOTA",
		"IRP_MJ_PNP",
	};

	UCHAR type = stack->MajorFunction;
	if (type >= arraysize(irpname))
		KdPrint((" - Unknown IRP, major type %X\n", type));
	else
		KdPrint(("\t%s\n", irpname[type]));

	NTSTATUS status = STATUS_SUCCESS;
	// 完成IRP
	pIrp->IoStatus.Status = status;
	pIrp->IoStatus.Information = 0;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );

	KdPrint(("Leave HelloDDKDispatchRoutin\n"));

	return status;
}

#pragma PAGEDCODE
NTSTATUS HelloDDKDeviceIOControl(IN PDEVICE_OBJECT pDevObj,
								 IN PIRP pIrp)
{
	NTSTATUS status = STATUS_SUCCESS;
	KdPrint(("Enter HelloDDKDeviceIOControl\n"));

	//得到當前堆棧
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
	//得到輸入緩沖區大小
	ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
	//得到輸出緩沖區大小
	ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
	//得到IOCTL碼
	ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;

	ULONG info = 0;

	switch (code)
	{						// process request
		case READ_PORT:
		{
			KdPrint(("READ_PORT\n"));
			//緩沖區方式IOCTL
			//顯示輸入緩沖區數據
 			PULONG InputBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer;
			ULONG port = (ULONG)(*InputBuffer);
			InputBuffer++;
			UCHAR method = (UCHAR)(*InputBuffer);

			KdPrint(("port:%x\n",port));
			KdPrint(("method:%x\n",method));
			//操作輸出緩沖區
			PULONG OutputBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer;

			if (method==1)//8位操作
			{
				*OutputBuffer = READ_PORT_UCHAR((PUCHAR)port);
			}else if(method==2)//16位操作
			{
				*OutputBuffer = READ_PORT_USHORT((PUSHORT)port);
			}else if(method==4)//32位操作
			{
				*OutputBuffer = READ_PORT_ULONG((PULONG)port);
			}

			//設置實際操作輸出緩沖區長度
 			info = 4;

			break;
		}
		case WRITE_PORT:
		{
			KdPrint(("WRITE_PORT\n"));
			//緩沖區方式IOCTL
			//顯示輸入緩沖區數據
 			PULONG InputBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer;
			ULONG port = (ULONG)(*InputBuffer);
			InputBuffer++;
			UCHAR method = (UCHAR)(*InputBuffer);
			InputBuffer++;
			ULONG value = (ULONG)(*InputBuffer);

			KdPrint(("port:%x\n",port));
			KdPrint(("method:%x\n",method));
			KdPrint(("value:%x\n",value));

			//操作輸出緩沖區
			PULONG OutputBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer;

			if (method==1)//8位操作
			{
				WRITE_PORT_UCHAR((PUCHAR)port,(UCHAR)value);
			}else if(method==2)//16位操作
			{
				WRITE_PORT_USHORT((PUSHORT)port,(USHORT)value);
			}else if(method==4)//32位操作
			{
				WRITE_PORT_ULONG((PULONG)port,(ULONG)value);
			}

			//設置實際操作輸出緩沖區長度
 			info = 0;
			break;
		}


		default:
			status = STATUS_INVALID_VARIANT;
	}

	// 完成IRP
	pIrp->IoStatus.Status = status;
	pIrp->IoStatus.Information = info;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );

	KdPrint(("Leave HelloDDKDeviceIOControl\n"));

	return status;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品天美传媒| 成人h动漫精品一区二区| 国产自产高清不卡| 欧美亚洲综合在线| 国产精品久久99| 国产一区美女在线| 91精品福利在线一区二区三区 | 欧美在线看片a免费观看| 久久久精品蜜桃| 轻轻草成人在线| 日本黄色一区二区| 最新日韩在线视频| 成人听书哪个软件好| 久久久久国产免费免费| 久久精工是国产品牌吗| 91精品麻豆日日躁夜夜躁| 亚洲精品免费一二三区| 99麻豆久久久国产精品免费优播| 久久色在线视频| 久久9热精品视频| 日韩三级av在线播放| 日本午夜精品一区二区三区电影| 欧洲另类一二三四区| 亚洲青青青在线视频| 99re这里只有精品首页| 国产精品久久久久久久久果冻传媒| 国产一本一道久久香蕉| 久久久精品蜜桃| 成人性生交大片| 一区视频在线播放| 日本高清视频一区二区| 亚洲永久免费av| 欧美精品aⅴ在线视频| 奇米影视一区二区三区小说| 538prom精品视频线放| 久久国产生活片100| 日韩欧美一区二区久久婷婷| 久久国产三级精品| 337p粉嫩大胆噜噜噜噜噜91av| 国产一区二区久久| 国产精品国产三级国产普通话蜜臀| 成人av电影在线| 亚洲综合丝袜美腿| 日韩欧美一区在线观看| 国模套图日韩精品一区二区| 国产香蕉久久精品综合网| eeuss鲁一区二区三区| 一区二区三区国产精品| 9191成人精品久久| 国内精品久久久久影院色| 国产精品久久久久久亚洲伦| 91国偷自产一区二区开放时间| 首页亚洲欧美制服丝腿| 亚洲精品一区二区在线观看| 99re亚洲国产精品| 亚洲 欧美综合在线网络| 久久综合九色综合欧美就去吻| 成人激情视频网站| 亚洲成人av电影| 久久久久一区二区三区四区| 色综合久久88色综合天天免费| 天天色综合天天| 国产欧美日韩综合精品一区二区| 91在线免费看| 美女mm1313爽爽久久久蜜臀| 亚洲欧洲国产日韩| 欧美一区二区三区视频免费播放| 国产jizzjizz一区二区| 亚洲电影中文字幕在线观看| 国产午夜精品一区二区三区四区| 欧美在线观看视频在线| 国产一区二区伦理| 天天综合天天综合色| 中文字幕精品—区二区四季| 91精品国产入口| 色噜噜久久综合| 国产精品一卡二卡| 日韩成人av影视| 亚洲精品免费电影| 国产精品青草久久| 精品国产髙清在线看国产毛片| 在线看一区二区| 波多野结衣的一区二区三区| 久久疯狂做爰流白浆xx| 香港成人在线视频| 亚洲女同女同女同女同女同69| 精品第一国产综合精品aⅴ| 欧美性大战久久久久久久蜜臀 | 国产欧美日韩亚州综合| 欧美三级电影一区| 色综合视频在线观看| 国产ts人妖一区二区| 国产麻豆成人精品| 久久99精品久久久久久国产越南 | 欧美一级日韩不卡播放免费| 色综合欧美在线视频区| av一区二区久久| 国产999精品久久久久久绿帽| 精品亚洲成a人| 美国毛片一区二区三区| 青青国产91久久久久久| 午夜精品福利一区二区蜜股av| 亚洲黄色片在线观看| 亚洲免费观看在线观看| 亚洲免费毛片网站| 亚洲欧洲精品一区二区精品久久久| 国产亚洲一区二区三区在线观看| 日韩欧美国产一区二区在线播放| 7777精品伊人久久久大香线蕉 | 欧美午夜精品久久久| 91久久奴性调教| 在线观看日韩国产| 欧美三区在线观看| 欧美精品久久久久久久多人混战| 欧美日韩成人综合在线一区二区| 欧美日精品一区视频| 欧美日韩精品三区| 88在线观看91蜜桃国自产| 欧美一三区三区四区免费在线看| 欧美精品乱码久久久久久 | 麻豆国产精品一区二区三区| 三级精品在线观看| 麻豆精品国产传媒mv男同| 九九九精品视频| 国产不卡在线一区| 97久久人人超碰| 欧美性色黄大片| 日韩欧美一区二区三区在线| 26uuu精品一区二区在线观看| 久久久久综合网| 中文字幕字幕中文在线中不卡视频| 一个色综合av| 免费在线一区观看| 国产精品白丝av| 91免费观看视频在线| 欧美电影在线免费观看| 久久久三级国产网站| 亚洲免费伊人电影| 老司机精品视频导航| 国产99久久久精品| 欧美日韩国产影片| 久久精品人人做人人爽人人| 最新日韩av在线| 久久国产尿小便嘘嘘尿| 成人精品一区二区三区中文字幕| 日本韩国一区二区| 精品国产3级a| 亚洲一级不卡视频| 国产精品538一区二区在线| 色综合天天性综合| 日韩美女一区二区三区| 亚洲人精品午夜| 久久99国产精品免费| 日本精品免费观看高清观看| 精品日韩一区二区| 亚洲图片欧美色图| av电影在线观看完整版一区二区| 欧美日韩国产成人在线91| 国产精品系列在线| 久久精品国产亚洲一区二区三区| 暴力调教一区二区三区| 日韩欧美一级特黄在线播放| 亚洲欧美精品午睡沙发| 国产成人啪午夜精品网站男同| 欧美视频中文一区二区三区在线观看| 26uuu亚洲综合色| 五月天激情综合网| 99视频在线精品| 久久久久久久久久久99999| 天堂久久一区二区三区| 99久久婷婷国产综合精品电影| 精品剧情在线观看| 亚洲国产综合人成综合网站| www.欧美亚洲| 国产欧美日韩精品在线| 久久99精品国产.久久久久| 在线播放日韩导航| 一区二区三区在线观看视频 | 国产毛片一区二区| 欧美一卡2卡3卡4卡| 亚洲午夜影视影院在线观看| 91免费版在线| 中文字幕一区二区三中文字幕| 国产精品亚洲а∨天堂免在线| 欧美成人女星排名| 免费在线成人网| 88在线观看91蜜桃国自产| 午夜久久久影院| 欧美日韩一区二区三区四区| 亚洲精品中文在线观看| 97se亚洲国产综合在线| 综合av第一页| av在线播放一区二区三区| 18欧美亚洲精品| 99国产精品久久久久| 18成人在线视频| 在线视频国内一区二区| 亚洲动漫第一页| 91精品国产综合久久久蜜臀粉嫩| 亚洲高清在线视频|