次の方法で共有


入力引数なしの制御メソッドを評価する

入力引数を受け取らない制御メソッドを同期的に評価するために、デバイスのドライバーは IOCTL_ACPI_EVAL_METHOD 要求または IOCTL_ACPI_EVAL_METHOD_EX 要求をデバイスに送信します。 これらの両方の要求を使用する一般的な手順については、「ACPI 制御メソッドを同期的に評価する」を参照してください。 これら 2 つの要求を使用する具体的な違いは次のとおりです。

  • 制御メソッドがデバイスの直接の子オブジェクトである場合、ドライバーは IOCTL_ACPI_EVAL_METHOD 要求を送信し、ACPI_EVAL_INPUT_BUFFER 入力構造体を提供します。

  • 制御メソッドがデバイスの ACPI 名前空間内の子オブジェクトであるが、デバイスの直接の子オブジェクトではない場合、ドライバーは IOCTL_ACPI_EVAL_METHOD_EX 要求を送信し、ACPI_EVAL_INPUT_BUFFER_EX 構造体を提供します。

このトピックで提供される GetAbcData 関数の例は、デバイスのドライバーが IOCTL_ACPI_EVAL_METHOD 要求を使用して、デバイスがサポートする "ABCD" という名前の制御メソッドを評価する方法を示しています。 "ABCD" 制御メソッドは、ACPI 名前空間内のデバイスの直接の子であり、入力引数を受け取ったり、出力引数を返したりしません。

"ABCD" 制御メソッドが直接の子オブジェクトでない場合、このコード例に対して必要な変更は次のようになります。

  • IOCTL_ACPI_EVAL_METHOD 要求ではなく、IOCTL_ACPI_EVAL_METHOD_EX 要求を送信します。

  • ACPI_EVAL_INPUT_BUFFER 構造体ではなく、ACPI_EVAL_INPUT_BUFFER_EX 構造体を指定します。

GetAbcData はまず ACPI_EVAL_INPUT_BUFFER 構造体 inputBuffer を割り当て、MethodNameAsUlong メンバーを制御メソッドの名前に設定し、Signature メンバーを ACPI_EVAL_INPUT_BUFFER_SIGNATURE に設定します。

    // Fill in the input data
    inputBuffer.MethodNameAsUlong = (ULONG) ('DCBA');
    inputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE;

GetAbcDataACPI_EVAL_OUTPUT_BUFFER 構造体 outputBuffer も設定しますが、outputBuffer のメンバーは設定しません。

次に、GetAbcData はドライバーが提供する SendDownStreamIrp という名前の関数を呼び出し、次の処理を実行します。

  1. IoBuildDeviceIoControlRequest 呼び出し、要求をビルドします。

  2. IoCallDriver を呼び出して、デバイス スタックに要求を送信します。

  3. I/O マネージャーが、下位レベルのドライバーが要求を完了したことをドライバーに通知するまで待機します。

SendDownStreamIrp は、下位レベルのドライバーが要求を完了したことを I/O マネージャーが通知した後に返されます。 前述のコード例では、次の操作を実行します。

  1. 下位レベルのドライバーが STATUS_SUCCESS を返さなかった場合は、要求の状態を確認し、追加の処理なしで戻ります。

  2. 出力引数の有効性を確認します。 outputBuffer に有効な出力データを格納するには、Signature を ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE に設定し、Count を 0 より大きい値にする必要があります。

  3. ACPI ドライバーがドライバーに渡した出力引数を処理します。

この手順はコード例には含まれていませんが、ドライバーは、出力データを処理して、保留中の IOCTL_ACPI_EVAL_METHOD 要求またはドライバーが制御メソッドの評価目的で送信した IOCTL_ACPI_EVAL_METHOD 要求を完了した後に、IoCompleteRequest を呼び出す必要があります。

次の例で使用する ACPI データ構造と定数は、Acpiioct.h で定義されます。

NTSTATUS
GetAbcdData(
    IN PDEVICE_OBJECT   Pdo,
    OUT PULONG          ReturnStatus
    )
/*++

Routine Description:
    Evaluates the ABCD method on the device in the ACPI namespace referenced by Pdo

Parameters
    Pdo             - PDO for the device
    ReturnStatus    - Pointer to where the status data is placed

Return Value:
    NT Status of the operation

--*/
{
    ACPI_EVAL_INPUT_BUFFER  inputBuffer;
    ACPI_EVAL_OUTPUT_BUFFER outputBuffer;
    NTSTATUS                status;
    PACPI_METHOD_ARGUMENT   argument;

    .
    .

    ASSERT( ReturnStatus != NULL );
    *ReturnStatus = 0x0;

    // Fill in the input data
    inputBuffer.MethodNameAsUlong = (ULONG) ('DCBA');
    inputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE;

    // Send the request along
    status = SendDownStreamIrp(
       Pdo,
       IOCTL_ACPI_EVAL_METHOD,
       &inputBuffer,
       sizeof(ACPI_EVAL_INPUT_BUFFER),
       &outputBuffer,
       sizeof(ACPI_EVAL_OUTPUT_BUFFER)
       );

    if (!NT_SUCCESS(status)) {
       return status;
    }

    // Verify the data
    if (outputBuffer != NULL) {
        if ( ( (PACPI_EVAL_OUTPUT_BUFFER) outputBuffer->Signature != 
            ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE ||
            ( (PACPI_EVAL_OUTPUT_BUFFER) outputBuffer->Count == 0) {
            return STATUS_ACPI_INVALID_DATA;
        } 
}

    // Retrieve the output argument
    argument = outputBuffer.Argument;
 
// Process the output argument
 .
.
.
 
    return status;
}