Wednesday, August 31, 2011

驱动笔记---设备与符号连接

内核态程序与用户态程序进行交互是通过设备与符号连接.
用户态的应用程序就可以通过这个设备与符号连接与内核态程序通信
操作步骤:
1. IoCreateDevice 创建设备
2. IoCreateSymbolicLink 设备与符号连接进行绑定
3. IoDeleteSymbolicLink 卸载时,删除符号连接
4. IoDeleteDevice 删除设备

_DRIVER_OBJECT结构体详解 (ntddk.h中查看定义)
DeviceObject 设备对象
DriveName 驱动的名字
HardwareDatabase 设备的硬件输出库键名
DriverStartIo 记录StartIo例程的函数地址
DriverUnload 记录卸载例程的函数地址
MajorFunction 记录分发例程地址(是一个指针数组)

DEVICE_OBJECT (设备对象)
DriverObject 指向设备所在驱动的驱动对象;
一个驱动中会有很多个设备,但每个设备的对象都是指向那一个驱动.
NextDevice 指向下一个设备,驱动中可以创建很多的设备,而这些设备的链接就是通过这个连接.

\\??\\符号连接的名称 à 加上特殊符号用于区分打开其他文件

DO_DEVICE_INITIALIZING初始化完成标记


加载完驱动后使用WinObj工具在DeviceGLOBAL??目录下查看加载结果




示例代码:
#include <ntddk.h>

void Unload(IN PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING usSymLinkName;
PDEVICE_OBJECT pDeviceObjectTemp1=NULL;
PDEVICE_OBJECT pDeviceObjectTemp2=NULL;
RtlInitUnicodeString(&usSymLinkName,L"\\??\\MyDDKSymName");
IoDeleteSymbolicLink(&usSymLinkName);//删除符号链接

if (DriverObject)
{
pDeviceObjectTemp1=DriverObject->DeviceObject;
while (pDeviceObjectTemp1)
{
pDeviceObjectTemp2=pDeviceObjectTemp1;
pDeviceObjectTemp1=pDeviceObjectTemp1->NextDevice;//下一个设备
IoDeleteDevice(pDeviceObjectTemp2);//删除设备
}
}
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
NTSTATUS status;
PDEVICE_OBJECT device;
UNICODE_STRING usDevName;
UNICODE_STRING usSymLinkName;
RtlInitUnicodeString(&usSymLinkName,L"\\??\\MyDDKSymName");
RtlInitUnicodeString(&usDevName,L"\\Device\\MyDDKDevice");

status =IoCreateDevice(DriverObject,0,&usDevName, FILE_DEVICE_UNKNOWN,0,FALSE,&device);//创建设备

if(!NT_SUCCESS(status))
{
return status;
}
status =IoCreateSymbolicLink(&usSymLinkName,&usDevName);//将设备与符号连接进行绑定
if(!NT_SUCCESS(status))
{
IoDeleteDevice(device);
return status;
}
device->Flags&=~DO_DEVICE_INITIALIZING;//初始化完成标记

DriverObject->DriverUnload = Unload;
return STATUS_SUCCESS;
}

No comments:

Post a Comment