Синхронная оценка методов управления ACPI
Драйвер устройства может использовать следующие запросы управления устройством для синхронной оценки методов управления, определенных в пространстве имен ACPI устройства:
-
Этот запрос оценивает метод управления, который является непосредственным дочерним объектом в пространстве имен ACPI устройства, на которое отправляется запрос.
-
Этот запрос синхронно оценивает метод управления, поддерживаемый устройством или дочерним объектом устройства, на которое отправляется запрос.
Драйвер Windows ACPI, Acpi.sys, обрабатывает эти запросы от имени устройств, указанных в таблицах описания системы в BIOS ACPI. Эти запросы могут использоваться драйверами устройств в режиме ядра, которые соответствуют требованиям платформы драйверов в режиме ядра (KMDF) или модели драйвера Windows (WDM). Начиная с Windows 8, эти запросы могут использовать драйверы устройств в пользовательском режиме, соответствующие требованиям среда выполнения платформы драйвера режима пользователя (UMDF).
Например, драйвер WDM выполняет следующую последовательность операций для использования одного из этих ioCTL:
Вызывает IoBuildDeviceIoControlRequest для построения запроса.
Вызывает IoCallDriver для отправки запроса в стеке устройств.
Ожидает, пока диспетчер ввода-вывода сообщит драйверу о том, что драйверы нижнего уровня выполнили запрос.
Проверяет состояние запроса.
Проверяет допустимость выходных аргументов.
Обрабатывает выходные аргументы, возвращаемые драйверу.
Завершает запрос.
Чтобы создать запрос, драйвер вызывает IoBuildDeviceIoControlRequest и предоставляет следующие параметры:
IoControlCode имеет значение IOCTL_ACPI_EVAL_METHOD или IOCTL_ACPI_EVAL_METHOD_EX.
DeviceObject — это указатель на физический объект устройства (PDO).
InputBuffer имеет указатель на структуру входного буфера, которая зависит от типа входных аргументов, передаваемых методу элемента управления. Драйвер ACPI поддерживает методы, которые не принимают входные аргументы, принимают одно целое число, принимают строку ASCII или берут пользовательский массив входных аргументов. Дополнительные сведения о поддерживаемых структурах входных буферов см. в разделе Структуры входных буферов метода управления.
InputBufferLength устанавливается в размере входного буфера в байтах, предоставляемого InputBuffer.
OutputBufferLength предоставляет размер выходного буфера в байтах, предоставляемый OutputBuffer.
Параметр InternalDeviceIoControl имеет значение FALSE.
Событие — это указатель на выделенный вызывающим и инициализированный объект события. Драйвер ожидает, пока диспетчер ввода-вывода не сообщит об этом событии, которое указывает, что драйверы более низкого уровня выполнили запрос.
OutputBuffer предоставляет указатель на структуру ACPI_EVAL_OUTPUT_BUFFER , содержащую выходные аргументы из метода элемента управления. Выходные аргументы относятся к конкретному методу элемента управления. Чтобы драйвер возвращал любые выходные данные, он должен выделить буфер, который достаточно велик для хранения всех выходных аргументов.
IoStatusBlock имеет IO_STATUS_BLOCK структуру. При этом возвращается состояние запроса, заданного драйверами нижнего уровня.
Пример кода вычисления метода элемента управления, который не принимает входные аргументы, см. в разделе Оценка метода управления без входных аргументов.
Пример кода вычисления метода управления, принимающего входные аргументы, см. в разделе Оценка метода управления, принимающего входные аргументы.