在 KMDF 驱动程序中控制设备访问权限

驱动程序必须有助于防止用户不恰当地访问计算机的设备和文件。 若要防止未经授权访问设备和文件,必须:

  • 仅在必要时命名设备对象。

  • 为设备对象和接口提供安全描述符。

仅在必要时命名设备对象

与大多数 Windows 驱动程序模型 (WDM) 驱动程序一样,基于框架的驱动程序通常不会命名其设备对象。 应用程序可以通过指定设备对象名称来访问设备,因此每个附加设备对象名称都表示应用程序可用于访问该设备的其他路径。

为了防止未经授权访问设备,每个驱动程序可以在命名设备对象时指定安全描述符。 但是,操作系统提供给驱动程序的文件名 (请参阅 WdfFileObjectGetFileName) 不包括应用程序使用的设备对象名称。 因此,如果驱动程序堆栈中的多个驱动程序为其设备对象提供名称,则驱动程序无法确定应用程序用于打开设备的对象名称。 因此,应用程序可能会使用比驱动程序预期的更宽松的安全描述符来打开设备。

) PDO (物理设备对象必须具有名称。 通常,基于框架的总线驱动程序不会为 PDO 指定名称,因为框架默认 () 指示操作系统生成名称。

另一方面,基于框架的驱动程序可以通过调用 WdfDeviceInitAssignName 为设备对象分配设备名称。 驱动程序应将功能设备对象命名 (FDO) 、筛选设备对象 (筛选器 DO) 或 PDO,前提是驱动程序必须支持需要特定设备名称的较旧应用程序,或者驱动程序属于体系结构需要对象名称的较旧驱动程序堆栈。

WDM 驱动程序和基于框架的驱动程序应提供应用程序可以访问的设备接口,而不是命名 FDO 和筛选器 DO。 操作系统从设备的 PDO 和驱动程序包的 INF 文件指定的注册表项获取设备接口的安全描述符。 如果驱动程序的设备在没有函数驱动程序的情况下以原始模式运行,则总线驱动程序可以为 PDO 提供设备接口。

某些驱动程序必须调用 WdfDeviceCreateSymbolicLink 才能为其设备创建符号链接名称。 例如,如果应用程序希望看到 设备的 MS-DOS 名称 ,驱动程序可能会创建 MS-DOS 设备名称。 如果驱动程序为未命名的 FDO 或筛选器 DO 创建符号链接名称,框架会将符号链接名称与 PDO 的名称相关联。 (Control 设备不与 PDO 关联,因此驱动程序无法为未命名的控制设备创建符号链接名称。)

为设备对象和接口提供安全描述符

每个命名设备对象都必须具有安全描述符。 操作系统使用设备对象的安全描述符来确定允许访问设备及其设备接口的用户类型。 可以通过以下方法将安全描述符分配给设备对象:

默认情况下,操作系统还使用设备 PDO 的安全描述符来确定对驱动程序提供的设备接口的访问权限。

驱动程序包可以提供一个 INF 文件,该文件在 INF DDInstall.HW 节中使用 INF AddReg 指令指定设备的安全描述符。

有关在 INF 文件中指定安全描述符的详细信息,请参阅 创建安全设备安装

如果驱动程序为在原始模式下运行的设备创建 PDO,则驱动程序在调用 WdfPdoInitAssignRawDevice 时必须指定设备设置类。 此外,如果驱动程序创建控制设备,它可以调用 WdfDeviceInitSetDeviceClass 以指定设备安装类。 在这两种情况下,系统管理员都可以使用指定安装类的注册表项来存储设备的安全描述符。

有关操作系统如何确定对设备使用哪个安全描述符的信息,请参阅 控制设备访问

框架创建设备对象时,它始终设置FILE_DEVICE_SECURE_OPEN标志,以便操作系统在允许应用程序访问设备命名空间中的任何名称之前检查设备的安全描述符。 有关FILE_DEVICE_SECURE_OPEN标志和设备命名空间的详细信息,请参阅 控制设备命名空间访问