Evaluación sincrónica de métodos de control ACPI
Un controlador de dispositivo puede usar las siguientes solicitudes de control de dispositivo para evaluar de forma sincrónica los métodos de control definidos en el espacio de nombres ACPI de un dispositivo:
-
Esta solicitud evalúa un método de control que es un objeto secundario inmediato en el espacio de nombres ACPI del dispositivo al que se envía la solicitud.
-
Esta solicitud evalúa de forma sincrónica un método de control compatible con el dispositivo o un objeto secundario descendiente del dispositivo al que se envía la solicitud.
El controlador ACPI de Windows, Acpi.sys, controla estas solicitudes en nombre de los dispositivos que se especifican en las tablas de descripción del sistema en el BIOS ACPI. Estos controladores de dispositivos en modo kernel pueden usar estas solicitudes que cumplan los requisitos de Kernel-Mode Driver Framework (KMDF) o Windows Driver Model (WDM). A partir de Windows 8, los controladores de dispositivos en modo usuario que cumplan los requisitos del marco de controlador del modo de usuario (UMDF) pueden usar estas solicitudes.
Por ejemplo, un controlador WDM realiza la siguiente secuencia de operaciones para usar una de estas ICTLs:
Llama a IoBuildDeviceIoControlRequest para compilar la solicitud.
Llama a IoCallDriver para enviar la solicitud a la pila del dispositivo.
Espera a que el administrador de E/S indique al controlador que los controladores de nivel inferior han completado la solicitud.
Comprueba el estado de la solicitud.
Comprueba la validez de los argumentos de salida.
Procesa los argumentos de salida que se devuelven al controlador.
Completa la solicitud.
Para compilar una solicitud, un controlador llama a IoBuildDeviceIoControlRequest y proporciona los parámetros siguientes:
IoControlCode se establece en IOCTL_ACPI_EVAL_METHOD o IOCTL_ACPI_EVAL_METHOD_EX.
DeviceObject se establece en un puntero al objeto de dispositivo físico (PDO) del dispositivo.
InputBuffer se establece en un puntero a una estructura de búfer de entrada que depende del tipo de argumentos de entrada que se van a pasar al método de control. El controlador ACPI admite métodos que no toman argumentos de entrada, que toman un único entero, que toman una cadena ASCII o que toman una matriz personalizada de argumentos de entrada. Para obtener más información sobre las estructuras de búfer de entrada admitidas, vea Estructuras de búfer de entrada del método de control.
InputBufferLength se establece en el tamaño, en bytes, del búfer de entrada proporcionado por InputBuffer.
OutputBufferLength proporciona el tamaño, en bytes, del búfer de salida proporcionado por OutputBuffer.
InternalDeviceIoControl se establece en FALSE.
El evento se establece en un puntero a un objeto de evento asignado por el autor de la llamada e inicializado. El controlador espera hasta que el administrador de E/S señale este evento, lo que indica que los controladores de nivel inferior han completado la solicitud.
OutputBuffer proporciona un puntero a una estructura ACPI_EVAL_OUTPUT_BUFFER que contiene los argumentos de salida del método de control. Los argumentos de salida son específicos de un método de control determinado. Para que un controlador devuelva cualquier salida, debe asignar un búfer lo suficientemente grande como para contener todos los argumentos de salida.
IoStatusBlock se establece en una estructura IO_STATUS_BLOCK . Esto devuelve el estado de la solicitud establecida por los controladores de nivel inferior.
Para obtener un ejemplo de código de cómo evaluar un método de control que no toma argumentos de entrada, vea Evaluación de un método de control sin argumentos de entrada.
Para obtener un ejemplo de código de cómo evaluar un método de control que toma argumentos de entrada, vea Evaluación de un método de control que toma argumentos de entrada.