Évaluation synchrone des méthodes de contrôle ACPI

Un pilote de périphérique peut utiliser les demandes de contrôle d’appareil suivantes pour évaluer de manière synchrone les méthodes de contrôle définies dans l’espace de noms ACPI d’un appareil :

  • IOCTL_ACPI_EVAL_METHOD

    Cette requête évalue une méthode de contrôle qui est un objet enfant immédiat dans l’espace de noms ACPI de l’appareil auquel la demande est envoyée.

  • IOCTL_ACPI_EVAL_METHOD_EX

    Cette requête évalue de manière synchrone une méthode de contrôle prise en charge par l’appareil ou un objet enfant descendant de l’appareil auquel la demande est envoyée.

Le pilote WINDOWS ACPI, Acpi.sys, gère ces demandes pour le compte des appareils spécifiés dans les tables de description système du BIOS ACPI. Ces demandes peuvent être utilisées par des pilotes de périphérique en mode noyau qui répondent aux exigences de KMDF (Kernel-Mode Driver Framework) ou de WDM (Windows Driver Model). À compter de Windows 8, les pilotes de périphérique en mode utilisateur qui sont conformes aux exigences de l’infrastructure de pilotes en mode utilisateur (UMDF) peuvent utiliser ces demandes.

Par exemple, un pilote WDM effectue la séquence d’opérations suivante pour utiliser l’un de ces IOCTL :

  1. Appelle IoBuildDeviceIoControlRequest pour générer la requête.

  2. Appelle IoCallDriver pour envoyer la demande dans la pile des appareils.

  3. Attend que le gestionnaire d’E/S signale au pilote que les pilotes de niveau inférieur ont terminé la demande.

  4. Vérifie le status de la demande.

  5. Vérifie la validité des arguments de sortie.

  6. Traite les arguments de sortie qui sont retournés au pilote.

  7. Termine la demande.

Pour générer une requête, un pilote appelle IoBuildDeviceIoControlRequest et fournit les paramètres suivants :

  • IoControlCode est défini sur IOCTL_ACPI_EVAL_METHOD ou IOCTL_ACPI_EVAL_METHOD_EX.

  • DeviceObject est défini sur un pointeur vers l’objet d’appareil physique (PDO) de l’appareil.

  • InputBuffer est défini sur un pointeur vers une structure de mémoire tampon d’entrée qui dépend du type d’arguments d’entrée à passer à la méthode de contrôle. Le pilote ACPI prend en charge les méthodes qui ne prennent pas d’arguments d’entrée, qui prennent un entier unique, qui prennent une chaîne ASCII ou qui prennent un tableau personnalisé d’arguments d’entrée. Pour plus d’informations sur les structures de mémoire tampon d’entrée prises en charge, consultez Structures de mémoire tampon d’entrée de méthode de contrôle.

  • InputBufferLength est défini sur la taille, en octets, de la mémoire tampon d’entrée fournie par InputBuffer.

  • OutputBufferLength fournit la taille, en octets, de la mémoire tampon de sortie fournie par OutputBuffer.

  • InternalDeviceIoControl a la valeur FALSE.

  • L’événement est défini sur un pointeur vers un objet d’événement alloué et initialisé par l’appelant. Le pilote attend que le gestionnaire d’E/S signale cet événement, ce qui indique que les pilotes de niveau inférieur ont terminé la demande.

  • OutputBuffer fournit un pointeur vers une structure ACPI_EVAL_OUTPUT_BUFFER qui contient les arguments de sortie de la méthode de contrôle. Les arguments de sortie sont spécifiques à une méthode de contrôle donnée. Pour qu’un pilote retourne une sortie, il doit allouer une mémoire tampon suffisamment grande pour contenir tous les arguments de sortie.

  • IoStatusBlock est défini sur une structure IO_STATUS_BLOCK . Cette opération retourne la status de la requête qui a été définie par les pilotes de niveau inférieur.

Pour obtenir un exemple de code montrant comment évaluer une méthode de contrôle qui ne prend pas d’arguments d’entrée, consultez Évaluation d’une méthode de contrôle sans arguments d’entrée.

Pour obtenir un exemple de code montrant comment évaluer une méthode de contrôle qui prend des arguments d’entrée, consultez Évaluation d’une méthode de contrôle qui prend des arguments d’entrée.