Windows驱动
+ -

IoCreateDevice的排斥功能

2021-07-01 97 0

问题描述

在windows驱动中,IoCreateDevice函数用于创建设备。
函数声名如下:

NTSTATUS IoCreateDevice(
  PDRIVER_OBJECT  DriverObject,
  ULONG           DeviceExtensionSize,
  PUNICODE_STRING DeviceName,
  DEVICE_TYPE     DeviceType,
  ULONG           DeviceCharacteristics,
  BOOLEAN         Exclusive,
  PDEVICE_OBJECT  *DeviceObject
);

其第六个参数BOOLEAN Exclusive,指名函数是否是一个专用功能,即设备是否独占。
对于这样的设备,I/O管理器仅允许打开该设备的一个句柄。

不过,如果仅这样做了,就以为万事大吉就可以了,那就大错特错了,这是一个坑,因为这样做实际是没啥作用的~
那么要怎么做呢?

解决方案

为了完全避免依赖排斥属性, 我们应该利用IRP_MJ_CREAT例程弹出任何有违规行为的打开请求。
所以我们可以在DEVICE_EXTENSION中创建一个标记,当应用打开设备时,先判断是否已经标记为TRUE了,如果已经标记,则应返回失败。
而在IRP_MJ_CLOSE时,标记其为FALSE.

注意事项

Exclusive,这个值同样也能被注册表(Properties中Exclusive)中硬件键和类键中的值超越,如果两个超越值都存在,硬件键中的超越值具有更高的优先权。

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!