Поделиться через


Перечисление дочерних устройств и методов управления

В пространстве имен 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 размер в байтах, необходимый для получения запрошенных путей и имен.

См. также раздел

Отправка запроса IOCTL_ACPI_ENUM_CHILDREN.