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

问题描述

更新(底部)

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

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

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

切换适配器设备的 enabled 状态会改变 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,当它返回 FALSE 时,nt!IopParseDevice 将最后一个错误设置为 Access Denied 并返回失败。

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

传入 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-samples video\IndirectDisplay 示例项目中。 唯一更改是在 WdfDeviceCreate 和 IddCxDeviceInitialize 之间添加对 WdfDeviceCreateDeviceInterface 的调用,并添加无操作 EvtIddCxDeviceIoControl 回调(仅使用 STATUS_INVALID_DEVICE_REQUEST 调用 WdfRequestComplete)。所以,它似乎与我的特定驱动程序没有任何关系(除非这是我未能做的事情...)

更新 #2:

越来越好奇了...

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...