Windows 下设备驱动程序的开发方法 2120080411 计算机应用 赖锡盛
5
RtlInitUnicodeString(&dosDeviceName,TEST_DOS_DEVICE_NAME_W);
Status=IoCreateSymbolicLink(&dosDeviceName,&ntDeviceName);
if(!NT_SUCCESS(Status))
{
KdPrint(("[Test]IoCreateSymbolicLinkErrorCode=0x%X\n",Status));
IoDeleteDevice(deviceObject);
returnStatus;
}
在上述代码中,我们先来看创建设备对象的代码,首先我们使用
RtlInitUnicodeString 函数来初始化 UNICODE 字符串,关于字符串的用法请参考
其他书籍;然后我们调用函数 IoCreateDevice 来完成创建设备对象的功能,该函
数返回一个 NTSTATUS 值,有一个宏 NT_SUCCESS 可以很方便地判断这个
NTSTATUS 是否成功。
紧接着我们调用 IoCreateSymbolicLink 创建一个符号链接,前面我们创建的
设备对象虽然有个参数指定了设备名称,但是这个设备名称只能在内核态可见,
也就说 ring3 的应用层程序是看不见它的,因此驱动程序需要向 ring3 公布一个
符号链接,这个链接指向真正的设备名称,而 ring3 的应用程序可以通过该符号
链接找到驱动程序进行通信。实际上我们经常所说的 C 盘、D 盘就是一个符号
链接,它们在内核中的真正设备对象是“\Device\HarddiskVolume1 ”和
“\Device\HarddiskVolume2”。
在内核模式下,符号链接是以“\??\”(或“\DosDevices\”)开头的,如 C 盘
就是“\??\C:”,而在用户模式下,则是以“\\.\”开头的,如 C 盘就是“\\.\C:”。
2.4 卸载驱动例程
卸载驱动例程是我们在 DriverEntry 中自己定义的,当驱动被卸载时 I/O 管
理器负责调用该例程,它主要做一些扫尾处理的工作。相关代码如下所示:
UNICODE_STRINGdosDeviceName;
// 释放其他资源
// 删除符号链接
RtlInitUnicodeString(&dosDeviceName,TEST_DOS_DEVICE_NAME_W);
IoDeleteSymbolicLink(&dosDeviceName);