控制设备命名空间访问权限

在 Windows 驱动程序模型 (WDM) 中,每个设备对象都有一个关联的 命名空间。 设备命名空间中的名称是以设备名称开头的路径。 对于名为“\Device\DeviceName”的设备,其命名空间由“\Device\DeviceName\FileName”格式的任何名称组成。 (对于文件系统, FileName 是文件系统上文件的实际名称。)

WDM 驱动程序接收设备命名空间中所有名称的打开请求。 驱动程序将打开的“\Device\DeviceName”请求视为设备对象本身的打开。 如果驱动程序实现了对设备命名空间中打开请求的支持,则会将“\Device\DeviceName\FileName”的打开请求视为设备对象的命名空间中“文件”的打开 (其中设备的“file”概念由驱动程序确定) 。

大多数驱动程序不实现对设备命名空间的开放操作的支持,但所有驱动程序都必须提供安全检查,以防止未经授权访问设备的命名空间。 默认情况下,安全检查设备命名空间中的文件打开请求, (例如,“\Device\DeviceName\FileName”) 完全由驱动程序决定 - 操作系统不会检查设备对象 ACL。

如果设置了设备对象的FILE_DEVICE_SECURE_OPEN特征,系统会将设备对象的安全描述符应用于设备命名空间中的所有文件打开请求。 驱动程序可以使用 IoCreateDevice 或 IoCreateDeviceSecure 创建设备对象时设置FILE_DEVICE_SECURE_OPEN。 对于 WDM 驱动程序,也可以在注册表中设置FILE_DEVICE_SECURE_OPEN。 也可以在注册表中为 IoCreateDeviceSecure 创建的非 WDM 驱动程序的设备对象设置它。 有关在注册表中设置设备对象属性(如设备特征)的详细信息,请参阅 在注册表中设置设备对象属性。 有关设备特征的详细信息,请参阅 指定设备特征

不支持命名空间的设备驱动程序必须使用两种方法之一,以确保正确处理设备命名空间中的文件打开请求:

  • 驱动程序的设备对象具有FILE_DEVICE_SECURE_OPEN设备特性集。 然后,驱动程序可以将设备命名空间中的任何打开请求视为设备对象的打开请求。

  • 驱动程序可能会使指定长度非零的 IrpSp-FileObject-FileName>> 参数的任何IRP_MJ_CREATE请求失败。 在这种情况下,对设备的打开请求受系统的 ACL 检查的约束,而设备命名空间中的所有文件打开请求都因驱动程序而失败。 支持独占打开 (驱动程序必须使用此选项。)

支持命名空间的设备驱动程序还可以使用两种方法来保护设备命名空间中的文件打开请求:

  • 驱动程序的设备对象具有FILE_DEVICE_SECURE_OPEN设备特性集。 这可确保设备的安全设置统一应用于设备的命名空间。 (驱动程序负责在其 DRIVER_DISPATCH 回调函数中实现对命名空间的支持。)

  • 驱动程序在其 DispatchCreate 例程中检查任何 ACL 以查找文件名。 (即使在这种情况下,驱动程序也应该设置FILE_DEVICE_SECURE_OPEN特征,除非打开设备命名空间的安全设置可能比设备对象弱。)

在堆栈顶部检查FILE_DEVICE_SECURE_OPEN特征,因此筛选器设备对象在附加后必须复制下一个较低设备对象的 Characteristics 成员。