⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.cpp

📁 驱动编程菜鸟入门——3
💻 CPP
字号:
extern "C" { 
	#include <NTDDK.h> 
}

typedef struct _MY_DEVICE_EXTENSION {
	PDEVICE_OBJECT pDevice;         //设备对象指针
	UNICODE_STRING ustrDeviceName;	//设备名称
	UNICODE_STRING ustrSymLinkName;	//符号链接名
} MY_DEVICE_EXTENSION, *PMY_DEVICE_EXTENSION;

VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS OnFileCreate(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
NTSTATUS OnFileClose(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp); 

extern "C" NTSTATUS DriverEntry (
			IN PDRIVER_OBJECT pDriverObject,
			IN PUNICODE_STRING pRegistryPath	) 
{
	NTSTATUS status = STATUS_SUCCESS;

	KdPrint(("Enter DriverEntry\n"));
	KdPrint(("RegistryPath: %wZ\n", pRegistryPath));

	//注册其他回调函数入口
	pDriverObject->DriverUnload = HelloDDKUnload;
	pDriverObject->MajorFunction[IRP_MJ_CREATE] = OnFileCreate;
	pDriverObject->MajorFunction[IRP_MJ_CLOSE] = OnFileClose;
	pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
	pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;

	//创建驱动设备对象
	status = CreateDevice(pDriverObject);
	if (!NT_SUCCESS(status))
		KdPrint(("CreateDevice Error!\n"));
	else
		KdPrint(("CreateDevice Success!\n"));

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

NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject)
{
	NTSTATUS status;
	PDEVICE_OBJECT pDevObj;
	PMY_DEVICE_EXTENSION pDevExt;
	
	//创建设备名称
	UNICODE_STRING devName;
	RtlInitUnicodeString(&devName,L"\\Device\\MyTestDevice");
	
	//创建设备
	status = IoCreateDevice( pDriverObject,
						sizeof(MY_DEVICE_EXTENSION),
						&(UNICODE_STRING)devName,
						FILE_DEVICE_UNKNOWN,
						0, TRUE,
						&pDevObj );
	if (!NT_SUCCESS(status))
		return status;

    //对设备对象进行必要的初始化
	pDevObj->Flags |= DO_BUFFERED_IO;
	pDevExt = (PMY_DEVICE_EXTENSION)pDevObj->DeviceExtension;
	pDevExt->pDevice = pDevObj;
	pDevExt->ustrDeviceName = devName;

	//创建符号链接
	UNICODE_STRING symLinkName;
	RtlInitUnicodeString(&symLinkName,L"\\??\\TestDevice");
	pDevExt->ustrSymLinkName = symLinkName;
	status = IoCreateSymbolicLink( &symLinkName,&devName );
	if (!NT_SUCCESS(status)) 
	{
		IoDeleteDevice( pDevObj );
		return status;
	}

	return STATUS_SUCCESS;
}

VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
{
	PDEVICE_OBJECT	pNextObj;
	KdPrint(("Enter DriverUnload\n"));

	pNextObj = pDriverObject->DeviceObject;
	while (pNextObj != NULL) 
	{
		PMY_DEVICE_EXTENSION pDevExt = (PMY_DEVICE_EXTENSION)
		pNextObj->DeviceExtension;
		//删除符号链接
		UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
		IoDeleteSymbolicLink(&pLinkName);
		//删除设备对象
		pNextObj = pNextObj->NextDevice;
		IoDeleteDevice( pDevExt->pDevice );
	}
	KdPrint(("Leave DriverUnload\n"));
}

NTSTATUS OnFileCreate(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
	KdPrint(("I've received an IRP_MJ_CREATE message!\n"));

	// 通知操作系统该IRP已处理完毕
	NTSTATUS status = STATUS_SUCCESS;
	pIrp->IoStatus.Status = status;
	pIrp->IoStatus.Information = 0;	
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );

	KdPrint(("Leave OnFileCreate Routin\n"));

	return status;
}

NTSTATUS OnFileClose(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
	KdPrint(("I've received an IRP_MJ_CLOSE message!\n"));

	// 通知操作系统该IRP已处理完毕
	NTSTATUS status = STATUS_SUCCESS;
	pIrp->IoStatus.Status = status;
	pIrp->IoStatus.Information = 0;	
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );

	KdPrint(("Leave OnFileClose Routin\n"));

	return status;
}

NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
								 IN PIRP pIrp) 
{
	NTSTATUS status = STATUS_SUCCESS;
	KdPrint(("Enter HelloDDKDispatchRoutine\n"));
	KdPrint(("Leave HelloDDKDispatchRoutine\n"));
	return status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -