동기적으로 ACPI 제어 메서드 평가

디바이스 드라이버는 다음 디바이스 제어 요청을 사용하여 디바이스의 ACPI 네임스페이스에 정의된 제어 메서드를 동기적으로 평가할 수 있습니다.

  • IOCTL_ACPI_EVAL_METHOD

    이 요청은 요청이 전송되는 디바이스의 ACPI 네임스페이스에 있는 직접 자식 개체인 제어 메서드를 평가합니다.

  • IOCTL_ACPI_EVAL_METHOD_EX

    이 요청은 디바이스 또는 요청이 전송되는 디바이스의 하위 자식 개체에서 지원하는 제어 메서드를 동기적으로 평가합니다.

Acpi.sys Windows ACPI 드라이버는ACPI BIOS의 시스템 설명 테이블에 지정된 디바이스를 대신하여 이러한 요청을 처리합니다. 이러한 요청은 KMDF(커널 모드 드라이버 프레임워크) 또는 WDM(Windows 드라이버 모델)의 요구 사항을 준수하는 커널 모드 디바이스 드라이버에서 사용할 수 있습니다. 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 드라이버는 입력 인수를 사용하지 않거나, 단일 정수, ASCII 문자열을 사용하거나, 입력 인수의 사용자 지정 배열을 사용하는 메서드를 지원합니다. 지원되는 입력 버퍼 구조에 대한 자세한 내용은 제어 메서드 입력 버퍼 구조를 참조하세요.

  • InputBufferLengthInputBuffer에서 제공하는 입력 버퍼의 크기(바이트)로 설정됩니다.

  • OutputBufferLengthOutputBuffer에서 제공하는 출력 버퍼의 크기(바이트)를 제공합니다.

  • InternalDeviceIoControlFALSE로 설정됩니다.

  • 이벤트는 호출자가 할당하고 초기화된 이벤트 개체에 대한 포인터로 설정됩니다. 드라이버는 I/O 관리자가 이 이벤트에 신호를 보낼 때까지 기다립니다. 이는 하위 수준 드라이버가 요청을 완료했음을 나타냅니다.

  • OutputBuffer 는 컨트롤 메서드의 출력 인수를 포함하는 ACPI_EVAL_OUTPUT_BUFFER 구조체에 대한 포인터를 제공합니다. 출력 인수는 지정된 컨트롤 메서드와 관련이 있습니다. 드라이버가 출력을 반환하려면 모든 출력 인수를 저장할 수 있을 만큼 큰 버퍼를 할당해야 합니다.

  • IoStatusBlockIO_STATUS_BLOCK 구조체로 설정됩니다. 하위 수준 드라이버에서 설정한 요청의 상태 반환합니다.

입력 인수를 사용하지 않는 컨트롤 메서드를 평가하는 방법에 대한 코드 예제는 입력 인수 없이 컨트롤 메서드 평가를 참조하세요.

입력 인수를 사용하는 컨트롤 메서드를 평가하는 방법에 대한 코드 예제는 입력 인수 를 사용하는 컨트롤 메서드 평가를 참조하세요.