在设备管理器中隐藏设备

默认情况下,设备管理器显示计算机上每台设备的状态。 在某些情况下,你可能希望阻止某些设备出现在设备管理器中。 例如,主板可能有一个 CardBus 控制器,该控制器的插槽是用户不可访问的。 由于用户无法使用槽,因此你不希望设备管理器显示有关设备的任何信息。

若要在设备管理器中隐藏设备,可以将该设备标记为隐藏设备。 通常,设备管理器不显示隐藏的设备。 但 (请注意,用户可以替代此设置并显示设备管理器内的所有设备,甚至是隐藏的设备。有关如何替代此设置的详细信息,请参阅查看隐藏的设备。)

有两种方法可将设备标记为隐藏:在设备的驱动程序内或使用 ACPI BIOS。

在驱动程序中隐藏设备

驱动程序有两种方法将驱动程序标记为隐藏:

  • 函数驱动程序或函数筛选器驱动程序可以要求操作系统通过响应 IRP_MN_QUERY_PNP_DEVICE_STATE IRP 来隐藏成功启动的设备。 当 IRP 到达时,驱动程序必须在驱动程序的调度例程中将 IoStatus.Information 中的 PNP_DEVICE_DONT_DISPLAY_UI 位设置为 TRUE

  • 在 Windows XP 及更高版本的 Windows 操作系统上,总线驱动程序或总线筛选器驱动程序可以通过响应 IRP_MN_QUERY_CAPABILITIES IRP 来隐藏任何设备(启动或其他设备)。 当 IRP 到达时,驱动程序必须在驱动程序的调度例程中将 Parameters.DeviceCapabilities.NoDisplayInUI 成员设置为 TRUE 。 在某些情况下,总线筛选器驱动程序可能需要在完成例程中设置此位。 当基础总线驱动程序的调度例程错误地清除其他驱动程序设置的所有功能字段时,需要执行此额外步骤。

使用 ACPI BIOS 隐藏设备

可以将设备标记为在 ACPI BIOS 中隐藏。 BIOS 可以公开设备的_STA方法。 _STA 方法返回位掩码。 第 2 位 (掩码0x4) 指定默认情况下设备管理器是否应使设备可见。 如果应使设备可见,则此位应为 1,否则应为 0。

例如,下面的代码示例演示如何隐藏根总线上的 USB 控制器。

Device(PCI0) // Root PCI bus
_HID *PNP0A03 
...
    Device(UCTL)  // USB controller
    _ADR 0xddddffff // dddd = device, ffff = function
    _STA 0xB // Device present, but not shown

在 Microsoft Windows 2000 中,只能隐藏已启动的工作设备。 在 Windows XP 和更高版本的 Windows 中,还可以隐藏损坏的设备。 _STA 方法返回的第 3 位 (掩码0x8) 指示设备是否正常工作。 如果设备正常工作,则此位为 1,否则为 0。 例如,下面的代码示例演示 BIOS 如何指示 USB 控制器已损坏并应隐藏:

Device(PCI0) // Root PCI bus 
_HID *PNP0A03 
...
    Device(UCTL) // USB controller
    _ADR 0xddddffff //  dddd = device, ffff = function
    _STA 0x3 // Present, but broken and not shown 

注意 “解码”位 (0x2) 与通过_ADR方法描述的设备没有任何相关性。 前面的代码示例也适用于未设置解码位。 BIOS 编写器必须仅跟踪通过_HID方法描述的设备解码状态。