The hardware tree is a structure, in memory that is built and maintained by the Configuration Manager. The hardware tree contains configuration information for all devices in the computer and Configuration Manager uses it to keep track of the resources associated with each device, such as IRQs, IO ports and even non-sharable resources like SCSI identifiers. The hardware tree describes existing devices and resources, resource requirements, resource interdependencies, and current resource allocations.
A device node is a specific entry in the hardware tree. Each device node contains a unique device identifier and a list of resource requirements. The device identifier is a string which uniquely describes the device. The string typically identifies the component that found the device, but because it is also used as a key in the registry, it must be unique within the system so that information about the device can be retrieved reliably.
The requirements list identifies the type resources the device needs to successfully operate and any constraints associated with those resources. IRQs, IO ports, DMA channels and memory ranges are examples of types of resources. Constraints are often resource interdependencies; such a device requiring that it must use IRQ3 and IO port 02F8 in combination in order to operate successfully.
Although a device driver or other component cannot access the hardware tree or the device nodes directly, it can retrieve a handle to any device node and carry out tasks that retrieve and set information in the device node. The Configuration Manager provides these services to carry out tasks on a device node:
Service | Description |
CONFIGMG_Create_DevNode | Adds a device node to the hardware tree. |
CONFIGMG_Disable_DevNode | Disables a device node in the hardware tree. |
CONFIGMG_Enable_DevNode | Enables a device node in the hardware tree. |
CONFIGMG_Get_Child | Retrieves the first child of a given device node. |
CONFIGMG_Get_Depth | Retrieves the depth of a device node in the hardware tree. |
CONFIGMG_Get_Device_ID | Retrieves the device identifier for a device node. |
CONFIGMG_Get_Device_ID_Size | Retrieves the size of a device identifier from a device node. |
CONFIGMG_Get_DevNode_Status | Retrieves the status of a device node. |
CONFIGMG_Get_Parent | Retrieves the handle of a parent of a device node. |
CONFIGMG_Get_Sibling | Retrieves the sibling of a device node. |
CONFIGMG_Locate_DevNode | Retrieves a pointer to the device node corresponding to a specified device driver. |
CONFIGMG_Move_DevNode | Replaces a root enumerated devnode by the valid non-root enumerated devnode. |
CONFIGMG_Query_Remove_SubTree | Checks whether a device node and its progeny can be removed. |
CONFIGMG_Reenumerate_DevNode | Causes the enumerator of the specified device node to receive the CONFIG_ENUMERATE enumerator function. |
CONFIGMG_Remove_SubTree | Removes a device node and its children. |
CONFIGMG_Remove_Unmarked_Children | Removes any children of a device node that have the DN_HAS_MARK flag cleared. |
CONFIGMG_Reset_Children_Marks | Resets the DN_HAS_MARK flag in the children of a specified device node. |
CONFIGMG_Setup_DevNode | Reenables and configures a specified device node, or requests the enumerator to download information. |
The device nodes in the hardware tree are arranged hierarchically. This means a device node is either at the root of the hardware tree or is the child of a parent device node. A device node can have child device nodes. The other children of a device node's parent are call siblings.
The hardware tree is built each time the computer is started. Furthermore, it is completely dynamic, changing even while the computer is running if a device is removed or added to the system.