Перечисление дочерних устройств и методов управления
В пространстве имен ACPI объект, который является устройством( например, устройство с именем "ABCD", может иметь дочерние объекты, которые являются дочерними устройствами устройства или являются методами управления, поддерживаемыми устройством. Любой дочерний объект, который является дочерним устройством родительского устройства, может, в свою очередь, рекурсивно иметь дочерние объекты, которые являются дочерними устройствами или методами управления.
Например, в следующем упрощенном пространстве имен ACPI корень пространства имен ACPI обозначается с помощью "\", а объект "ABCD" — это устройство, которое является непосредственным дочерним элементом корневого пространства имен ACPI. Кроме того, устройство "ABCD" имеет два непосредственных дочерних устройства с именами "CHL1" и "CHL2" и дочерний объект, который является методом управления с именем "_FOO". Кроме того, дочернее устройство "CHL2" имеет дочернее устройство CHL3, а устройство "CHL3" — дочерний объект, который является методом управления с именем "_FOO".
\ root of ACPI namespace
ABCD parent device
CHL1 child device of ABCD
CHL2 child device of ABCD
CHL3 child device of CHL2
_FOO control method
_FOO control method
Чтобы использовать IOCTL_ACPI_EVAL_METHOD_EX или IOCTL_ACPI_ASYNC_EVAL_METHOD_EX, драйвер для устройства предоставляет путь и имя метода управления в пространстве имен ACPI. Чтобы получить путь и имя устройства и дочерних объектов устройства, Windows поддерживает запрос IOCTL_ACPI_ENUM_CHILDREN . Ссылаясь на упрощенное пространство имен ACPI, представленное в этом разделе в качестве примера, драйвер в стеке устройств "ABCD" может использовать этот запрос для выполнения следующих действий:
Перечисление устройств "ABCD" и непосредственных дочерних устройств "ABCD". Например, запрос можно использовать для возврата "\ABCD", "\ABCD". CHL1 и \ABCD. CHL2.'
Рекурсивное перечисление всех устройств в пространстве имен ABCD. Например, запрос можно использовать для возврата "\ABCD", "\ABCD". CHL1, '\ABCD. CHL2 и \ABCD. CHL2. CHL3.'
Рекурсивное перечисление всех дочерних объектов ABCD указанного имени. Указанное имя действует как фильтр, чтобы перечислялись только те дочерние объекты, которые имеют то же имя. Например, для указанного имени "_FOO" запрос можно использовать для возврата "\ABCD._FOO" и "\ABCD". CHL2. CHL3._FOO.
Получив путь и имя метода элемента управления, драйвер может указать путь и имя в качестве входных данных для IOCTL_ACPI_EVAL_METHOD_EX или IOCTL_ACPI_ASYNC_EVAL_METHOD_EX, как описано в статье Синхронная оценка методов управления ACPI.
Запрос IOCTL_ACPI_ENUM_CHILDREN принимает в качестве входных данных выделенную драйвером переменную длины ACPI_ENUM_CHILDREN_INPUT_BUFFER структуру, содержащую следующие элементы:
Signature
Сигнатура входного буфера, для которой необходимо задать значение ACPI_ENUM_CHILDREN_INPUT_BUFFER_SIGNATURE.
Flags
Флаг, определяющий, какие объекты в пространстве имен ACPI устройства, перечисляемого драйвером ACPI. Драйвер ACPI возвращает полный путь и имя перечисленного объекта, начиная с корня пространства имен ACPI. Флаг должен иметь одно из следующих значений:
Flag | Описание |
---|---|
ENUM_CHILDREN_IMMEDIATE_ONLY | Перечисляет устройство и перечисляет непосредственные дочерние устройства устройства. |
ENUM_CHILDREN_MULTILEVEL | Перечисляет устройство и рекурсивно перечисляет все дочерние устройства устройства. |
ENUM_CHILDREN_NAME_IS_FILTER | Побитовое ИЛИ ENUM_CHILDREN и ENUM_CHILDREN_NAME_IS_FILTER перечисляет дочерние объекты устройства, имя которых идентично указанному элементом Name . |
NameLength
Количество символов ASCII, содержащихся в массиве Name .
Name
Четырехзначный массив ASCII с завершением NULL, содержащий имя дочернего объекта, используемого драйвером ACPI для ограничения перечисления дочерних объектов теми объектами, которые имеют то же имя.
Запрос IOCTL_ACPI_ENUM_CHILDREN возвращает путь и имя дочерних объектов в выделенном драйвером ACPI_ENUM_CHILDREN_OUTPUT_BUFFER переменной длины, который содержит следующие элементы:
Signature
Сигнатура выходного буфера, для которой необходимо задать значение ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE.
NumberOfChildren
Количество элементов типа ACPI_ENUM_CHILD в массиве Children .
Children
Массив элементов типа ACPI_ENUM_CHILD. Элемент Name структуры ACPI_ENUM_CHILD содержит путь и имя дочернего объекта, а элемент Flags указывает, имеет ли дочерний объект дочерние объекты.
Если выделенный драйвером выходной буфер недостаточно велик, чтобы вернуть все перечисленные дочерние имена, драйвер ACPI не возвращает дочерних имен и задает элемент Status IO_STATUS_BLOCK для STATUS_BUFFER_OVERFLOW запроса. В этом случае, если размер выходного буфера в байтах не ниже sizeof(ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE), драйвер ACPI также устанавливает для NumberOfChildren размер в байтах, необходимый для получения запрошенных путей и имен.