Partilhar via


Avaliando métodos de controle ACPI de forma síncrona

Um driver de dispositivo pode usar as seguintes solicitações de controle de dispositivo para avaliar de forma síncrona os métodos de controle definidos no namespace ACPI de um dispositivo:

  • IOCTL_ACPI_EVAL_METHOD

    Essa solicitação avalia um método de controle que é um objeto filho imediato no namespace ACPI do dispositivo para o qual a solicitação é enviada.

  • IOCTL_ACPI_EVAL_METHOD_EX

    Essa solicitação avalia de forma síncrona um método de controle suportado pelo dispositivo ou um objeto filho descendente do dispositivo para o qual a solicitação é enviada.

O de driver ACPI do Windows, Acpi.sys, lida com essas solicitações em nome de dispositivos especificados nas tabelas de descrição do sistema no BIOS ACPI. Essas solicitações podem ser usadas por drivers de dispositivo de modo kernel que estejam em conformidade com os requisitos do Kernel-Mode Driver Framework (KMDF) ou do Windows Driver Model (WDM). A partir do Windows 8, os drivers de dispositivo de modo utilizador que atendem aos requisitos do Driver Framework (UMDF) User-Mode podem usar essas solicitações.

Por exemplo, um driver WDM executa a seguinte sequência de operações para usar uma dessas IOCTLs:

  1. Chama IoBuildDeviceIoControlRequest para criar a solicitação.

  2. Chama IoCallDriver para enviar a solicitação para baixo da pilha de dispositivos.

  3. Aguarda que o gerente de E/S sinalize ao driver que os drivers de nível inferior concluíram a solicitação.

  4. Verifica o status da solicitação.

  5. Verifica a validade dos argumentos de saída.

  6. Processa os argumentos de saída que são retornados ao driver.

  7. Conclui a solicitação.

Para criar uma solicitação, um driver chama IoBuildDeviceIoControlRequest e fornece os seguintes parâmetros:

  • IoControlCode está definido como IOCTL_ACPI_EVAL_METHOD ou IOCTL_ACPI_EVAL_METHOD_EX.

  • DeviceObject é configurado como um ponteiro para o objeto de dispositivo físico (PDO) do dispositivo.

  • InputBuffer é definido como um ponteiro para uma estrutura de buffer de entrada que depende do tipo de argumentos de entrada a serem passados para o método de controle. O driver ACPI oferece suporte a métodos que não usam argumentos de entrada, que usam um único inteiro, que usam uma cadeia de caracteres ASCII ou que usam uma matriz personalizada de argumentos de entrada. Para obter mais informações sobre as estruturas de buffer de entrada suportadas, consulte Control Method Input Buffer Structures.

  • InputBufferLength é definido como o tamanho, em bytes, do buffer de entrada fornecido pelo InputBuffer.

  • OutputBufferLength indica o tamanho, em bytes, do buffer de saída fornecido pelo OutputBuffer.

  • InternalDeviceIoControl está definido como FALSE.

  • O evento em é definido como um ponteiro para um objeto de evento alocado e inicializado pelo chamador. O driver aguarda até que o gerenciador de E/S sinalize esse evento, o que indica que os drivers de nível inferior concluíram a solicitação.

  • OutputBuffer fornece um ponteiro para uma estrutura de ACPI_EVAL_OUTPUT_BUFFER que contém os argumentos de saída do método de controle. Os argumentos de saída são específicos de um determinado método de controle. Para que um driver retorne qualquer saída, ele deve alocar um buffer grande o suficiente para conter todos os argumentos de saída.

  • IoStatusBlock é definido como uma estrutura IO_STATUS_BLOCK. Isso retorna o status da solicitação que foi definida pelos drivers de nível inferior.

Para obter um exemplo de código de como avaliar um método de controle que não usa argumentos de entrada, consulte Avaliando um método de controle sem argumentos de entrada.

Para obter um exemplo de código de como avaliar um método de controle que usa argumentos de entrada, consulte Avaliando um método de controle que usa argumentos de entrada.