diff --git a/reactos/dll/win32/devmgr/advprop.c b/reactos/dll/win32/devmgr/advprop.c index eadd5218269..f3f69553306 100644 --- a/reactos/dll/win32/devmgr/advprop.c +++ b/reactos/dll/win32/devmgr/advprop.c @@ -1405,7 +1405,8 @@ GetParentNode: } /* set the device location edit control text */ - if (GetDeviceLocationString(DeviceInfoData->DevInst, + if (GetDeviceLocationString(DeviceInfoSet, + DeviceInfoData, dap->ParentDevInst, dap->szTemp, sizeof(dap->szTemp) / sizeof(dap->szTemp[0]))) diff --git a/reactos/dll/win32/devmgr/hwpage.c b/reactos/dll/win32/devmgr/hwpage.c index 190c22048ac..0b26bd67866 100644 --- a/reactos/dll/win32/devmgr/hwpage.c +++ b/reactos/dll/win32/devmgr/hwpage.c @@ -181,7 +181,8 @@ UpdateControlStates(IN PHARDWARE_PAGE_DATA hpd) } /* get the location string */ - if (GetDeviceLocationString(HwDevInfo->DevInfoData.DevInst, + if (GetDeviceLocationString(HwDevInfo->ClassDevInfo->hDevInfo, + &HwDevInfo->DevInfoData, 0, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])) && diff --git a/reactos/dll/win32/devmgr/misc.c b/reactos/dll/win32/devmgr/misc.c index f6549c70188..4e8c2330a3b 100644 --- a/reactos/dll/win32/devmgr/misc.c +++ b/reactos/dll/win32/devmgr/misc.c @@ -317,7 +317,8 @@ GetDeviceManufacturerString(IN HDEVINFO DeviceInfoSet, BOOL -GetDeviceLocationString(IN DEVINST dnDevInst OPTIONAL, +GetDeviceLocationString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, IN DEVINST dnParentDevInst OPTIONAL, OUT LPWSTR szBuffer, IN DWORD BufferSize) @@ -326,68 +327,104 @@ GetDeviceLocationString(IN DEVINST dnDevInst OPTIONAL, ULONG DataSize; CONFIGRET cRet; LPWSTR szFormatted; + HKEY hKey; + DWORD dwSize, dwType; BOOL Ret = FALSE; DataSize = BufferSize * sizeof(WCHAR); szBuffer[0] = L'\0'; - if (dnParentDevInst != 0) + + hKey = SetupDiOpenDevRegKey(DeviceInfoSet, + DeviceInfoData, + DICS_FLAG_GLOBAL, + 0, + DIREG_DRV, + KEY_QUERY_VALUE); + if (hKey != INVALID_HANDLE_VALUE) { - /* query the parent node name */ - if (CM_Get_DevNode_Registry_Property(dnParentDevInst, - CM_DRP_DEVICEDESC, - &RegDataType, - szBuffer, - &DataSize, - 0) == CR_SUCCESS && - RegDataType == REG_SZ && - LoadAndFormatString(hDllInstance, - IDS_DEVONPARENT, - &szFormatted, - szBuffer) != 0) + /* query the LocationInformationOverride value */ + dwSize = BufferSize; + if (RegQueryValueEx(hKey, + L"LocationInformationOverride", + NULL, + &dwType, + (LPBYTE)szBuffer, + &dwSize) == ERROR_SUCCESS && + dwType == REG_SZ && + szBuffer[0] != L'\0') { - wcsncpy(szBuffer, - szFormatted, - BufferSize - 1); - szBuffer[BufferSize - 1] = L'\0'; - LocalFree((HLOCAL)szFormatted); Ret = TRUE; } - } - else if (dnDevInst != 0) - { - cRet = CM_Get_DevNode_Registry_Property(dnDevInst, - CM_DRP_LOCATION_INFORMATION, - &RegDataType, - szBuffer, - &DataSize, - 0); - if (cRet == CR_SUCCESS && RegDataType == REG_SZ) + else { - /* FIXME - check string for NULL termination! */ - Ret = TRUE; + szBuffer[0] = L'\0'; } - if (Ret && szBuffer[0] >= L'0' && szBuffer[0] <= L'9') + RegCloseKey(hKey); + } + + + if (!Ret) + { + if (dnParentDevInst != 0) { - /* convert the string to an integer value and create a - formatted string */ - ULONG ulLocation = (ULONG)wcstoul(szBuffer, - NULL, - 10); - if (LoadAndFormatString(hDllInstance, - IDS_LOCATIONSTR, - &szFormatted, - ulLocation, - szBuffer) != 0) + /* query the parent node name */ + if (CM_Get_DevNode_Registry_Property(dnParentDevInst, + CM_DRP_DEVICEDESC, + &RegDataType, + szBuffer, + &DataSize, + 0) == CR_SUCCESS && + RegDataType == REG_SZ && + LoadAndFormatString(hDllInstance, + IDS_DEVONPARENT, + &szFormatted, + szBuffer) != 0) { wcsncpy(szBuffer, szFormatted, BufferSize - 1); szBuffer[BufferSize - 1] = L'\0'; LocalFree((HLOCAL)szFormatted); + Ret = TRUE; + } + } + else if (DeviceInfoData->DevInst != 0) + { + cRet = CM_Get_DevNode_Registry_Property(DeviceInfoData->DevInst, + CM_DRP_LOCATION_INFORMATION, + &RegDataType, + szBuffer, + &DataSize, + 0); + if (cRet == CR_SUCCESS && RegDataType == REG_SZ) + { + /* FIXME - check string for NULL termination! */ + Ret = TRUE; + } + + if (Ret && szBuffer[0] >= L'0' && szBuffer[0] <= L'9') + { + /* convert the string to an integer value and create a + formatted string */ + ULONG ulLocation = (ULONG)wcstoul(szBuffer, + NULL, + 10); + if (LoadAndFormatString(hDllInstance, + IDS_LOCATIONSTR, + &szFormatted, + ulLocation, + szBuffer) != 0) + { + wcsncpy(szBuffer, + szFormatted, + BufferSize - 1); + szBuffer[BufferSize - 1] = L'\0'; + LocalFree((HLOCAL)szFormatted); + } + else + Ret = FALSE; } - else - Ret = FALSE; } } diff --git a/reactos/dll/win32/devmgr/precomp.h b/reactos/dll/win32/devmgr/precomp.h index 30111113a3b..1094d57eea8 100644 --- a/reactos/dll/win32/devmgr/precomp.h +++ b/reactos/dll/win32/devmgr/precomp.h @@ -70,7 +70,8 @@ GetDeviceManufacturerString(IN HDEVINFO DeviceInfoSet, IN DWORD BufferSize); BOOL -GetDeviceLocationString(IN DEVINST dnDevInst OPTIONAL, +GetDeviceLocationString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, IN DEVINST dnParentDevInst OPTIONAL, OUT LPWSTR szBuffer, IN DWORD BufferSize); diff --git a/reactos/media/inf/msmouse.inf b/reactos/media/inf/msmouse.inf index 94f5e15ffb1..a1beeac90c7 100644 Binary files a/reactos/media/inf/msmouse.inf and b/reactos/media/inf/msmouse.inf differ