mirror of
https://github.com/reactos/reactos.git
synced 2024-12-31 19:42:51 +00:00
[DESK] Implement pCDevSettings_GetDeviceInstanceId properly
- CM_Locate_DevNodeW expects a Device Instance ID as second argument, so it cannot be used for converting a Hardware ID. - Use SetupAPI functions here instead, as documented in: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumdisplaydevicesw - Now our desk.cpl passes correct identifier to CPL extensions, such as deskadp and deskmon, so clicking on "Properties" in the advanced display properties now works in Windows XP. - Also fix copypasta in DisplayAdvancedSettings that affected applet built with MSVC - deskadp extension was loaded twice. - Also fix magic flag value for EDD_GET_DEVICE_INTERFACE_NAME.
This commit is contained in:
parent
6dc17389cb
commit
3900cf88b3
3 changed files with 52 additions and 35 deletions
|
@ -122,7 +122,7 @@ DisplayAdvancedSettings(HWND hWndParent, PDISPLAY_DEVICE_ENTRY DisplayDevice)
|
||||||
SHAddFromPropSheetExtArray(hpsxaDev, PropSheetAddPage, (LPARAM)&psh);
|
SHAddFromPropSheetExtArray(hpsxaDev, PropSheetAddPage, (LPARAM)&psh);
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
hpsxaDisp = msvc_SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\Device"), MAX_ADVANCED_PAGES - psh.nPages, pdo);
|
hpsxaDisp = msvc_SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\Display"), MAX_ADVANCED_PAGES - psh.nPages, pdo);
|
||||||
#else
|
#else
|
||||||
hpsxaDisp = SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\Display"), MAX_ADVANCED_PAGES - psh.nPages, pdo);
|
hpsxaDisp = SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\Display"), MAX_ADVANCED_PAGES - psh.nPages, pdo);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -168,47 +168,64 @@ pCDevSettings_GetMonitorDevice(const WCHAR *pszDisplayDevice)
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* Converts a Hardware ID (DeviceID from EnumDisplayDevices)
|
||||||
|
* to an unique Device Instance ID.
|
||||||
|
*
|
||||||
|
* @param[in] pszDevice
|
||||||
|
* A pointer to a null-terminated Unicode string
|
||||||
|
* containing a Hardware ID.
|
||||||
|
* e.g. "PCI\VEN_80EE&DEV_BEEF&SUBSYS_00000000&REV_00"
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* A pointer to a null-terminated Unicode string
|
||||||
|
* containing an unique Device Instance ID
|
||||||
|
* or NULL in case of error.
|
||||||
|
* e.g. "PCI\VEN_80EE&DEV_BEEF&SUBSYS_00000000&REV_00\3&267A616A&0&10"
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* The caller must free the returned string with LocalFree.
|
||||||
|
*/
|
||||||
static PWSTR
|
static PWSTR
|
||||||
pCDevSettings_GetDeviceInstanceId(const WCHAR *pszDevice)
|
pCDevSettings_GetDeviceInstanceId(const WCHAR *pszDevice)
|
||||||
{
|
{
|
||||||
DEVINST DevInst;
|
HDEVINFO DevInfo;
|
||||||
CONFIGRET cr;
|
SP_DEVINFO_DATA InfoData;
|
||||||
ULONG BufLen;
|
ULONG BufLen;
|
||||||
LPWSTR lpDevInstId = NULL;
|
LPWSTR lpDevInstId = NULL;
|
||||||
|
|
||||||
DPRINT1("CDevSettings::GetDeviceInstanceId(%ws) UNIMPLEMENTED!\n", pszDevice);
|
DPRINT("CDevSettings::GetDeviceInstanceId(%ws)!\n", pszDevice);
|
||||||
|
|
||||||
|
DevInfo = SetupDiGetClassDevsW(NULL, pszDevice, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
|
||||||
|
if (DevInfo == INVALID_HANDLE_VALUE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ZeroMemory(&InfoData, sizeof(InfoData));
|
||||||
|
InfoData.cbSize = sizeof(InfoData);
|
||||||
|
|
||||||
|
/* Try to enumerate the first matching device */
|
||||||
|
if (!SetupDiEnumDeviceInfo(DevInfo, 0, &InfoData))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (SetupDiGetDeviceInstanceId(DevInfo, &InfoData, NULL, 0, &BufLen) ||
|
||||||
|
GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
cr = CM_Locate_DevNodeW(&DevInst,
|
|
||||||
(DEVINSTID_W)pszDevice,
|
|
||||||
CM_LOCATE_DEVNODE_NORMAL);
|
|
||||||
if (cr == CR_SUCCESS)
|
|
||||||
{
|
|
||||||
DPRINT1("Success1\n");
|
|
||||||
cr = CM_Get_Device_ID_Size(&BufLen,
|
|
||||||
DevInst,
|
|
||||||
0);
|
|
||||||
if (cr == CR_SUCCESS)
|
|
||||||
{
|
|
||||||
DPRINT1("Success2\n");
|
|
||||||
lpDevInstId = LocalAlloc(LMEM_FIXED,
|
lpDevInstId = LocalAlloc(LMEM_FIXED,
|
||||||
(BufLen + 1) * sizeof(WCHAR));
|
(BufLen + 1) * sizeof(WCHAR));
|
||||||
|
|
||||||
if (lpDevInstId != NULL)
|
if (lpDevInstId == NULL)
|
||||||
{
|
return NULL;
|
||||||
DPRINT1("Success3\n");
|
|
||||||
cr = CM_Get_Device_IDW(DevInst,
|
|
||||||
lpDevInstId,
|
|
||||||
BufLen,
|
|
||||||
0);
|
|
||||||
|
|
||||||
if (cr != CR_SUCCESS)
|
if (!SetupDiGetDeviceInstanceId(DevInfo, &InfoData, lpDevInstId, BufLen, NULL))
|
||||||
{
|
{
|
||||||
LocalFree((HLOCAL)lpDevInstId);
|
LocalFree((HLOCAL)lpDevInstId);
|
||||||
lpDevInstId = NULL;
|
lpDevInstId = NULL;
|
||||||
}
|
}
|
||||||
DPRINT1("instance id: %ws\n", lpDevInstId);
|
else
|
||||||
}
|
{
|
||||||
}
|
DPRINT("instance id: %ws\n", lpDevInstId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return lpDevInstId;
|
return lpDevInstId;
|
||||||
|
|
|
@ -330,7 +330,7 @@ SettingsOnInitDialog(IN HWND hwndDlg)
|
||||||
/* Get video cards list */
|
/* Get video cards list */
|
||||||
pData->DisplayDeviceList = NULL;
|
pData->DisplayDeviceList = NULL;
|
||||||
displayDevice.cb = sizeof(displayDevice);
|
displayDevice.cb = sizeof(displayDevice);
|
||||||
while (EnumDisplayDevices(NULL, iDevNum, &displayDevice, 0x1))
|
while (EnumDisplayDevices(NULL, iDevNum, &displayDevice, EDD_GET_DEVICE_INTERFACE_NAME))
|
||||||
{
|
{
|
||||||
if ((displayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) != 0)
|
if ((displayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) != 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue