除非我禁用/启用我的设备,否则CreateFile会失败

更新(在底部)

我有一个基于 IddCx 示例的 UMDF 视频驱动程序。我有一个命令行测试(以“管理员CreateFile身份”运行),它调用视频适配器设备实例以获取用于 IOCTL 目的的句柄。在访问被拒绝CreateFile呼叫中测试失败

我发现如果我只是在设备管理器中禁用并重新启用适配器,然后重新运行相同的测试,它就会成功。测试将继续成功,直到我重新启动 Windows,或卸载/重新安装设备。

测试的CreateFile调用本身不会触发对我的驱动程序的任何调用(更多内容见下文),因此我无法轻松自下而上地对其进行调试。

切换适配器设备的激活状态改变SOMETHING使得完全相同的CreateFile调用成功。我决定跟踪CreateFile调用直到它失败......这是我发现的:

--- User Mode ---
mytest!CreateFile
ntdll!NtCreateFile
--- Kernel Mode ---
nt!IopCreateFile
nt!ObOpenObjectByNameEx
nt!ObpLookupObjectName
nt!IopParseDevice
nt!SeAccessCheck [returns Access Denied]

nt!IopParseDevice调用nt!SeAccessCheck,当它返回时FALSEnt!IopParseDevice将最后一个错误设置为拒绝访问并返回失败。

现在,这是有趣的部分(我需要帮助):

传入的参数nt!SeAccessCheck略有不同,具体取决于我是禁用+启用设备之前还是之后运行测试。值得注意的是,提供的 SecurityDescriptor 参数的SECURITY_DESCRIPTOR_CONTROL成员发生了变化:

(after Windows restart or adding new adapter device)
0x9814 (SE_SELF_RELATIVE | SE_SACL_PRESENT | SE_DACL_PRESENT | SE_DACL_PROTECTED | SE_SACL_AUTO_INHERITED)

(after disable/enable adapter)
0x8014 (SE_SELF_RELATIVE | SE_SACL_PRESENT | SE_DACL_PRESENT)

我对 Windows 安全性了解不够,无法理解这两个标志在更大范围内的含义。任何人都可以阐明可能发生的事情吗?


更新 #1:

我发现这种行为发生在 Windows-driver-samplesvideoIndirectDisplay示例项目中。的唯一变化是添加一个调用WdfDeviceCreateDeviceInterfaceWdfDeviceCreate和IddCxDeviceInitialize之间,并加入一个什么都不做EvtIddCxDeviceIoControl回调(只是调用WdfRequestComplete用STATUS_INVALID_DEVICE_REQUEST)。所以,它似乎与我的特定驱动程序没有任何关系(除非这是我没有做的事情......)

更新#2:

这变得越来越奇怪了......

事实证明,每次我循环禁用然后重新启用驱动程序时,使用的安全描述符都会切换(在上述两个选项之间)。

以上是除非我禁用/启用我的设备,否则CreateFile会失败的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>