亚洲欧美第一页_禁久久精品乱码_粉嫩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 ntStatus;
	KdPrint(("DriverB:Enter B DriverEntry\n"));

	//注冊其他驅動調用函數入口
	pDriverObject->DriverUnload = HelloDDKUnload;
	pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKCreate;
	pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKClose;
	pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKRead;
	
	//創建驅動設備對象
	ntStatus = CreateDevice(pDriverObject);

	KdPrint(("DriverB:Leave B DriverEntry\n"));
	return ntStatus;
}

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

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

	//創建符號鏈接
	UNICODE_STRING symLinkName;
	RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDKB");
	pDevExt->ustrSymLinkName = symLinkName;
	NTSTATUS 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(("DriverB:Enter B DriverUnload\n"));
	pNextObj = pDriverObject->DeviceObject;

	while (pNextObj != NULL) 
	{
		PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
			pNextObj->DeviceExtension;

		//刪除符號鏈接
		UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
		IoDeleteSymbolicLink(&pLinkName);
		pNextObj = pNextObj->NextDevice;
		IoDeleteDevice( pDevExt->pDevice );
	}
	KdPrint(("DriverB:Enter B DriverUnload\n"));
}

#pragma PAGEDCODE
NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,
								 IN PIRP pIrp) 
{
	KdPrint(("DriverB:Enter B HelloDDKRead\n"));
	NTSTATUS ntStatus = STATUS_SUCCESS;

	UNICODE_STRING DeviceName;
	RtlInitUnicodeString( &DeviceName, L"\\Device\\MyDDKDeviceA" );

	PDEVICE_OBJECT DeviceObject = NULL;
	PFILE_OBJECT FileObject = NULL;
	//得到設備對象句柄,計數器加1
	//如果是第一次調用IoGetDeviceObjectPointer,會打開設備,相當于調用ZwCreateFile
	ntStatus = IoGetDeviceObjectPointer(&DeviceName,FILE_ALL_ACCESS,&FileObject,&DeviceObject);

	KdPrint(("DriverB:FileObject:%x\n",FileObject));
	KdPrint(("DriverB:DeviceObject:%x\n",DeviceObject));

	if (!NT_SUCCESS(ntStatus))
	{
		KdPrint(("DriverB:IoGetDeviceObjectPointer() 0x%x\n", ntStatus ));

		ntStatus = STATUS_UNSUCCESSFUL;
		// 完成IRP
		pIrp->IoStatus.Status = ntStatus;
		pIrp->IoStatus.Information = 0;	// bytes xfered
		IoCompleteRequest( pIrp, IO_NO_INCREMENT );
		KdPrint(("DriverB:Leave B HelloDDKRead\n"));

		return ntStatus;
	}

	KEVENT event;
	KeInitializeEvent(&event,NotificationEvent,FALSE);
	IO_STATUS_BLOCK status_block;
	LARGE_INTEGER offsert = RtlConvertLongToLargeInteger(0);

	//創建同步IRP
	PIRP pNewIrp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
												DeviceObject,
												NULL,0,
												&offsert,&event,&status_block);
 	KdPrint(("DriverB:pNewIrp:%x\n",pNewIrp));

	PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(pNewIrp);
	stack->FileObject = FileObject;

	//調用DriverA,會一直調用到DriverA的派遣函數
	NTSTATUS status = IoCallDriver(DeviceObject,pNewIrp);

    if (status == STATUS_PENDING) {

		//如果DriverA的派遣函數沒有完成IRP,則等待IRP完成
       status = KeWaitForSingleObject(
                            &event,
                            Executive,
                            KernelMode,
                            FALSE, // Not alertable
                            NULL);
        status = status_block.Status;
    }

	//將引用計數減1,如果此時計數器減為0,
	//則將關閉設備,相當于調用ZwClose
 	ObDereferenceObject( FileObject );


	ntStatus = STATUS_SUCCESS;
	// 完成IRP
	pIrp->IoStatus.Status = ntStatus;
	pIrp->IoStatus.Information = 0;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	KdPrint(("DriverB:Leave B HelloDDKRead\n"));
	return ntStatus;
}

/************************************************************************
* 函數名稱:HelloDDKDispatchRoutine
* 功能描述:對讀IRP進行處理
* 參數列表:
      pDevObj:功能設備對象
      pIrp:從IO請求包
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
								 IN PIRP pIrp) 
{
	KdPrint(("DriverB:Enter B HelloDDKDispatchRoutine\n"));
	NTSTATUS ntStatus = STATUS_SUCCESS;
	// 完成IRP
	pIrp->IoStatus.Status = ntStatus;
	pIrp->IoStatus.Information = 0;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	KdPrint(("DriverB:Leave B HelloDDKDispatchRoutine\n"));
	return ntStatus;
}

#pragma PAGEDCODE
NTSTATUS HelloDDKCreate(IN PDEVICE_OBJECT pDevObj,
								 IN PIRP pIrp) 
{
	KdPrint(("DriverB:Enter B HelloDDKCreate\n"));
	NTSTATUS ntStatus = STATUS_SUCCESS;
	// 完成IRP
	pIrp->IoStatus.Status = ntStatus;
	pIrp->IoStatus.Information = 0;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );

	KdPrint(("DriverB:Leave B HelloDDKCreate\n"));

	return ntStatus;
}

#pragma PAGEDCODE
NTSTATUS HelloDDKClose(IN PDEVICE_OBJECT pDevObj,
								 IN PIRP pIrp) 
{
	KdPrint(("DriverB:Enter B HelloDDKClose\n"));
	NTSTATUS ntStatus = STATUS_SUCCESS;

	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;

	// 完成IRP
	pIrp->IoStatus.Status = ntStatus;
	pIrp->IoStatus.Information = 0;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	
	KdPrint(("DriverB:Leave B HelloDDKClose\n"));

	return ntStatus;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区人人喊爽| 中文字幕一区二区在线观看| 国产精品成人免费| 成人av网站免费| 国产精品久久久久一区二区三区共| 6080亚洲精品一区二区| 麻豆国产精品一区二区三区| 久久久五月婷婷| 97久久超碰国产精品| 天堂成人国产精品一区| 精品福利二区三区| 99久久国产综合精品女不卡| 丁香另类激情小说| 日韩电影在线免费观看| 国产精品乱码久久久久久 | 欧美一级二级三级乱码| 国产精品77777竹菊影视小说| 亚洲欧美一区二区在线观看| 中文字幕一区二区三区不卡| 亚洲乱码一区二区三区在线观看| 91精品国产综合久久福利| 日韩一区二区三区免费看 | aaa欧美色吧激情视频| 日韩高清一区在线| 国产美女精品人人做人人爽| 亚洲国产精品久久一线不卡| 久久久国产午夜精品| 日韩一区在线看| 日本在线不卡一区| 成人午夜电影久久影院| 91浏览器打开| 99久久久国产精品| 欧美顶级少妇做爰| 91福利在线观看| 国产99精品在线观看| 国产一区二区三区免费观看| 风间由美一区二区av101| 日本道精品一区二区三区| 日韩欧美美女一区二区三区| 欧美在线影院一区二区| eeuss鲁片一区二区三区在线看| 91福利国产精品| 久久理论电影网| 性欧美大战久久久久久久久| 亚洲午夜久久久久久久久电影院 | 精品国产一区二区三区久久久蜜月| 国产人成亚洲第一网站在线播放 | 日韩美女在线视频| 一区二区成人在线观看| 亚洲精选在线视频| 精品伊人久久久久7777人| 久久99久久99| 欧美日韩美少妇| 日韩精品一区二区三区在线观看 | 中文字幕日韩一区| 麻豆成人久久精品二区三区红| 不卡的av网站| 国产亚洲精品aa| 综合自拍亚洲综合图不卡区| 亚洲男人天堂av网| 亚洲 欧美综合在线网络| a4yy欧美一区二区三区| 国产欧美日韩三区| 国产在线不卡视频| 日韩欧美三级在线| 日韩av成人高清| 欧美日韩高清在线播放| 亚洲欧美成人一区二区三区| 国产91清纯白嫩初高中在线观看| 欧美一级淫片007| 日产国产高清一区二区三区| 欧美日韩精品欧美日韩精品一| 亚洲欧美日韩一区| 97久久人人超碰| 亚洲欧美在线视频| 91国内精品野花午夜精品| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美日韩视频专区在线播放| 日韩免费高清电影| 美女性感视频久久| 日韩欧美激情在线| 国产精品123区| 欧美日韩免费在线视频| 亚洲va欧美va国产va天堂影院| 欧美午夜在线观看| 国产欧美一区二区精品性色超碰| 狠狠色狠狠色综合日日91app| 91国产精品成人| 亚洲国产wwwccc36天堂| 91精品久久久久久久91蜜桃| 日韩精品福利网| 久久先锋资源网| 亚洲va韩国va欧美va| 91精品国产aⅴ一区二区| 美女脱光内衣内裤视频久久网站| 欧美精品一区二区三区四区| 懂色av中文字幕一区二区三区| 亚洲欧洲日韩在线| 欧美人与禽zozo性伦| 国内精品久久久久影院一蜜桃| 国产亚洲综合色| 欧美自拍丝袜亚洲| 激情偷乱视频一区二区三区| 中文字幕欧美国产| 国产做a爰片久久毛片| 中文字幕在线不卡一区| 欧美日韩视频在线第一区| 裸体一区二区三区| 在线视频一区二区免费| 日韩专区中文字幕一区二区| 国产欧美日韩另类一区| 在线免费亚洲电影| 狠狠色狠狠色合久久伊人| 亚洲视频中文字幕| 精品国产一区二区精华| 色综合天天综合给合国产| 国产欧美精品国产国产专区| 日本国产一区二区| 国产伦精品一区二区三区免费 | 国产婷婷色一区二区三区| 91精品办公室少妇高潮对白| 精品在线播放免费| 亚洲午夜在线观看视频在线| 久久亚洲私人国产精品va媚药| 日本高清不卡视频| 国产不卡视频一区| 日韩电影在线免费看| 亚洲激情欧美激情| 欧美国产欧美综合| 精品不卡在线视频| 欧美日韩成人高清| 色婷婷综合久久久中文一区二区| 亚洲色大成网站www久久九九| 日韩免费观看高清完整版| 欧美性大战久久久久久久蜜臀| 国产成人av一区二区三区在线观看| 亚洲成人777| 一区二区三区在线免费| 国产人伦精品一区二区| 久久久精品综合| 精品sm在线观看| 精品人在线二区三区| 国产a视频精品免费观看| 看电影不卡的网站| 日韩和欧美的一区| 一区二区三区在线免费播放| 亚洲人成亚洲人成在线观看图片| 久久婷婷国产综合国色天香| 欧美岛国在线观看| 日韩美女一区二区三区| 精品国免费一区二区三区| 欧美一区二区日韩| 欧美videossexotv100| 日韩免费视频一区| 久久这里只有精品视频网| 国产精品妹子av| 国产精品久久三| 亚洲精品网站在线观看| 亚洲日韩欧美一区二区在线| 亚洲欧美日韩在线| 亚洲电影中文字幕在线观看| 亚洲自拍另类综合| 久久免费的精品国产v∧| 日韩一区二区精品在线观看| 日韩一区国产二区欧美三区| 日韩精品一区二区三区swag| 久久夜色精品国产噜噜av| 亚洲精品在线三区| 国产精品家庭影院| 亚洲欧美另类小说| 日本欧美大码aⅴ在线播放| 琪琪久久久久日韩精品| 亚洲码国产岛国毛片在线| 亚洲激情中文1区| 三级在线观看一区二区| 精品综合免费视频观看| 国产精品自在在线| 91麻豆国产精品久久| 在线播放日韩导航| 久久久久久久电影| 亚洲人成网站影音先锋播放| 日日夜夜精品视频免费| 国产精品99久久久久久久女警| 99riav久久精品riav| 欧美一区三区二区| 国产欧美日韩另类视频免费观看| 夜夜精品视频一区二区| 久久99久久精品| 91麻豆swag| 久久麻豆一区二区| 亚洲va在线va天堂| 成人激情动漫在线观看| 欧美精品久久一区| 国产精品国产三级国产aⅴ中文| 偷拍与自拍一区| 亚洲香肠在线观看| 国产精品亚洲人在线观看| 欧美撒尿777hd撒尿| 国产欧美日韩三区| 日本系列欧美系列|