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

驱动对象和设备对象

驱动入口函数

1
2
3
4
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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日
许可协议