/*CM_Connect_Machine CM_Get_Device_ID_List_Size_Ex CM_Get_Child_Ex CM_Get_Sibling_Ex CM_Get_Parent_Ex CM_Get_DevNode_Registry_Property_Ex CM_Get_Class_Name_Ex CM_Get_DevNode_Status_Ex CM_Get_Device_ID_Ex CM_Request_Device_Eject_Ex CM_Locate_DevNode_Ex*/ InitDevTreeDlgProc DEVINST* DeviceInstance HMACHINE DeviceTree->hMachine DEVINST DeviceTree->DevInst GUID DeviceTreeNode->ClassGuid TCHAR DeviceID[MAX_DEVICE_ID_LEN] PTSTR DeviceInterface // // Get the root devnode. // ConfigRet = CM_Locate_DevNode_Ex(&DeviceTree->DevInst, NULL, CM_LOCATE_DEVNODE_NORMAL, DeviceTree->hMachine (NULL) ); if (ConfigRet != CR_SUCCESS) { ConfigRet = CM_Get_Child_Ex(&DeviceInstance, (Out param) DeviceTree->DevInst, (prev call) 0, DeviceTree->hMachine (NULL) ); if (ConfigRet == CR_SUCCESS) { // for info ConfigRet = CM_Get_DevNode_Registry_Property_Ex(DeviceInstance, (from above) CM_DRP_CLASSGUID, NULL, &Buffer, &Len, 0, DeviceTree->hMachine (NULL) ); if (ConfigRet == CR_SUCCESS) { Out: // GUID_DEVCLASS_COMPUTER {0x4d36e966L, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}}, if (ConfigRet == CR_SUCCESS) { ConfigRet = CM_Get_Class_Name_Ex(&DeviceTreeNode->ClassGuid, Buffer, &Len, 0, DeviceTree->hMachine ); Out: Computer if (ConfigRet == CR_SUCCESS) { // trying to find drive letter x DevNodeToDriveLetter(x x x if (CM_Get_Device_ID_Ex(DevInst, x DeviceID, x sizeof(DeviceID)/sizeof(TCHAR), x 0, x NULL x ) == CR_SUCCESS) { x Out: 0x0006ee8c "ROOT\ACPI_HAL\0000" x x x if (CM_Get_Device_Interface_List_Size(&ulSize, x (LPGUID)&VolumeClassGuid, x DeviceID, x 0) == CR_SUCCESS) && x x Out: FAILS x (ulSize > 1) && x ((DeviceInterface = LocalAlloc(LPTR, ulSize*sizeof(TCHAR))) != NULL) && x (CM_Get_Device_Interface_List((LPGUID)&VolumeClassGuid, x DeviceID, x DeviceInterface, x ulSize, x 0 x ) == CR_SUCCESS) && ConfigRet = CM_Get_DevNode_Registry_Property_Ex(DeviceInstance, CM_DRP_FRIENDLYNAME, NULL, Buffer, &Len, 0, DeviceTree->hMachine ); then, CM_DRP_DEVICEDESC... out: "Advanced Configuration and Power Interface (ACPI) PC" .... BuildLocationInformation: Boring.... // Get InstanceId ConfigRet = CM_Get_Device_ID_ExW(DeviceInstance, Buffer, Len/sizeof(TCHAR), 0, DeviceTree->hMachine ); Out "ROOT\ACPI_HAL\0000" { // should skip BuildDeviceRelationsList ConfigRet = CM_Get_Device_ID_List_Size_Ex(&Len, DeviceId, ("ROOT\ACPI_HAL\0000") FilterFlag, (CM_GETIDLIST_FILTER_EJECTRELATIONS) hMachine (NULL) ); BuildDeviceRelationsList ConfigRet = CM_Get_Device_ID_List_Size_Ex(&Len, DeviceId, ("ROOT\ACPI_HAL\0000") FilterFlag, (CM_GETIDLIST_FILTER_REMOVALRELATIONS) hMachine ); // Both FAILED, if would have succeeded, would have trierd to enum drive letters } // If this devinst has children, then recurse to fill in its child sibling list. ConfigRet = CM_Get_Child_Ex(&ChildDeviceInstance, (out param) DeviceInstance, (same as above) 0, DeviceTree->hMachine (NULL) ); //recurse to redo the same as above for child, then ... // Next sibling ... ConfigRet = CM_Get_Sibling_Ex(&DeviceInstance, (Ouch!) DeviceInstance, 0, DeviceTree->hMachine ); /////////////////////////////////////////////////////////////////////////////// // // Device Instance status flags, returned by call to CM_Get_DevInst_Status // #define DN_ROOT_ENUMERATED (0x00000001) // Was enumerated by ROOT #define DN_DRIVER_LOADED (0x00000002) // Has Register_Device_Driver #define DN_ENUM_LOADED (0x00000004) // Has Register_Enumerator #define DN_STARTED (0x00000008) // Is currently configured #define DN_MANUAL (0x00000010) // Manually installed #define DN_NEED_TO_ENUM (0x00000020) // May need reenumeration #define DN_NOT_FIRST_TIME (0x00000040) // Has received a config #define DN_HARDWARE_ENUM (0x00000080) // Enum generates hardware ID #define DN_LIAR (0x00000100) // Lied about can reconfig once #define DN_HAS_MARK (0x00000200) // Not CM_Create_DevInst lately #define DN_HAS_PROBLEM (0x00000400) // Need device installer #define DN_FILTERED (0x00000800) // Is filtered #define DN_MOVED (0x00001000) // Has been moved #define DN_DISABLEABLE (0x00002000) // Can be rebalanced #define DN_REMOVABLE (0x00004000) // Can be removed #define DN_PRIVATE_PROBLEM (0x00008000) // Has a private problem #define DN_MF_PARENT (0x00010000) // Multi function parent #define DN_MF_CHILD (0x00020000) // Multi function child #define DN_WILL_BE_REMOVED (0x00040000) // DevInst is being removed // Flags for CM_Get_Device_ID_List, CM_Get_Device_ID_List_Size // #define CM_GETIDLIST_FILTER_NONE (0x00000000) #define CM_GETIDLIST_FILTER_ENUMERATOR (0x00000001) #define CM_GETIDLIST_FILTER_SERVICE (0x00000002) #define CM_GETIDLIST_FILTER_EJECTRELATIONS (0x00000004) #define CM_GETIDLIST_FILTER_REMOVALRELATIONS (0x00000008) #define CM_GETIDLIST_FILTER_POWERRELATIONS (0x00000010) #define CM_GETIDLIST_FILTER_BUSRELATIONS (0x00000020) #define CM_GETIDLIST_DONOTGENERATE (0x10000040) #define CM_GETIDLIST_FILTER_BITS (0x1000007F) // // Flags for CM_Get_Device_Interface_List, CM_Get_Device_Interface_List_Size // #define CM_GET_DEVICE_INTERFACE_LIST_PRESENT (0x00000000) // only currently 'live' device interfaces #define CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES (0x00000001) // all registered device interfaces, live or not #define CM_GET_DEVICE_INTERFACE_LIST_BITS (0x00000001)