HTREEITEM InitTreeView(HWND hTreeView) { HTREEITEM hRoot; TCHAR ComputerName[MAX_PATH]; DWORD dwSize = MAX_PATH; INT RootImage; (void)TreeView_DeleteAllItems(hTreeView); /* Get the device image list */ ImageListData.cbSize = sizeof(ImageListData); SetupDiGetClassImageList(&ImageListData); (void)TreeView_SetImageList(hTreeView, ImageListData.ImageList, TVSIL_NORMAL); if (!GetComputerName(ComputerName, &dwSize)) { ComputerName[0] = _T('\0'); } /* Get the image index of the computer class */ SetupDiGetClassImageIndex(&ImageListData, &GUID_DEVCLASS_COMPUTER, &RootImage); /* Insert the root item into the tree */ hRoot = InsertIntoTreeView(hTreeView, NULL, ComputerName, NULL, RootImage, 0); return hRoot; }
static VOID BuildDevicesList(IN PHARDWARE_PAGE_DATA hpd) { PHWCLASSDEVINFO ClassDevInfo, LastClassDevInfo; SP_DEVINFO_DATA DevInfoData; DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); ClassDevInfo = hpd->ClassDevInfo; LastClassDevInfo = ClassDevInfo + hpd->NumberOfGuids; while (ClassDevInfo != LastClassDevInfo) { ClassDevInfo->ImageIndex = -1; /* open a class device handle for the GUID we're processing */ ClassDevInfo->hDevInfo = SetupDiGetClassDevs(&ClassDevInfo->Guid, NULL, hpd->hWnd, DIGCF_PRESENT | DIGCF_PROFILE); if (ClassDevInfo->hDevInfo != INVALID_HANDLE_VALUE) { DWORD MemberIndex = 0; SetupDiGetClassImageIndex(&hpd->ClassImageListData, &ClassDevInfo->Guid, &ClassDevInfo->ImageIndex); /* enumerate all devices in the class */ while (SetupDiEnumDeviceInfo(ClassDevInfo->hDevInfo, MemberIndex++, &DevInfoData)) { BOOL HideDevice = FALSE; if (ClassDevInfo->HwDevInfo != NULL) { PHWDEVINFO HwNewDevInfo = HeapReAlloc(GetProcessHeap(), 0, ClassDevInfo->HwDevInfo, (ClassDevInfo->ItemCount + 1) * sizeof(HWDEVINFO)); if (HwNewDevInfo != NULL) { ClassDevInfo->HwDevInfo = HwNewDevInfo; } else { ERR("Unable to allocate memory for %d SP_DEVINFO_DATA structures!\n", ClassDevInfo->ItemCount + 1); break; } } else { ClassDevInfo->HwDevInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(HWDEVINFO)); if (ClassDevInfo->HwDevInfo == NULL) { ERR("Unable to allocate memory for a SP_DEVINFO_DATA structures!\n"); break; } } /* Find out if the device should be hidden by default */ IsDeviceHidden(DevInfoData.DevInst, NULL, &HideDevice); /* save all information for the current device */ ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount].ClassDevInfo = ClassDevInfo; ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount].DevInfoData = DevInfoData; ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount++].HideDevice = HideDevice; } } ClassDevInfo++; } }
static HTREEITEM AddDeviceToTree(HWND hTreeView, HTREEITEM hRoot, DEVINST dnDevInst, BOOL bShowHidden) { TCHAR DevName[MAX_DEV_LEN]; TCHAR FriendlyName[MAX_DEV_LEN]; TCHAR ClassGuidString[MAX_GUID_STRING_LEN]; GUID ClassGuid; ULONG ulLength; LPTSTR DeviceID = NULL; INT ClassImage = 24; CONFIGRET cr; ulLength = MAX_GUID_STRING_LEN * sizeof(TCHAR); cr = CM_Get_DevNode_Registry_Property(dnDevInst, CM_DRP_CLASSGUID, NULL, ClassGuidString, &ulLength, 0); if (cr == CR_SUCCESS) { pSetupGuidFromString(ClassGuidString, &ClassGuid); if (bShowHidden == FALSE && (IsEqualGUID(&ClassGuid, &GUID_DEVCLASS_LEGACYDRIVER) || IsEqualGUID(&ClassGuid, &GUID_DEVCLASS_VOLUME))) return NULL; } else { /* It's a device with no driver */ ClassGuid = GUID_DEVCLASS_UNKNOWN; } cr = CM_Get_Device_ID(dnDevInst, DevName, MAX_DEV_LEN, 0); if (cr != CR_SUCCESS) return NULL; ulLength = MAX_DEV_LEN * sizeof(TCHAR); cr = CM_Get_DevNode_Registry_Property(dnDevInst, CM_DRP_FRIENDLYNAME, NULL, FriendlyName, &ulLength, 0); if (cr != CR_SUCCESS) { ulLength = MAX_DEV_LEN * sizeof(TCHAR); cr = CM_Get_DevNode_Registry_Property(dnDevInst, CM_DRP_DEVICEDESC, NULL, FriendlyName, &ulLength, 0); if (cr != CR_SUCCESS) return NULL; } if (!SetupDiGetClassImageIndex(&ImageListData, &ClassGuid, &ClassImage)) { /* FIXME: can we do this? * Set the blank icon: IDI_SETUPAPI_BLANK = 41 * it'll be image 24 in the imagelist */ ClassImage = 24; } if (DevName != NULL) { DeviceID = HeapAlloc(GetProcessHeap(), 0, (lstrlen(DevName) + 1) * sizeof(TCHAR)); if (DeviceID == NULL) { return NULL; } lstrcpy(DeviceID, DevName); } return InsertIntoTreeView(hTreeView, hRoot, FriendlyName, DeviceID, ClassImage, 0); }
static VOID EnumDeviceClasses( HWND hTreeView, HTREEITEM hRoot, PDEVCLASS_ENTRY pClassArray, ULONG ClassCount) { WCHAR ClassName[MAX_DEV_LEN]; WCHAR ClassDesc[MAX_DEV_LEN]; PDEVCLASS_ENTRY pClass; ULONG ClassIndex; DWORD dwSize; LONG lSize; HKEY hKey; CONFIGRET cr; for (ClassIndex = 0; ClassIndex < ClassCount; ClassIndex++) { pClass = &pClassArray[ClassIndex]; cr = CM_Enumerate_Classes(ClassIndex, &pClass->ClassGuid, 0); if (cr == CR_NO_SUCH_VALUE) return; dwSize = MAX_CLASS_NAME_LEN; if (!SetupDiClassNameFromGuid(&pClass->ClassGuid, ClassName, dwSize, &dwSize)) { ClassName[0] = _T('\0'); } if (!SetupDiGetClassImageIndex(&ImageListData, &pClass->ClassGuid, &pClass->ClassImage)) { /* FIXME: can we do this? * Set the blank icon: IDI_SETUPAPI_BLANK = 41 * it'll be image 24 in the imagelist */ pClass->ClassImage = 24; } hKey = SetupDiOpenClassRegKeyEx(&pClass->ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER, NULL, 0); if (hKey != INVALID_HANDLE_VALUE) { lSize = MAX_DEV_LEN; if (RegQueryValue(hKey, NULL, ClassDesc, &lSize) != ERROR_SUCCESS) { ClassDesc[0] = _T('\0'); } RegCloseKey(hKey); } pClass->hItem = InsertIntoTreeView(hTreeView, hRoot, (ClassDesc[0] != _T('\0')) ? ClassDesc : ClassName, NULL, pClass->ClassImage, 0); } }
static INT EnumDeviceClasses(INT ClassIndex, LPWSTR DevClassName, LPWSTR DevClassDesc, BOOL *DevPresent, INT *ClassImage) { GUID ClassGuid; HKEY KeyClass; WCHAR ClassName[MAX_STR_SIZE]; DWORD RequiredSize = MAX_STR_SIZE; UINT Ret; *DevPresent = FALSE; *DevClassName = L'\0'; Ret = CM_Enumerate_Classes(ClassIndex, &ClassGuid, 0); if (Ret != CR_SUCCESS) { /* All classes enumerated */ if(Ret == CR_NO_SUCH_VALUE) { hDevInfoTypes = NULL; return -1; } if (Ret == CR_INVALID_DATA) { ; /* FIXME: What should we do here? */ } /* Handle other errors... */ } if (SetupDiClassNameFromGuid(&ClassGuid, ClassName, RequiredSize, &RequiredSize)) { lstrcpy(DevClassName, ClassName); } if (!SetupDiGetClassImageIndex(&ImageListData, &ClassGuid, ClassImage)) { /* FIXME: Can we do this? * Set the blank icon: IDI_SETUPAPI_BLANK = 41 * It'll be image 24 in the imagelist */ *ClassImage = 24; } /* Get device info for all devices of a particular class */ hDevInfoTypes = SetupDiGetClassDevs(&ClassGuid, NULL, NULL, DIGCF_PRESENT); if (hDevInfoTypes == INVALID_HANDLE_VALUE) { hDevInfoTypes = NULL; return 0; } KeyClass = SetupDiOpenClassRegKeyEx(&ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER, NULL, 0); if (KeyClass != INVALID_HANDLE_VALUE) { LONG dwSize = MAX_STR_SIZE; if (RegQueryValue(KeyClass, NULL, DevClassDesc, &dwSize) != ERROR_SUCCESS) { *DevClassDesc = L'\0'; } } else { return -3; } *DevPresent = TRUE; RegCloseKey(KeyClass); return 0; }
static VOID InitProbeListPage(HWND hwndDlg) { LV_COLUMN Column; LV_ITEM Item; WCHAR szBuffer[MAX_STR_SIZE], szGuid[MAX_STR_SIZE], szTrimGuid[MAX_STR_SIZE], szStatusText[MAX_STR_SIZE]; HWND hList = GetDlgItem(hwndDlg, IDC_PROBELIST); PWSTR pstrStatusText; HDEVINFO hDevInfo; SP_DEVINFO_DATA DevInfoData; ULONG ulStatus, ulProblemNumber; GUID ClassGuid; RECT Rect; DWORD Index; if (!hList) return; ZeroMemory(&Column, sizeof(LV_COLUMN)); GetClientRect(hList, &Rect); Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; Column.fmt = LVCFMT_LEFT; Column.iSubItem = 0; Column.pszText = NULL; Column.cx = Rect.right - GetSystemMetrics(SM_CXVSCROLL); (VOID) ListView_InsertColumn(hList, 0, &Column); ZeroMemory(&Item, sizeof(LV_ITEM)); LoadString(hApplet, IDS_ADDNEWDEVICE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)); Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; Item.pszText = (LPWSTR) szBuffer; Item.iItem = (INT) ListView_GetItemCount(hList); Item.iImage = -1; (VOID) ListView_InsertItem(hList, &Item); hDevInfo = SetupDiGetClassDevsEx(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT, NULL, NULL, 0); if (hDevInfo == INVALID_HANDLE_VALUE) return; /* Get the device image List */ ImageListData.cbSize = sizeof(ImageListData); SetupDiGetClassImageList(&ImageListData); DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (Index = 0; TRUE; Index++) { szBuffer[0] = L'\0'; if (!SetupDiEnumDeviceInfo(hDevInfo, Index, &DevInfoData)) break; if (CM_Get_DevNode_Status_Ex(&ulStatus, &ulProblemNumber, DevInfoData.DevInst, 0, NULL) == CR_SUCCESS) { if (ulStatus & DN_NO_SHOW_IN_DM) continue; } /* Get the device's friendly name */ if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DevInfoData, SPDRP_FRIENDLYNAME, 0, (BYTE*)szBuffer, MAX_STR_SIZE, NULL)) { /* If the friendly name fails, try the description instead */ SetupDiGetDeviceRegistryProperty(hDevInfo, &DevInfoData, SPDRP_DEVICEDESC, 0, (BYTE*)szBuffer, MAX_STR_SIZE, NULL); } SetupDiGetDeviceRegistryProperty(hDevInfo, &DevInfoData, SPDRP_CLASSGUID, 0, (BYTE*)szGuid, MAX_STR_SIZE, NULL); TrimGuidString(szGuid, szTrimGuid); UuidFromStringW(szTrimGuid, &ClassGuid); SetupDiGetClassImageIndex(&ImageListData, &ClassGuid, &Item.iImage); DeviceProblemTextW(NULL, DevInfoData.DevInst, ulProblemNumber, szStatusText, sizeof(szStatusText) / sizeof(WCHAR)); pstrStatusText = (PWSTR)HeapAlloc(hProcessHeap, 0, sizeof(szStatusText)); lstrcpy(pstrStatusText, szStatusText); if (szBuffer[0] != L'\0') { /* Set device name */ Item.pszText = (LPWSTR) szBuffer; Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; Item.lParam = (LPARAM) pstrStatusText; Item.iItem = (INT) ListView_GetItemCount(hList); (VOID) ListView_InsertItem(hList, &Item); } DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); } (VOID) ListView_SetImageList(hList, ImageListData.ImageList, LVSIL_SMALL); (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT); SetupDiDestroyDeviceInfoList(hDevInfo); }
bool CClassNode::SetupNode() { DWORD RequiredSize, Type, Size; DWORD Success; HKEY hKey; // Open the registry key for this class hKey = SetupDiOpenClassRegKeyExW(&m_ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER, NULL, 0); if (hKey != INVALID_HANDLE_VALUE) { Size = DISPLAY_NAME_LEN; Type = REG_SZ; // Lookup the class description (win7+) Success = RegQueryValueExW(hKey, L"ClassDesc", NULL, &Type, (LPBYTE)m_DisplayName, &Size); if (Success == ERROR_SUCCESS) { // Check if the string starts with an @ if (m_DisplayName[0] == L'@') { // The description is located in a module resource Success = ConvertResourceDescriptorToString(m_DisplayName, DISPLAY_NAME_LEN); } } else if (Success == ERROR_FILE_NOT_FOUND) { // WinXP stores the description in the default value Success = RegQueryValueExW(hKey, NULL, NULL, &Type, (LPBYTE)m_DisplayName, &Size); } // Close the registry key RegCloseKey(hKey); } else { Success = GetLastError(); } // Check if we failed to get the class description if (Success != ERROR_SUCCESS) { // Use the class name as the description RequiredSize = DISPLAY_NAME_LEN; (VOID)SetupDiClassNameFromGuidW(&m_ClassGuid, m_DisplayName, RequiredSize, &RequiredSize); } // Get the image index for this class (VOID)SetupDiGetClassImageIndex(m_ImageListData, &m_ClassGuid, &m_ClassImage); return true; }