mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 22:52:54 +00:00
display the device manufacturer
svn path=/trunk/; revision=19592
This commit is contained in:
parent
21c28aacfb
commit
eb8e907a1f
1 changed files with 175 additions and 82 deletions
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue