IoCreateDevice的排斥功能

问题描述

在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)中硬件键和类键中的值超越,如果两个超越值都存在,硬件键中的超越值具有更高的优先权。

  • USB基础
  • USB摄像头UVC
  • USB人机交互HID
  • USB音频UAC
  • Windows基础
  • 磁盘与文件系统
  • Windows编程
  • Windows驱动
  • 开发模块
  • Windows运维
  • Linux相关
  • C语言学习
  • 高级语言
  • 前端开发
  • 服务器开发
  • 数据库
  • 字节流笔记
  • 字节流
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

    Powered by bytekits.com,汇天下文字,成非凡梦想!!!