IoCreateDevice的排斥功能
2021-07-01
116
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)中硬件键和类键中的值超越,如果两个超越值都存在,硬件键中的超越值具有更高的优先权。