입력 인수를 사용하는 제어 메서드 평가

입력 인수를 사용하는 제어 메서드를 동기적으로 평가하기 위해 디바이스의 드라이버는 디바이스에 IOCTL_ACPI_EVAL_METHOD 요청 또는 IOCTL_ACPI_EVAL_METHOD_EX 요청을 보냅니다. 이러한 두 요청을 사용하는 일반적인 절차는 ACPI 제어 메서드를 동기적으로 평가에 설명되어 있습니다. 이러한 두 요청을 사용하는 경우의 구체적인 차이점은 다음과 같습니다.

이 항목에 제공된 EvaluateABCDWithInputArgument 함수 예제에서는 드라이버가 IOCTL_ACPI_EVAL_METHOD 요청을 사용하여 단일 정수 입력 인수를 사용하는 'ABCD'라는 컨트롤 메서드를 평가하는 방법을 보여 드립니다.

입력 인수가 정수 대신 문자열 또는 사용자 지정 데이터 배열인 경우 예제 코드를 변경하는 데 필요한 변경은 정수 입력 구조 대신 문자열 입력 구조 또는 복잡한 입력 구조를 제공하는 것입니다.

또한 'ABCD' 컨트롤 메서드가 직접 자식 개체가 아닌 경우 예제 코드에 필요한 변경 내용은 다음과 같습니다.

  • IOCTL_ACPI_EVAL_METHOD 요청 대신 IOCTL_ACPI_EVAL_METHOD_EX 요청을 보냅니다.

  • 입력 인수 형식(단순 정수, 단순 문자열 또는 복합)에 해당하는 확장된 입력 구조의 형식을 제공합니다.

EvaluateABCDWithInputArgument 는 먼저 ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER 구조 체 inputBuffer 를 할당한 다음 MethodNameAsUlong 멤버를 컨트롤 메서드의 이름으로 설정하고 IntegerArgument 멤버를 입력 정수 값으로 설정하고 Signature 멤버를 ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE 설정합니다.

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

EvaluateABCDWithInputArgumentACPI_EVAL_OUTPUT_BUFFER 구조 출력 버퍼도 할당하지만 outputBuffer의 멤버는 설정하지 않습니다.

EvaluateABCDWithInputArgument 는 다음을 수행하는 SendDownStreamIrp 이라는 드라이버 제공 함수를 호출합니다.

  1. IoBuildDeviceIoControlRequest를 호출하여 요청을 빌드합니다.

  2. IoCallDriver를 호출하여 디바이스 스택 아래로 요청을 보냅니다.

  3. I/O 관리자가 하위 수준 드라이버가 요청을 완료했음을 드라이버에 알릴 때까지 기다립니다.

SendDownStreamIrp 은 I/O 관리자가 하위 수준 드라이버가 요청을 완료했음을 알린 후 를 반환합니다.

EvaluateABCDWithInputArgument에는 포함되지 않았지만 SendDownStreamIrp이 반환된 후에도 드라이버에서 다음과 같은 추가 작업을 수행해야 합니다.

  1. SendDownStreamIrp에서 반환하는 상태 확인합니다. SendDownStreamIrp이 STATUS_SUCCESS 반환하지 않으면 드라이버는 추가 처리 없이 반환해야 합니다.

  2. 출력 매개 변수의 유효성을 확인합니다. outputBuffer가 유효한 출력 데이터를 포함하려면 서명을 ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE 설정해야 하며 Count는 0보다 커야 합니다.

  3. 드라이버에 다시 전달된 출력 매개 변수를 처리합니다.

  4. IoCompleteRequest를 호출하여 IOCTL_ACPI_EVAL_METHOD 요청을 완료합니다.

다음 예제에서 사용되는 ACPI 데이터 구조 및 상수는 Acpiioct.h에 정의되어 있습니다.

NTSTATUS
EvaluateABCDWithInputArgument(
    IN PDEVICE_OBJECT   Pdo,
    IN ULONG            Argument1,
    OUT PULONG          ReturnStatus
    )
/*
Routine Description:
    Called to evaluate the example 'ABCD' method with a single integer input argument

Parameters:
    Pdo             - For the device.
    Argument1       - Input argument.
    ReturnStatus    - Pointer to where the status data is placed.

Return Value:
    NT Status of the operation
*/
{
 ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER  inputBuffer;
    ACPI_EVAL_OUTPUT_BUFFER                outputBuffer; 
    NTSTATUS                               status;
    PACPI_METHOD_ARGUMENT                  argument;

    .
    .
    // Omitted: bounds checking on Argument1 value.


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

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

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

    return status;
}