Synchrones Auswerten von ACPI-Steuerungsmethoden

Ein Gerätetreiber kann die folgenden Gerätesteuerungsanforderungen verwenden, um Steuerungsmethoden synchron auszuwerten, die im ACPI-Namespace eines Geräts definiert sind:

  • IOCTL_ACPI_EVAL_METHOD

    Diese Anforderung wertet eine Steuerungsmethode aus, die ein unmittelbar untergeordnetes Objekt im ACPI-Namespace des Geräts ist, an das die Anforderung gesendet wird.

  • IOCTL_ACPI_EVAL_METHOD_EX

    Diese Anforderung wertet synchron eine Steuerungsmethode aus, die vom Gerät unterstützt wird, oder ein untergeordnetes untergeordnetes Objekt des Geräts, an das die Anforderung gesendet wird.

Der Windows ACPI-Treiber Acpi.sys verarbeitet diese Anforderungen im Auftrag von Geräten, die in den Systembeschreibungstabellen im ACPI-BIOS angegeben sind. Diese Anforderungen können von Kernelmodus-Gerätetreibern verwendet werden, die den Anforderungen des Kernelmodustreiberframeworks (KMDF) oder des Windows-Treibermodells (WDM) entsprechen. Ab Windows 8 können Gerätetreiber im Benutzermodus, die den Anforderungen des User-Mode Driver Framework (UMDF) entsprechen, diese Anforderungen verwenden.

Ein WDM-Treiber führt beispielsweise die folgende Vorgangssequenz aus, um eine dieser IOCTLs zu verwenden:

  1. Ruft IoBuildDeviceIoControlRequest auf, um die Anforderung zu erstellen.

  2. Ruft IoCallDriver auf, um die Anforderung über den Gerätestapel zu senden.

  3. Wartet, bis der E/A-Manager dem Treiber signalisiert, dass die Niedrigeren Treiber die Anforderung abgeschlossen haben.

  4. Überprüft die status der Anforderung.

  5. Überprüft die Gültigkeit der Ausgabeargumente.

  6. Verarbeitet die Ausgabeargumente, die an den Treiber zurückgegeben werden.

  7. Schließt die Anforderung ab.

Um eine Anforderung zu erstellen, ruft ein Treiber IoBuildDeviceIoControlRequest auf und stellt die folgenden Parameter bereit:

  • IoControlCode ist auf IOCTL_ACPI_EVAL_METHOD oder IOCTL_ACPI_EVAL_METHOD_EX festgelegt.

  • DeviceObject ist auf einen Zeiger auf das physische Geräteobjekt (PDO) des Geräts festgelegt.

  • InputBuffer ist auf einen Zeiger auf eine Eingabepufferstruktur festgelegt, die vom Typ der Eingabeargumente abhängt, die an die Steuerelementmethode übergeben werden sollen. Der ACPI-Treiber unterstützt Methoden, die keine Eingabeargumente annehmen, die eine einzelne ganze Zahl, eine ASCII-Zeichenfolge oder ein benutzerdefiniertes Array von Eingabeargumenten annehmen. Weitere Informationen zu den unterstützten Eingabepufferstrukturen finden Sie unter Steuerungsmethode Eingabepufferstrukturen.

  • InputBufferLength ist auf die Größe des Eingabepuffers in Bytes festgelegt, die von InputBuffer bereitgestellt wird.

  • OutputBufferLength stellt die Größe des Ausgabepuffers in Bytes bereit, der von OutputBuffer bereitgestellt wird.

  • InternalDeviceIoControl ist auf FALSE festgelegt.

  • Ereignis wird auf einen Zeiger auf ein vom Aufrufer zugewiesenes und initialisiertes Ereignisobjekt festgelegt. Der Treiber wartet, bis der E/A-Manager dieses Ereignis signalisiert, was angibt, dass die Treiber auf niedrigerer Ebene die Anforderung abgeschlossen haben.

  • OutputBuffer stellt einen Zeiger auf eine ACPI_EVAL_OUTPUT_BUFFER-Struktur bereit, die die Ausgabeargumente der Steuerelementmethode enthält. Ausgabeargumente sind spezifisch für eine bestimmte Steuerelementmethode. Damit ein Treiber eine Ausgabe zurückgibt, muss er einen Puffer zuweisen, der groß genug ist, um alle Ausgabeargumente aufzunehmen.

  • IoStatusBlock ist auf eine IO_STATUS_BLOCK-Struktur festgelegt. Dadurch wird der status der Anforderung zurückgegeben, die von den Treibern auf niedrigerer Ebene festgelegt wurde.

Ein Codebeispiel zum Auswerten einer Steuerelementmethode, die keine Eingabeargumente akzeptiert, finden Sie unter Auswerten einer Steuerelementmethode ohne Eingabeargumente.

Ein Codebeispiel zum Auswerten einer Steuerelementmethode, die Eingabeargumente akzeptiert, finden Sie unter Auswerten einer Steuerelementmethode, die Eingabeargumente übernimmt.