display the device manufacturer

svn path=/trunk/; revision=19592
This commit is contained in:
Thomas Bluemel 2005-11-25 23:36:32 +00:00
parent 21c28aacfb
commit eb8e907a1f

View file

@ -49,6 +49,7 @@ typedef struct _HWCLASSDEVINFO
{ {
GUID Guid; GUID Guid;
HDEVINFO hDevInfo; HDEVINFO hDevInfo;
INT ImageIndex;
INT ItemCount; INT ItemCount;
PHWDEVINFO HwDevInfo; PHWDEVINFO HwDevInfo;
} HWCLASSDEVINFO, *PHWCLASSDEVINFO; } HWCLASSDEVINFO, *PHWCLASSDEVINFO;
@ -129,15 +130,164 @@ static VOID
UpdateControlStates(IN PHARDWARE_PAGE_DATA hpd) UpdateControlStates(IN PHARDWARE_PAGE_DATA hpd)
{ {
PHWDEVINFO HwDevInfo; PHWDEVINFO HwDevInfo;
HWND hBtnTroubleShoot, hBtnProperties;
DWORD RegDataType;
hBtnTroubleShoot = GetDlgItem(hpd->hWnd,
IDC_TROUBLESHOOT);
hBtnProperties = GetDlgItem(hpd->hWnd,
IDC_PROPERTIES);
HwDevInfo = (PHWDEVINFO)ListViewGetSelectedItemData(hpd->hWndDevList); HwDevInfo = (PHWDEVINFO)ListViewGetSelectedItemData(hpd->hWndDevList);
if (HwDevInfo != NULL) if (HwDevInfo != NULL)
{ {
/* FIXME - update static controls and enable buttons */ /* update static controls */
WCHAR szBuffer[256];
LPWSTR szFormatted = NULL;
if (!SetupDiGetDeviceRegistryProperty(HwDevInfo->ClassDevInfo->hDevInfo,
&HwDevInfo->DevInfoData,
SPDRP_MFG,
&RegDataType,
(PBYTE)szBuffer,
sizeof(szBuffer),
NULL) ||
RegDataType != REG_SZ)
{
/* FIXME - check string for NULL termination! */
szBuffer[0] = L'\0';
}
if (LoadAndFormatString(hDllInstance,
IDS_MANUFACTURER,
&szFormatted,
szBuffer) != 0)
{
SetDlgItemText(hpd->hWnd,
IDC_MANUFACTURER,
szFormatted);
LocalFree((HLOCAL)szFormatted);
}
/* FIXME - Display location and status */
} }
else else
{ {
/* FIXME - clear static controls and disable buttons */ /* clear static controls */
SetDlgItemText(hpd->hWnd,
IDC_MANUFACTURER,
NULL);
SetDlgItemText(hpd->hWnd,
IDC_LOCATION,
NULL);
SetDlgItemText(hpd->hWnd,
IDC_STATUS,
NULL);
}
EnableWindow(hBtnTroubleShoot,
HwDevInfo != NULL);
EnableWindow(hBtnTroubleShoot,
hBtnProperties != NULL);
}
static VOID
FreeDevicesList(IN PHARDWARE_PAGE_DATA hpd)
{
PHWCLASSDEVINFO ClassDevInfo, LastClassDevInfo;
ClassDevInfo = hpd->ClassDevInfo;
LastClassDevInfo = ClassDevInfo + hpd->NumberOfGuids;
/* free the device info set handles */
while (ClassDevInfo != LastClassDevInfo)
{
if (ClassDevInfo->hDevInfo != INVALID_HANDLE_VALUE)
{
SetupDiDestroyDeviceInfoList(ClassDevInfo->hDevInfo);
}
ClassDevInfo->hDevInfo = NULL;
ClassDevInfo->ItemCount = 0;
ClassDevInfo->ImageIndex = 0;
if (ClassDevInfo->HwDevInfo != NULL)
{
HeapFree(GetProcessHeap(),
0,
ClassDevInfo->HwDevInfo);
ClassDevInfo->HwDevInfo = NULL;
}
ClassDevInfo++;
}
}
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;
ClassDevInfo->hDevInfo = SetupDiGetClassDevs(&ClassDevInfo->Guid,
NULL,
hpd->hWnd,
DIGCF_PRESENT);
if (ClassDevInfo->hDevInfo != INVALID_HANDLE_VALUE)
{
DWORD MemberIndex = 0;
SetupDiGetClassImageIndex(&hpd->ClassImageListData,
&ClassDevInfo->Guid,
&ClassDevInfo->ImageIndex);
while (SetupDiEnumDeviceInfo(ClassDevInfo->hDevInfo,
MemberIndex++,
&DevInfoData))
{
if (ClassDevInfo->HwDevInfo != NULL)
{
PHWDEVINFO HwNewDevInfo = HeapReAlloc(GetProcessHeap(),
0,
ClassDevInfo->HwDevInfo,
(ClassDevInfo->ItemCount + 1) *
sizeof(HWDEVINFO));
if (HwNewDevInfo != NULL)
{
ClassDevInfo->HwDevInfo = HwNewDevInfo;
}
else
{
DPRINT1("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)
{
DPRINT1("Unable to allocate memory for a SP_DEVINFO_DATA structures!\n");
break;
}
}
ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount].ClassDevInfo = ClassDevInfo;
ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount++].DevInfoData = DevInfoData;
}
}
ClassDevInfo++;
} }
} }
@ -145,82 +295,38 @@ UpdateControlStates(IN PHARDWARE_PAGE_DATA hpd)
static VOID static VOID
FillDevicesList(IN PHARDWARE_PAGE_DATA hpd) FillDevicesList(IN PHARDWARE_PAGE_DATA hpd)
{ {
PHWCLASSDEVINFO DevInfo, LastDevInfo; PHWCLASSDEVINFO ClassDevInfo, LastClassDevInfo;
SP_DEVINFO_DATA DevInfoData; PHWDEVINFO HwDevInfo, LastHwDevInfo;
WCHAR szBuffer[255]; WCHAR szBuffer[255];
INT ItemCount = 0; INT ItemCount = 0;
DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); BuildDevicesList(hpd);
DevInfo = hpd->ClassDevInfo; ClassDevInfo = hpd->ClassDevInfo;
LastDevInfo = DevInfo + hpd->NumberOfGuids; LastClassDevInfo = ClassDevInfo + hpd->NumberOfGuids;
while (DevInfo != LastDevInfo) while (ClassDevInfo != LastClassDevInfo)
{ {
INT ImageIndex = -1; if (ClassDevInfo->HwDevInfo != NULL)
DevInfo->hDevInfo = SetupDiGetClassDevs(&DevInfo->Guid,
NULL,
hpd->hWnd,
DIGCF_PRESENT);
if (DevInfo->hDevInfo != INVALID_HANDLE_VALUE)
{ {
LVITEM li; HwDevInfo = ClassDevInfo->HwDevInfo;
DWORD MemberIndex = 0; LastHwDevInfo = HwDevInfo + ClassDevInfo->ItemCount;
SetupDiGetClassImageIndex(&hpd->ClassImageListData, while (HwDevInfo != LastHwDevInfo)
&DevInfo->Guid,
&ImageIndex);
while (SetupDiEnumDeviceInfo(DevInfo->hDevInfo,
MemberIndex++,
&DevInfoData))
{ {
DWORD RegDataType; DWORD RegDataType;
INT iItem; INT iItem;
LVITEM li;
if (DevInfo->HwDevInfo != NULL) if ((SetupDiGetDeviceRegistryProperty(ClassDevInfo->hDevInfo,
{ &HwDevInfo->DevInfoData,
PHWDEVINFO HwNewDevInfo = HeapReAlloc(GetProcessHeap(),
0,
DevInfo->HwDevInfo,
(DevInfo->ItemCount + 1) *
sizeof(HWDEVINFO));
if (HwNewDevInfo != NULL)
{
DevInfo->HwDevInfo = HwNewDevInfo;
}
else
{
DPRINT1("Unable to allocate memory for %d SP_DEVINFO_DATA structures!\n",
DevInfo->ItemCount + 1);
break;
}
}
else
{
DevInfo->HwDevInfo = HeapAlloc(GetProcessHeap(),
0,
sizeof(HWDEVINFO));
if (DevInfo->HwDevInfo == NULL)
{
DPRINT1("Unable to allocate memory for a SP_DEVINFO_DATA structures!\n");
break;
}
}
DevInfo->HwDevInfo[DevInfo->ItemCount].ClassDevInfo = DevInfo;
DevInfo->HwDevInfo[DevInfo->ItemCount++].DevInfoData = DevInfoData;
if ((SetupDiGetDeviceRegistryProperty(DevInfo->hDevInfo,
&DevInfoData,
SPDRP_FRIENDLYNAME, SPDRP_FRIENDLYNAME,
&RegDataType, &RegDataType,
(PBYTE)szBuffer, (PBYTE)szBuffer,
sizeof(szBuffer), sizeof(szBuffer),
NULL) || NULL) ||
SetupDiGetDeviceRegistryProperty(DevInfo->hDevInfo, SetupDiGetDeviceRegistryProperty(ClassDevInfo->hDevInfo,
&DevInfoData, &HwDevInfo->DevInfoData,
SPDRP_DEVICEDESC, SPDRP_DEVICEDESC,
&RegDataType, &RegDataType,
(PBYTE)szBuffer, (PBYTE)szBuffer,
@ -236,8 +342,8 @@ FillDevicesList(IN PHARDWARE_PAGE_DATA hpd)
li.state = (ItemCount == 0 ? LVIS_SELECTED : 0); li.state = (ItemCount == 0 ? LVIS_SELECTED : 0);
li.stateMask = LVIS_SELECTED; li.stateMask = LVIS_SELECTED;
li.pszText = szBuffer; li.pszText = szBuffer;
li.iImage = ImageIndex; li.iImage = ClassDevInfo->ImageIndex;
li.lParam = (LPARAM)&DevInfo->HwDevInfo[DevInfo->ItemCount - 1]; li.lParam = (LPARAM)HwDevInfo;
iItem = ListView_InsertItem(hpd->hWndDevList, iItem = ListView_InsertItem(hpd->hWndDevList,
&li); &li);
@ -245,7 +351,7 @@ FillDevicesList(IN PHARDWARE_PAGE_DATA hpd)
{ {
ItemCount++; ItemCount++;
if (SetupDiGetClassDescription(&DevInfo->Guid, if (SetupDiGetClassDescription(&ClassDevInfo->Guid,
szBuffer, szBuffer,
sizeof(szBuffer) / sizeof(szBuffer[0]), sizeof(szBuffer) / sizeof(szBuffer[0]),
NULL)) NULL))
@ -259,10 +365,12 @@ FillDevicesList(IN PHARDWARE_PAGE_DATA hpd)
} }
} }
} }
HwDevInfo++;
} }
} }
DevInfo++; ClassDevInfo++;
} }
/* update the controls */ /* update the controls */
@ -509,8 +617,6 @@ EnableTroubleShoot(PHARDWARE_PAGE_DATA hpd,
HWND hBtnTroubleShoot = GetDlgItem(hpd->hWnd, HWND hBtnTroubleShoot = GetDlgItem(hpd->hWnd,
IDC_TROUBLESHOOT); IDC_TROUBLESHOOT);
EnableWindow(hBtnTroubleShoot,
Enable);
ShowWindow(hBtnTroubleShoot, ShowWindow(hBtnTroubleShoot,
Enable ? SW_SHOW : SW_HIDE); Enable ? SW_SHOW : SW_HIDE);
} }
@ -650,21 +756,8 @@ HardwareDlgProc(IN HWND hwndDlg,
case WM_DESTROY: case WM_DESTROY:
{ {
UINT i; /* free devices list */
FreeDevicesList(hpd);
/* free the device info set handles */
for (i = 0;
i < hpd->NumberOfGuids;
i++)
{
SetupDiDestroyDeviceInfoList(hpd->ClassDevInfo[i].hDevInfo);
if (hpd->ClassDevInfo[i].HwDevInfo != NULL)
{
HeapFree(GetProcessHeap(),
0,
hpd->ClassDevInfo[i].HwDevInfo);
}
}
/* restore the old window proc of the subclassed parent window */ /* restore the old window proc of the subclassed parent window */
if (hpd->hWndParent != NULL && hpd->ParentOldWndProc != NULL) if (hpd->hWndParent != NULL && hpd->ParentOldWndProc != NULL)