同步评估 ACPI 控制方法

设备驱动程序可以使用以下设备控制请求,来同步评估在设备 ACPI 命名空间中定义的控制方法:

  • IOCTL_ACPI_EVAL_METHOD

    此请求会评估一个控制方法,该方法是将向其发送请求的设备 ACPI 命名空间中的直接子对象。

  • IOCTL_ACPI_EVAL_METHOD_EX

    此请求会同步评估将请求发送到的设备或设备的后代子对象支持的控制方法。

Windows ACPI 驱动程序 Acpi.sys 会代表 ACPI BIOS 中的系统描述表中指定的设备处理这些请求。 这些请求可由内核模式设备驱动程序使用,这些驱动程序符合内核模式驱动程序框架 (KMDF)Windows 驱动程序模型 (WDM) 的要求。 从 Windows 8 开始,符合用户模式驱动程序框架 (UMDF) 要求的用户模式设备驱动程序可以使用这些请求。

例如,WDM 驱动程序会执行以下操作序列,以使用以下一个 IOCTL:

  1. 调用 IoBuildDeviceIoControlRequest 来生成请求。

  2. 调用 IoCallDriver 来将请求发送到设备堆栈。

  3. 等待 I/O 管理器向驱动程序发出较低级别驱动程序已完成请求的信号。

  4. 检查请求的状态。

  5. 检查输出参数的有效性。

  6. 处理返回到驱动程序的输出参数。

  7. 完成请求。

若要生成请求,驱动程序应调用 IoBuildDeviceIoControlRequest 并提供以下参数:

  • IoControlCode 设置为 IOCTL_ACPI_EVAL_METHODIOCTL_ACPI_EVAL_METHOD_EX

  • DeviceObject 设置为指向设备的物理设备对象 (PDO) 的指针。

  • InputBuffer 设置为指向输入缓冲区结构的指针,该结构取决于要传递给控制方法的输入参数的类型。 ACPI 驱动程序支持不采用输入参数、采用单个整数、采用 ASCII 字符串或采用输入参数自定义数组的方法。 有关支持的输入缓冲区结构的详细信息,请参阅控制方法输入缓冲区结构

  • InputBufferLength 设置为 InputBuffer 提供的输入缓冲区的大小(以字节为单位)。

  • OutputBufferLength 提供 OutputBuffer 提供的输出缓冲区的大小(以字节为单位)。

  • InternalDeviceIoControl 设置为 FALSE

  • Event 设置为指向调用方分配和初始化的事件对象的指针。 驱动程序会等至 I/O 管理器发出此事件的信号,该事件指示较低级别驱动程序已完成请求。

  • OutputBuffer 提供指向包含控制方法中的输出参数的 ACPI_EVAL_OUTPUT_BUFFER 结构的指针。 输出参数特定于给定的控制方法。 若要使驱动程序返回任何输出,它必须分配足够大的缓冲区,以便保存所有输出参数。

  • IoStatusBlock 设置为 IO_STATUS_BLOCK 结构。 这会返回由较低级别驱动程序设置的请求的状态。

有关如何评估不采用输入参数的控制方法的代码示例,请参阅在没有输入参数的情况下评估控制方法

有关如何评估采用输入参数的控制方法的代码示例,请参阅评估采用输入参数的控制方法