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-驱动对象和设备对象/