Share via


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 を呼び出し、次のパラメーターを指定します。

  • IoControlCodeIOCTL_ACPI_EVAL_METHOD または IOCTL_ACPI_EVAL_METHOD_EX に設定されます。

  • DeviceObject は、デバイスの物理デバイス オブジェクト (PDO) へのポインターに設定されます。

  • InputBuffer は、制御メソッドに渡される入力引数の型に依存する入力バッファーの構造体へのポインターに設定されます。 ACPI ドライバーは、入力引数を受け取らないメソッド、1 つの整数を受け取るメソッド、ASCII 文字列を受け取るメソッド、または入力引数のカスタム配列を受け取るメソッドをサポートしています。 サポートされている入力バッファーの構造体の詳細については、「制御メソッドの入力バッファーの構造体」を参照してください。

  • InputBufferLength は、InputBuffer によって提供される入力バッファーのサイズ (バイト単位) に設定されます。

  • OutputBufferLength は、OutputBuffer によって提供される出力バッファーのサイズ (バイト単位) を提供します。

  • InternalDeviceIoControlFALSE に設定されます。

  • Event は、呼び出し元によって割り当てられ、初期化されたイベント オブジェクトへのポインターに設定されます。 ドライバーは、I/O マネージャーがこのイベントを通知するまで待機し、下位レベルのドライバーが要求を完了したことを示します。

  • OutputBuffer は、制御メソッドからの出力引数を含む ACPI_EVAL_OUTPUT_BUFFER 構造体へのポインターを提供します。 出力引数は、特定の制御メソッドに固有のものです。 ドライバーが出力を返すには、すべての出力引数を保持するのに十分な大きさのバッファーを割り当てる必要があります。

  • IoStatusBlock は、IO_STATUS_BLOCK 構造体に設定されます。 これにより、下位レベルのドライバーによって設定された要求の状態が返されます。

入力引数を受け取らない制御メソッドを評価する方法のコード例については、「入力引数のない制御メソッドの評価」を参照してください。

入力引数を受け取る制御メソッドを評価する方法のコード例については、「入力引数を受け取る制御メソッドの評価」を参照してください。