在设备管理器中隐藏设备

默认情况下,设备管理器显示计算机上的每台设备的状态。 在某些情况下,你可能希望阻止某些设备出现在设备管理器中。 例如,主板可能有一个 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方法描述的设备解码状态。