diff --git a/reactos/include/wine/setupapi.h b/reactos/include/wine/setupapi.h index 2999b7f17a9..ffa28c5ee39 100644 --- a/reactos/include/wine/setupapi.h +++ b/reactos/include/wine/setupapi.h @@ -747,6 +747,7 @@ BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(HDEVINFO, PSP_DEVICE_INTERFACE_ DWORD, PDWORD, PSP_DEVINFO_DATA); #define SetupDiGetDeviceInterfaceDetail WINELIB_NAME_AW(SetupDiGetDeviceInterfaceDetail) BOOL WINAPI SetupDiGetDeviceRegistryPropertyA(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD); +BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD); BOOL WINAPI SetupDiInstallClassA(HWND, PCSTR, DWORD, HSPFILEQ); BOOL WINAPI SetupDiInstallClassW(HWND, PCWSTR, DWORD, HSPFILEQ); #define SetupDiInstallClass WINELIB_NAME_AW(SetupDiInstallClass) diff --git a/reactos/lib/setupapi/devinst.c b/reactos/lib/setupapi/devinst.c index bd80183c4af..ee6a6b40802 100644 --- a/reactos/lib/setupapi/devinst.c +++ b/reactos/lib/setupapi/devinst.c @@ -1180,6 +1180,79 @@ BOOL WINAPI SetupDiGetDeviceRegistryPropertyA( PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize) +{ + BOOL bResult; + BOOL bIsStringProperty; + DWORD RegType; + DWORD RequiredSizeA, RequiredSizeW; + DWORD PropertyBufferSizeW; + PBYTE PropertyBufferW; + + TRACE("%04lx %p %ld %p %p %ld %p\n", (DWORD)devinfo, DeviceInfoData, + Property, PropertyRegDataType, PropertyBuffer, PropertyBufferSize, + RequiredSize); + + PropertyBufferSizeW = PropertyBufferSize * 2; + PropertyBufferW = HeapAlloc(GetProcessHeap(), 0, PropertyBufferSizeW); + + bResult = SetupDiGetDeviceRegistryPropertyW( + devinfo, + DeviceInfoData, + Property, + &RegType, + PropertyBufferW, + PropertyBufferSizeW, + &RequiredSizeW); + + HeapFree(GetProcessHeap(), 0, PropertyBufferW); + + if (!bResult) + return bResult; + + bIsStringProperty = (RegType == REG_SZ || RegType == REG_MULTI_SZ); + + if (bIsStringProperty) + RequiredSizeA = RequiredSizeW / sizeof(WCHAR); + else + RequiredSizeA = RequiredSizeW; + + if (RequiredSizeA <= PropertyBufferSize) + { + if (bIsStringProperty && PropertyBufferSize > 0) + { + if (WideCharToMultiByte(CP_ACP, 0, (LPWSTR)PropertyBufferW, RequiredSizeW / sizeof(WCHAR), PropertyBuffer, PropertyBufferSize, NULL, NULL) == 0) + { + /* Last error is already set by WideCharToMultiByte */ + bResult = FALSE; + } + } + else + memcpy(PropertyBuffer, PropertyBufferW, RequiredSizeA); + } + else + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + bResult = FALSE; + } + + if (PropertyRegDataType) + *PropertyRegDataType = RegType; + if (RequiredSize) + *RequiredSize = RequiredSizeA; + return bResult; +} + +/*********************************************************************** + * SetupDiGetDeviceRegistryPropertyW (SETUPAPI.@) + */ +BOOL WINAPI SetupDiGetDeviceRegistryPropertyW( + HDEVINFO devinfo, + PSP_DEVINFO_DATA DeviceInfoData, + DWORD Property, + PDWORD PropertyRegDataType, + PBYTE PropertyBuffer, + DWORD PropertyBufferSize, + PDWORD RequiredSize) { FIXME("%04lx %p %ld %p %p %ld %p\n", (DWORD)devinfo, DeviceInfoData, Property, PropertyRegDataType, PropertyBuffer, PropertyBufferSize, @@ -1187,6 +1260,7 @@ BOOL WINAPI SetupDiGetDeviceRegistryPropertyA( return FALSE; } + /*********************************************************************** * SetupDiInstallClassA (SETUPAPI.@) */