Compartilhar 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 compatível com o dispositivo ou um objeto filho descendente do dispositivo para o qual a solicitação é enviada.

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

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

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

  2. Chama IoCallDriver para enviar a solicitação para baixo na pilha do dispositivo.

  3. Aguarda o gerente de E/S sinalizar 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 para o driver.

  7. Conclui a solicitação.

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

  • IoControlCode é definido como IOCTL_ACPI_EVAL_METHOD ou IOCTL_ACPI_EVAL_METHOD_EX.

  • DeviceObject é definido como um ponteiro para o PDO (objeto de dispositivo físico) 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 dá suporte a métodos que não têm argumentos de entrada, que levam um único inteiro, que levam uma cadeia de caracteres ASCII ou que têm uma matriz personalizada de argumentos de entrada. Para obter mais informações sobre as estruturas de buffer de entrada com suporte, consulte Estruturas de buffer de entrada do método control.

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

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

  • InternalDeviceIoControl é definido como FALSE.

  • O evento é definido como um ponteiro para um objeto de evento alocado pelo chamador e inicializado. O driver aguarda até que o gerente 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 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 para um determinado método de controle. Para que um driver retorne qualquer saída, ele deve alocar um buffer grande o suficiente para manter 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.