在 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和ENUM_CHILDREN_NAME_IS_FILTER的位元或運算會列舉裝置的子物件,其名稱與 Name 成員所提供的名稱相同。 |
NameLength
Name 數組包含的 ASCII 字元數。
Name
NULL 終止的四個字元 ASCII 陣列,其中包含子物件的名稱,ACPI 驅動程式用來限制子物件的列舉,只限於具有相同名稱的子物件。
IOCTL_ACPI_ENUM_CHILDREN 要求會在驅動程式分配的可變長度 ACPI_ENUM_CHILDREN_OUTPUT_BUFFER 中傳回包含下列成員的子物件之路徑和名稱:
Signature
輸出緩衝區的簽章,必須設定為 ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE。
NumberOfChildren
Children 陣列中,類型為 ACPI_ENUM_CHILD 的元素數量。
Children
類型為 ACPI_ENUM_CHILD的項目陣列。 ACPI_ENUM_CHILD 結構 Name 成員包含子對象的路徑和名稱,而 Flags 成員指出子物件是否具有子物件。
如果驅動程式配置的輸出緩衝區不夠大,無法傳回所有列舉的子名稱,ACPI 驅動程式不會傳回任何子名稱,並將 Status 成員設定為STATUS_BUFFER_OVERFLOW要求之IO_STATUS_BLOCK的成員。 在這種情況下,如果輸出緩衝區的大小(以位元組計算)至少等於 sizeof(ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE),則 ACPI 驅動程式會將 NumberOfChildren 設定為擷取所需路徑和名稱所需的位元組大小。