Implement SetupDiGetDeviceRegistryPropertyA Add stub for SetupDiGetDeviceRegistryPropertyW Modified: trunk/reactos/include/wine/setupapi.h Modified: trunk/reactos/lib/setupapi/devinst.c _____
Modified: trunk/reactos/include/wine/setupapi.h --- trunk/reactos/include/wine/setupapi.h 2005-07-03 20:12:16 UTC (rev 16397) +++ trunk/reactos/include/wine/setupapi.h 2005-07-03 20:19:55 UTC (rev 16398) @@ -747,6 +747,7 @@
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) _____
Modified: trunk/reactos/lib/setupapi/devinst.c --- trunk/reactos/lib/setupapi/devinst.c 2005-07-03 20:12:16 UTC (rev 16397) +++ trunk/reactos/lib/setupapi/devinst.c 2005-07-03 20:19:55 UTC (rev 16398) @@ -1181,12 +1181,86 @@
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, RequiredSize); return FALSE; }
+
/*********************************************************************** * SetupDiInstallClassA (SETUPAPI.@) */