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

В пространстве имен 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. Флаг должен иметь одно из следующих значений:

Флаг Описание
ENUM_CHILDREN_IMMEDIATE_ONLY Перечисляет устройство и его непосредственные дочерние устройства.
ENUM_CHILDREN_MULTILEVEL Перечисляет устройство и рекурсивно перечисляет все его дочерние устройства.
ENUM_CHILDREN_NAME_IS_FILTER Битовое ИЛИ параметров ENUM_CHILDREN и ENUM_CHILDREN_NAME_IS_FILTER перечисляет дочерние объекты устройства, имя которых совпадает с именем, указанным в элементе Name.

NameLength

Число символов ASCII, содержащихся в массиве имен .

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

Массив элементов типа ACPI_ENUM_CHILD. Элемент Name ACPI_ENUM_CHILD структуры содержит путь и имя дочернего объекта, а элемент Flags указывает, имеет ли дочерний объект дочерние объекты.

Если выходной буфер, выделенный драйвером, недостаточно велик, чтобы вернуть все перечисленные дочерние имена, драйвер ACPI не возвращает ни одного дочернего имени и устанавливает элемент Status структуры IO_STATUS_BLOCK для запроса STATUS_BUFFER_OVERFLOW. В этом случае, если размер в байтах выходного буфера составляет по крайней мере размер(ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE), драйвер ACPI также задает NumberOfChildren размеру в байтах, который требуется для получения запрошенных путей и имен.

См. также

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