Windows驱动2. 驱动对象和设备对象

驱动对象和设备对象

驱动入口函数

c
NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT pDriverObject,
    IN PUNICODE_STRING pRegistryPath
)

驱动对象 DRIVER_OBJECT *PDRIVER_OBJECT

操作系统使用 DEVICE_OBJECT 结构来表示设备对象。 设备对象表示驱动程序处理 I/O 请求的逻辑、虚拟或物理设备。

— MSDN

这里的设备范围很广, 除了物理设备外, 系统资源(内存管理, 进程, 线程管理) 也可以视作设备对象.

操作都是由设备完成的, 驱动负责和设备进行通信, 通过设备对象来完成.

类型名称描述备注

CSHORT

Type

驱动对象类型

CSHORT

Size

驱动对象大小

PDEVICE_OBJECT

DeviceObject

设备对象

一个驱动程序对应多个设备对象

ULONG

Flags

驱动对象标志

PVOID

DriverStart

驱动程序入口地址

ULONG

DriverSize

驱动程序大小

PVOID

DriverSection

驱动链表

整个系统里驱动的链表管理

PDRIVER_EXTENSION

DriverExtension

驱动扩展

UNICODE_STRING

DriverName

驱动名

UNICODE_STRING

HardwareDatabase

硬件数据库

PFAST_IO_DISPATCH

FastIoDispatch

快速IO分发

PDRIVER_INITIALIZE

DriverInit

驱动初始化

PDRIVER_STARTIO

DriverStartIo

驱动开始IO

PDRIVER_UNLOAD

DriverUnload

驱动卸载

PDRIVER_DISPATCH

MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]

驱动主要功能

创建设备对象 IoCreateDevice

c
#include <ntddk.h>


VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	KdPrint(("Driver Unload\n"));
}

NTSTATUS DefaultDispatch(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
	KdPrint(("Default Dispatch\n"));
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;
}


NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
	pDriverObject->DriverUnload = DriverUnload;
	KdPrint(("Driver Entry\n"));

	UNICODE_STRING uDevName = { 0 };
	UNICODE_STRING uSymLink = { 0 };
	PDEVICE_OBJECT pDeviceObject = NULL;
	NTSTATUS status = STATUS_SUCCESS;

	RtlInitUnicodeString(&uDevName, L"\\demoDriver\\MyDevice");
	RtlInitUnicodeString(&uSymLink, L"\\demoDriverLink\\MyDevice");

    // 创建一个新的设备对象
	status = IoCreateDevice(
		pDriverObject,
		0,
		&uDevName,
		FILE_DEVICE_UNKNOWN,
		FILE_DEVICE_SECURE_OPEN,
		FALSE,  // 是否为独占设备
		&pDeviceObject
	);

	if (!NT_SUCCESS(status))
	{
		KdPrint(("Create Device Failed\n"));
		return status;
	}

	pDeviceObject->Flags |= DO_BUFFERED_IO;  // 设备类型, 此处为缓冲设备

	status = IoCreateSymbolicLink(&uSymLink, &uDevName);  // 创建符号链接

	if (!NT_SUCCESS(status))
	{
		KdPrint(("Create Symbolic Link Failed\n"));
		IoDeleteDevice(pDeviceObject);
		return status;
	}

	for (int i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)  // 驱动的主要回调
	{
		pDriverObject->MajorFunction[i] = DefaultDispatch;
	}


	return STATUS_SUCCESS;
}

Windows驱动2. 驱动对象和设备对象
https://simonkimi.githubio.io/2024/08/01/Windows驱动2-驱动对象和设备对象/
作者
simonkimi
发布于
2024年8月1日
许可协议