X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fdll%2Fwin32%2Fsetupapi%2Fdevinst.c;h=8be838bd7a161238bc2e7e8b80ad2f1eaf63c279;hp=15fab4e3e3a51d28a2771cfc1f312bc23579d2c4;hb=ed2b9d396c0753b76aab081729736626520016b2;hpb=12f4770a33a66300fb8be5e2cdb7d71e96e92150 diff --git a/reactos/dll/win32/setupapi/devinst.c b/reactos/dll/win32/setupapi/devinst.c index 15fab4e3e3a..8be838bd7a1 100644 --- a/reactos/dll/win32/setupapi/devinst.c +++ b/reactos/dll/win32/setupapi/devinst.c @@ -93,7 +93,7 @@ PropertyChangeHandler( IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL, IN DWORD ClassInstallParamsSize); -static UPDATE_CLASS_PARAM_HANDLER UpdateClassInstallParamHandlers[] = { +static const UPDATE_CLASS_PARAM_HANDLER UpdateClassInstallParamHandlers[] = { NULL, /* DIF_SELECTDEVICE */ NULL, /* DIF_INSTALLDEVICE */ NULL, /* DIF_ASSIGNRESOURCES */ @@ -141,11 +141,12 @@ static UPDATE_CLASS_PARAM_HANDLER UpdateClassInstallParamHandlers[] = { /*********************************************************************** * SetupDiBuildClassInfoList (SETUPAPI.@) */ -BOOL WINAPI SetupDiBuildClassInfoList( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) +BOOL WINAPI +SetupDiBuildClassInfoList( + IN DWORD Flags, + OUT LPGUID ClassGuidList OPTIONAL, + IN DWORD ClassGuidListSize, + OUT PDWORD RequiredSize) { TRACE("\n"); return SetupDiBuildClassInfoListExW(Flags, ClassGuidList, @@ -156,13 +157,14 @@ BOOL WINAPI SetupDiBuildClassInfoList( /*********************************************************************** * SetupDiBuildClassInfoListExA (SETUPAPI.@) */ -BOOL WINAPI SetupDiBuildClassInfoListExA( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCSTR MachineName, - PVOID Reserved) +BOOL WINAPI +SetupDiBuildClassInfoListExA( + IN DWORD Flags, + OUT LPGUID ClassGuidList OPTIONAL, + IN DWORD ClassGuidListSize, + OUT PDWORD RequiredSize, + IN PCSTR MachineName OPTIONAL, + IN PVOID Reserved) { LPWSTR MachineNameW = NULL; BOOL bResult; @@ -188,27 +190,29 @@ BOOL WINAPI SetupDiBuildClassInfoListExA( /*********************************************************************** * SetupDiBuildClassInfoListExW (SETUPAPI.@) */ -BOOL WINAPI SetupDiBuildClassInfoListExW( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCWSTR MachineName, - PVOID Reserved) +BOOL WINAPI +SetupDiBuildClassInfoListExW( + IN DWORD Flags, + OUT LPGUID ClassGuidList OPTIONAL, + IN DWORD ClassGuidListSize, + OUT PDWORD RequiredSize, + IN PCWSTR MachineName OPTIONAL, + IN PVOID Reserved) { WCHAR szKeyName[MAX_GUID_STRING_LEN + 1]; - HKEY hClassesKey; - HKEY hClassKey; + HKEY hClassesKey = INVALID_HANDLE_VALUE; + HKEY hClassKey = NULL; DWORD dwLength; DWORD dwIndex; LONG lError; DWORD dwGuidListIndex = 0; + BOOL ret = FALSE; TRACE("0x%lx %p %lu %p %s %p\n", Flags, ClassGuidList, ClassGuidListSize, RequiredSize, debugstr_w(MachineName), Reserved); if (RequiredSize != NULL) - *RequiredSize = 0; + *RequiredSize = 0; hClassesKey = SetupDiOpenClassRegKeyExW(NULL, KEY_ENUMERATE_SUB_KEYS, @@ -216,118 +220,113 @@ BOOL WINAPI SetupDiBuildClassInfoListExW( MachineName, Reserved); if (hClassesKey == INVALID_HANDLE_VALUE) - { - return FALSE; - } + goto cleanup; for (dwIndex = 0; ; dwIndex++) { - dwLength = MAX_GUID_STRING_LEN + 1; - lError = RegEnumKeyExW(hClassesKey, - dwIndex, - szKeyName, - &dwLength, - NULL, - NULL, - NULL, - NULL); - TRACE("RegEnumKeyExW() returns %ld\n", lError); - if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA) - { - TRACE("Key name: %s\n", debugstr_w(szKeyName)); - - if (RegOpenKeyExW(hClassesKey, - szKeyName, - 0, - KEY_QUERY_VALUE, - &hClassKey)) - { - RegCloseKey(hClassesKey); - return FALSE; - } - - if (!RegQueryValueExW(hClassKey, - REGSTR_VAL_NOUSECLASS, - NULL, - NULL, - NULL, - NULL)) - { - TRACE("'NoUseClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - if ((Flags & DIBCI_NOINSTALLCLASS) && - (!RegQueryValueExW(hClassKey, - REGSTR_VAL_NOINSTALLCLASS, - NULL, - NULL, - NULL, - NULL))) - { - TRACE("'NoInstallClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - if ((Flags & DIBCI_NODISPLAYCLASS) && - (!RegQueryValueExW(hClassKey, - REGSTR_VAL_NODISPLAYCLASS, - NULL, - NULL, - NULL, - NULL))) - { - TRACE("'NoDisplayClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - RegCloseKey(hClassKey); - - TRACE("Guid: %s\n", debugstr_w(szKeyName)); - if (dwGuidListIndex < ClassGuidListSize) - { - if (szKeyName[0] == L'{' && szKeyName[37] == L'}') - { - szKeyName[37] = 0; - } - TRACE("Guid: %s\n", debugstr_w(&szKeyName[1])); - - UuidFromStringW(&szKeyName[1], - &ClassGuidList[dwGuidListIndex]); - } - - dwGuidListIndex++; - } - - if (lError != ERROR_SUCCESS) - break; - } - - RegCloseKey(hClassesKey); + dwLength = MAX_GUID_STRING_LEN + 1; + lError = RegEnumKeyExW(hClassesKey, + dwIndex, + szKeyName, + &dwLength, + NULL, + NULL, + NULL, + NULL); + TRACE("RegEnumKeyExW() returns %ld\n", lError); + if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA) + { + TRACE("Key name: %s\n", debugstr_w(szKeyName)); + + if (hClassKey != NULL) + RegCloseKey(hClassKey); + if (RegOpenKeyExW(hClassesKey, + szKeyName, + 0, + KEY_QUERY_VALUE, + &hClassKey) != ERROR_SUCCESS) + { + goto cleanup; + } + + if (RegQueryValueExW(hClassKey, + REGSTR_VAL_NOUSECLASS, + NULL, + NULL, + NULL, + NULL) == ERROR_SUCCESS) + { + TRACE("'NoUseClass' value found!\n"); + continue; + } + + if ((Flags & DIBCI_NOINSTALLCLASS) && + (!RegQueryValueExW(hClassKey, + REGSTR_VAL_NOINSTALLCLASS, + NULL, + NULL, + NULL, + NULL))) + { + TRACE("'NoInstallClass' value found!\n"); + continue; + } + + if ((Flags & DIBCI_NODISPLAYCLASS) && + (!RegQueryValueExW(hClassKey, + REGSTR_VAL_NODISPLAYCLASS, + NULL, + NULL, + NULL, + NULL))) + { + TRACE("'NoDisplayClass' value found!\n"); + continue; + } + + TRACE("Guid: %s\n", debugstr_w(szKeyName)); + if (dwGuidListIndex < ClassGuidListSize) + { + if (szKeyName[0] == L'{' && szKeyName[37] == L'}') + szKeyName[37] = 0; + TRACE("Guid: %s\n", debugstr_w(&szKeyName[1])); + + UuidFromStringW(&szKeyName[1], + &ClassGuidList[dwGuidListIndex]); + } + + dwGuidListIndex++; + } + + if (lError != ERROR_SUCCESS) + break; + } if (RequiredSize != NULL) - *RequiredSize = dwGuidListIndex; + *RequiredSize = dwGuidListIndex; if (ClassGuidListSize < dwGuidListIndex) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } + SetLastError(ERROR_INSUFFICIENT_BUFFER); + else + ret = TRUE; - return TRUE; +cleanup: + if (hClassesKey != INVALID_HANDLE_VALUE) + RegCloseKey(hClassesKey); + if (hClassKey != NULL) + RegCloseKey(hClassKey); + return ret; } /*********************************************************************** * SetupDiClassGuidsFromNameA (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassGuidsFromNameA( - LPCSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) +BOOL WINAPI +SetupDiClassGuidsFromNameA( + IN PCSTR ClassName, + OUT LPGUID ClassGuidList, + IN DWORD ClassGuidListSize, + OUT PDWORD RequiredSize) { return SetupDiClassGuidsFromNameExA(ClassName, ClassGuidList, ClassGuidListSize, RequiredSize, @@ -338,10 +337,10 @@ BOOL WINAPI SetupDiClassGuidsFromNameA( * SetupDiClassGuidsFromNameW (SETUPAPI.@) */ BOOL WINAPI SetupDiClassGuidsFromNameW( - LPCWSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) + IN PCWSTR ClassName, + OUT LPGUID ClassGuidList, + IN DWORD ClassGuidListSize, + OUT PDWORD RequiredSize) { return SetupDiClassGuidsFromNameExW(ClassName, ClassGuidList, ClassGuidListSize, RequiredSize, @@ -351,13 +350,14 @@ BOOL WINAPI SetupDiClassGuidsFromNameW( /*********************************************************************** * SetupDiClassGuidsFromNameExA (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassGuidsFromNameExA( - LPCSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCSTR MachineName, - PVOID Reserved) +BOOL WINAPI +SetupDiClassGuidsFromNameExA( + IN PCSTR ClassName, + OUT LPGUID ClassGuidList, + IN DWORD ClassGuidListSize, + OUT PDWORD RequiredSize, + IN PCSTR MachineName OPTIONAL, + IN PVOID Reserved) { LPWSTR ClassNameW = NULL; LPWSTR MachineNameW = NULL; @@ -394,28 +394,30 @@ BOOL WINAPI SetupDiClassGuidsFromNameExA( /*********************************************************************** * SetupDiClassGuidsFromNameExW (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassGuidsFromNameExW( - LPCWSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCWSTR MachineName, - PVOID Reserved) +BOOL WINAPI +SetupDiClassGuidsFromNameExW( + IN PCWSTR ClassName, + OUT LPGUID ClassGuidList, + IN DWORD ClassGuidListSize, + OUT PDWORD RequiredSize, + IN PCWSTR MachineName OPTIONAL, + IN PVOID Reserved) { WCHAR szKeyName[MAX_GUID_STRING_LEN + 1]; WCHAR szClassName[256]; - HKEY hClassesKey; - HKEY hClassKey; + HKEY hClassesKey = INVALID_HANDLE_VALUE; + HKEY hClassKey = NULL; DWORD dwLength; DWORD dwIndex; LONG lError; DWORD dwGuidListIndex = 0; + BOOL ret = FALSE; TRACE("%s %p %lu %p %s %p\n", debugstr_w(ClassName), ClassGuidList, ClassGuidListSize, RequiredSize, debugstr_w(MachineName), Reserved); if (RequiredSize != NULL) - *RequiredSize = 0; + *RequiredSize = 0; hClassesKey = SetupDiOpenClassRegKeyExW(NULL, KEY_ENUMERATE_SUB_KEYS, @@ -423,96 +425,94 @@ BOOL WINAPI SetupDiClassGuidsFromNameExW( MachineName, Reserved); if (hClassesKey == INVALID_HANDLE_VALUE) - { - return FALSE; - } + goto cleanup; for (dwIndex = 0; ; dwIndex++) { - dwLength = MAX_GUID_STRING_LEN + 1; - lError = RegEnumKeyExW(hClassesKey, - dwIndex, - szKeyName, - &dwLength, - NULL, - NULL, - NULL, - NULL); - TRACE("RegEnumKeyExW() returns %ld\n", lError); - if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA) - { - TRACE("Key name: %s\n", debugstr_w(szKeyName)); - - if (RegOpenKeyExW(hClassesKey, - szKeyName, - 0, - KEY_QUERY_VALUE, - &hClassKey)) - { - RegCloseKey(hClassesKey); - return FALSE; - } - - dwLength = 256 * sizeof(WCHAR); - if (!RegQueryValueExW(hClassKey, - Class, - NULL, - NULL, - (LPBYTE)szClassName, - &dwLength)) - { - TRACE("Class name: %s\n", debugstr_w(szClassName)); - - if (strcmpiW(szClassName, ClassName) == 0) - { - TRACE("Found matching class name\n"); - - TRACE("Guid: %s\n", debugstr_w(szKeyName)); - if (dwGuidListIndex < ClassGuidListSize) - { - if (szKeyName[0] == L'{' && szKeyName[37] == L'}') - { - szKeyName[37] = 0; - } - TRACE("Guid: %s\n", debugstr_w(&szKeyName[1])); - - UuidFromStringW(&szKeyName[1], - &ClassGuidList[dwGuidListIndex]); - } - - dwGuidListIndex++; - } - } - - RegCloseKey(hClassKey); - } - - if (lError != ERROR_SUCCESS) - break; - } - - RegCloseKey(hClassesKey); + dwLength = MAX_GUID_STRING_LEN + 1; + lError = RegEnumKeyExW(hClassesKey, + dwIndex, + szKeyName, + &dwLength, + NULL, + NULL, + NULL, + NULL); + TRACE("RegEnumKeyExW() returns %ld\n", lError); + if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA) + { + TRACE("Key name: %s\n", debugstr_w(szKeyName)); + + if (hClassKey != NULL) + RegCloseKey(hClassKey); + if (RegOpenKeyExW(hClassesKey, + szKeyName, + 0, + KEY_QUERY_VALUE, + &hClassKey) != ERROR_SUCCESS) + { + goto cleanup; + } + + dwLength = 256 * sizeof(WCHAR); + if (RegQueryValueExW(hClassKey, + Class, + NULL, + NULL, + (LPBYTE)szClassName, + &dwLength) == ERROR_SUCCESS) + { + TRACE("Class name: %s\n", debugstr_w(szClassName)); + + if (strcmpiW(szClassName, ClassName) == 0) + { + TRACE("Found matching class name\n"); + + TRACE("Guid: %s\n", debugstr_w(szKeyName)); + if (dwGuidListIndex < ClassGuidListSize) + { + if (szKeyName[0] == L'{' && szKeyName[37] == L'}') + szKeyName[37] = 0; + TRACE("Guid: %s\n", debugstr_w(&szKeyName[1])); + + UuidFromStringW(&szKeyName[1], + &ClassGuidList[dwGuidListIndex]); + } + + dwGuidListIndex++; + } + } + } + + if (lError != ERROR_SUCCESS) + break; + } if (RequiredSize != NULL) - *RequiredSize = dwGuidListIndex; + *RequiredSize = dwGuidListIndex; if (ClassGuidListSize < dwGuidListIndex) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } + SetLastError(ERROR_INSUFFICIENT_BUFFER); + else + ret = TRUE; - return TRUE; +cleanup: + if (hClassesKey != INVALID_HANDLE_VALUE) + RegCloseKey(hClassesKey); + if (hClassKey != NULL) + RegCloseKey(hClassKey); + return ret; } /*********************************************************************** * SetupDiClassNameFromGuidA (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassNameFromGuidA( - const GUID* ClassGuid, - PSTR ClassName, - DWORD ClassNameSize, - PDWORD RequiredSize) +BOOL WINAPI +SetupDiClassNameFromGuidA( + IN CONST GUID* ClassGuid, + OUT PSTR ClassName, + IN DWORD ClassNameSize, + OUT PDWORD RequiredSize OPTIONAL) { return SetupDiClassNameFromGuidExA(ClassGuid, ClassName, ClassNameSize, RequiredSize, @@ -522,11 +522,12 @@ BOOL WINAPI SetupDiClassNameFromGuidA( /*********************************************************************** * SetupDiClassNameFromGuidW (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassNameFromGuidW( - const GUID* ClassGuid, - PWSTR ClassName, - DWORD ClassNameSize, - PDWORD RequiredSize) +BOOL WINAPI +SetupDiClassNameFromGuidW( + IN CONST GUID* ClassGuid, + OUT PWSTR ClassName, + IN DWORD ClassNameSize, + OUT PDWORD RequiredSize OPTIONAL) { return SetupDiClassNameFromGuidExW(ClassGuid, ClassName, ClassNameSize, RequiredSize, @@ -536,13 +537,14 @@ BOOL WINAPI SetupDiClassNameFromGuidW( /*********************************************************************** * SetupDiClassNameFromGuidExA (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassNameFromGuidExA( - const GUID* ClassGuid, - PSTR ClassName, - DWORD ClassNameSize, - PDWORD RequiredSize, - PCSTR MachineName, - PVOID Reserved) +BOOL WINAPI +SetupDiClassNameFromGuidExA( + IN CONST GUID* ClassGuid, + OUT PSTR ClassName, + IN DWORD ClassNameSize, + OUT PDWORD RequiredSize OPTIONAL, + IN PCSTR MachineName OPTIONAL, + IN PVOID Reserved) { WCHAR ClassNameW[MAX_CLASS_NAME_LEN]; LPWSTR MachineNameW = NULL; @@ -551,7 +553,7 @@ BOOL WINAPI SetupDiClassNameFromGuidExA( if (MachineName) MachineNameW = MultiByteToUnicode(MachineName, CP_ACP); ret = SetupDiClassNameFromGuidExW(ClassGuid, ClassNameW, MAX_CLASS_NAME_LEN, - NULL, MachineNameW, Reserved); + NULL, MachineNameW, Reserved); if (ret) { int len = WideCharToMultiByte(CP_ACP, 0, ClassNameW, -1, ClassName, @@ -567,17 +569,19 @@ BOOL WINAPI SetupDiClassNameFromGuidExA( /*********************************************************************** * SetupDiClassNameFromGuidExW (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassNameFromGuidExW( - const GUID* ClassGuid, - PWSTR ClassName, - DWORD ClassNameSize, - PDWORD RequiredSize, - PCWSTR MachineName, - PVOID Reserved) +BOOL WINAPI +SetupDiClassNameFromGuidExW( + IN CONST GUID* ClassGuid, + OUT PWSTR ClassName, + IN DWORD ClassNameSize, + OUT PDWORD RequiredSize OPTIONAL, + IN PCWSTR MachineName OPTIONAL, + IN PVOID Reserved) { HKEY hKey; DWORD dwLength; LONG rc; + BOOL ret = FALSE; TRACE("%s %p %lu %p %s %p\n", debugstr_guid(ClassGuid), ClassName, ClassNameSize, RequiredSize, debugstr_w(MachineName), Reserved); @@ -588,54 +592,54 @@ BOOL WINAPI SetupDiClassNameFromGuidExW( MachineName, Reserved); if (hKey == INVALID_HANDLE_VALUE) - { - return FALSE; - } + goto cleanup; if (RequiredSize != NULL) { - dwLength = 0; - rc = RegQueryValueExW(hKey, - Class, - NULL, - NULL, - NULL, - &dwLength); - if (rc != ERROR_SUCCESS) - { - SetLastError(rc); - RegCloseKey(hKey); - return FALSE; - } + dwLength = 0; + rc = RegQueryValueExW(hKey, + Class, + NULL, + NULL, + NULL, + &dwLength); + if (rc != ERROR_SUCCESS) + { + SetLastError(rc); + goto cleanup; + } - *RequiredSize = dwLength / sizeof(WCHAR); + *RequiredSize = dwLength / sizeof(WCHAR); } dwLength = ClassNameSize * sizeof(WCHAR); rc = RegQueryValueExW(hKey, - Class, - NULL, - NULL, - (LPBYTE)ClassName, - &dwLength); + Class, + NULL, + NULL, + (LPBYTE)ClassName, + &dwLength); if (rc != ERROR_SUCCESS) { - SetLastError(rc); - RegCloseKey(hKey); - return FALSE; + SetLastError(rc); + goto cleanup; } - RegCloseKey(hKey); + ret = TRUE; - return TRUE; +cleanup: + if (hKey != INVALID_HANDLE_VALUE) + RegCloseKey(hKey); + return ret; } /*********************************************************************** * SetupDiCreateDeviceInfoList (SETUPAPI.@) */ HDEVINFO WINAPI -SetupDiCreateDeviceInfoList(const GUID *ClassGuid, - HWND hwndParent) +SetupDiCreateDeviceInfoList( + IN CONST GUID *ClassGuid OPTIONAL, + IN HWND hwndParent OPTIONAL) { return SetupDiCreateDeviceInfoListExW(ClassGuid, hwndParent, NULL, NULL); } @@ -644,10 +648,11 @@ SetupDiCreateDeviceInfoList(const GUID *ClassGuid, * SetupDiCreateDeviceInfoListExA (SETUPAPI.@) */ HDEVINFO WINAPI -SetupDiCreateDeviceInfoListExA(const GUID *ClassGuid, - HWND hwndParent, - PCSTR MachineName, - PVOID Reserved) +SetupDiCreateDeviceInfoListExA( + IN CONST GUID *ClassGuid OPTIONAL, + IN HWND hwndParent OPTIONAL, + IN PCSTR MachineName OPTIONAL, + IN PVOID Reserved) { LPWSTR MachineNameW = NULL; HDEVINFO hDevInfo; @@ -703,10 +708,11 @@ GetErrorCodeFromCrCode(const IN CONFIGRET cr) * SetupDiCreateDeviceInfoListExW (SETUPAPI.@) */ HDEVINFO WINAPI -SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid, - HWND hwndParent, - PCWSTR MachineName, - PVOID Reserved) +SetupDiCreateDeviceInfoListExW( + IN CONST GUID *ClassGuid OPTIONAL, + IN HWND hwndParent OPTIONAL, + IN PCWSTR MachineName OPTIONAL, + IN PVOID Reserved) { struct DeviceInfoSet *list; LPWSTR UNCServerName = NULL; @@ -788,21 +794,26 @@ SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid, cleanup: if (ret == INVALID_HANDLE_VALUE) { - if (list && list->HKLM != 0 && list->HKLM != HKEY_LOCAL_MACHINE) - RegCloseKey(list->HKLM); + if (list) + { + if (list->HKLM != NULL && list->HKLM != HKEY_LOCAL_MACHINE) + RegCloseKey(list->HKLM); + } HeapFree(GetProcessHeap(), 0, list); } - HeapFree(GetProcessHeap(), 0, UNCServerName); + if (UNCServerName) + HeapFree(GetProcessHeap(), 0, UNCServerName); return ret; } /*********************************************************************** * SetupDiEnumDeviceInfo (SETUPAPI.@) */ -BOOL WINAPI SetupDiEnumDeviceInfo( - HDEVINFO DeviceInfoSet, - DWORD MemberIndex, - PSP_DEVINFO_DATA DeviceInfoData) +BOOL WINAPI +SetupDiEnumDeviceInfo( + IN HDEVINFO DeviceInfoSet, + IN DWORD MemberIndex, + OUT PSP_DEVINFO_DATA DeviceInfoData) { BOOL ret = FALSE; @@ -846,12 +857,12 @@ BOOL WINAPI SetupDiEnumDeviceInfo( */ BOOL WINAPI SetupDiGetActualSectionToInstallA( - IN HINF InfHandle, - IN PCSTR InfSectionName, - OUT PSTR InfSectionWithExt OPTIONAL, - IN DWORD InfSectionWithExtSize, - OUT PDWORD RequiredSize OPTIONAL, - OUT PSTR *Extension OPTIONAL) + IN HINF InfHandle, + IN PCSTR InfSectionName, + OUT PSTR InfSectionWithExt OPTIONAL, + IN DWORD InfSectionWithExtSize, + OUT PDWORD RequiredSize OPTIONAL, + OUT PSTR *Extension OPTIONAL) { return SetupDiGetActualSectionToInstallExA(InfHandle, InfSectionName, NULL, InfSectionWithExt, InfSectionWithExtSize, RequiredSize, @@ -863,12 +874,12 @@ SetupDiGetActualSectionToInstallA( */ BOOL WINAPI SetupDiGetActualSectionToInstallW( - IN HINF InfHandle, - IN PCWSTR InfSectionName, - OUT PWSTR InfSectionWithExt OPTIONAL, - IN DWORD InfSectionWithExtSize, - OUT PDWORD RequiredSize OPTIONAL, - OUT PWSTR *Extension OPTIONAL) + IN HINF InfHandle, + IN PCWSTR InfSectionName, + OUT PWSTR InfSectionWithExt OPTIONAL, + IN DWORD InfSectionWithExtSize, + OUT PDWORD RequiredSize OPTIONAL, + OUT PWSTR *Extension OPTIONAL) { return SetupDiGetActualSectionToInstallExW(InfHandle, InfSectionName, NULL, InfSectionWithExt, InfSectionWithExtSize, RequiredSize, @@ -880,14 +891,14 @@ SetupDiGetActualSectionToInstallW( */ BOOL WINAPI SetupDiGetActualSectionToInstallExA( - IN HINF InfHandle, - IN PCSTR InfSectionName, - IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo OPTIONAL, - OUT PSTR InfSectionWithExt OPTIONAL, - IN DWORD InfSectionWithExtSize, - OUT PDWORD RequiredSize OPTIONAL, - OUT PSTR* Extension OPTIONAL, - IN PVOID Reserved) + IN HINF InfHandle, + IN PCSTR InfSectionName, + IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo OPTIONAL, + OUT PSTR InfSectionWithExt OPTIONAL, + IN DWORD InfSectionWithExtSize, + OUT PDWORD RequiredSize OPTIONAL, + OUT PSTR* Extension OPTIONAL, + IN PVOID Reserved) { LPWSTR InfSectionNameW = NULL; LPWSTR InfSectionWithExtW = NULL; @@ -942,14 +953,14 @@ cleanup: */ BOOL WINAPI SetupDiGetActualSectionToInstallExW( - IN HINF InfHandle, - IN PCWSTR InfSectionName, - IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo OPTIONAL, - OUT PWSTR InfSectionWithExt OPTIONAL, - IN DWORD InfSectionWithExtSize, - OUT PDWORD RequiredSize OPTIONAL, - OUT PWSTR* Extension OPTIONAL, - IN PVOID Reserved) + IN HINF InfHandle, + IN PCWSTR InfSectionName, + IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo OPTIONAL, + OUT PWSTR InfSectionWithExt OPTIONAL, + IN DWORD InfSectionWithExtSize, + OUT PDWORD RequiredSize OPTIONAL, + OUT PWSTR* Extension OPTIONAL, + IN PVOID Reserved) { BOOL ret = FALSE; @@ -1136,11 +1147,12 @@ done: /*********************************************************************** * SetupDiGetClassDescriptionA (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDescriptionA( - const GUID* ClassGuid, - PSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize) +BOOL WINAPI +SetupDiGetClassDescriptionA( + IN CONST GUID *ClassGuid, + OUT PSTR ClassDescription, + IN DWORD ClassDescriptionSize, + OUT PDWORD RequiredSize OPTIONAL) { return SetupDiGetClassDescriptionExA(ClassGuid, ClassDescription, ClassDescriptionSize, @@ -1150,11 +1162,12 @@ BOOL WINAPI SetupDiGetClassDescriptionA( /*********************************************************************** * SetupDiGetClassDescriptionW (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDescriptionW( - const GUID* ClassGuid, - PWSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize) +BOOL WINAPI +SetupDiGetClassDescriptionW( + IN CONST GUID *ClassGuid, + OUT PWSTR ClassDescription, + IN DWORD ClassDescriptionSize, + OUT PDWORD RequiredSize OPTIONAL) { return SetupDiGetClassDescriptionExW(ClassGuid, ClassDescription, ClassDescriptionSize, @@ -1164,13 +1177,14 @@ BOOL WINAPI SetupDiGetClassDescriptionW( /*********************************************************************** * SetupDiGetClassDescriptionExA (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDescriptionExA( - const GUID* ClassGuid, - PSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize, - PCSTR MachineName, - PVOID Reserved) +BOOL WINAPI +SetupDiGetClassDescriptionExA( + IN CONST GUID *ClassGuid, + OUT PSTR ClassDescription, + IN DWORD ClassDescriptionSize, + OUT PDWORD RequiredSize OPTIONAL, + IN PCSTR MachineName OPTIONAL, + IN PVOID Reserved) { PWCHAR ClassDescriptionW; LPWSTR MachineNameW = NULL; @@ -1221,16 +1235,18 @@ end: /*********************************************************************** * SetupDiGetClassDescriptionExW (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDescriptionExW( - const GUID* ClassGuid, - PWSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize, - PCWSTR MachineName, - PVOID Reserved) +BOOL WINAPI +SetupDiGetClassDescriptionExW( + IN CONST GUID *ClassGuid, + OUT PWSTR ClassDescription, + IN DWORD ClassDescriptionSize, + OUT PDWORD RequiredSize OPTIONAL, + IN PCWSTR MachineName OPTIONAL, + IN PVOID Reserved) { - HKEY hKey; + HKEY hKey = INVALID_HANDLE_VALUE; DWORD dwLength; + BOOL ret = FALSE; TRACE("%s %p %lu %p %s %p\n", debugstr_guid(ClassGuid), ClassDescription, ClassDescriptionSize, RequiredSize, debugstr_w(MachineName), Reserved); @@ -1242,109 +1258,114 @@ BOOL WINAPI SetupDiGetClassDescriptionExW( Reserved); if (hKey == INVALID_HANDLE_VALUE) { - WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError()); - return FALSE; + WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError()); + goto cleanup; } if (RequiredSize != NULL) { - dwLength = 0; - if (RegQueryValueExW(hKey, - NULL, - NULL, - NULL, - NULL, - &dwLength)) - { - RegCloseKey(hKey); - return FALSE; - } + dwLength = 0; + if (RegQueryValueExW(hKey, + NULL, + NULL, + NULL, + NULL, + &dwLength) != ERROR_SUCCESS) + { + goto cleanup; + } - *RequiredSize = dwLength / sizeof(WCHAR); + *RequiredSize = dwLength / sizeof(WCHAR); } dwLength = ClassDescriptionSize * sizeof(WCHAR); if (RegQueryValueExW(hKey, - NULL, - NULL, - NULL, - (LPBYTE)ClassDescription, - &dwLength)) + NULL, + NULL, + NULL, + (LPBYTE)ClassDescription, + &dwLength) != ERROR_SUCCESS) { - RegCloseKey(hKey); - return FALSE; + goto cleanup; } - RegCloseKey(hKey); + ret = TRUE; - return TRUE; +cleanup: + if (hKey != INVALID_HANDLE_VALUE) + RegCloseKey(hKey); + + return ret; } /*********************************************************************** * SetupDiGetClassDevsA (SETUPAPI.@) */ -HDEVINFO WINAPI SetupDiGetClassDevsA( - CONST GUID *class, - LPCSTR enumstr, - HWND parent, - DWORD flags) +HDEVINFO WINAPI +SetupDiGetClassDevsA( + IN CONST GUID *ClassGuid OPTIONAL, + IN PCSTR Enumerator OPTIONAL, + IN HWND hwndParent OPTIONAL, + IN DWORD Flags) { - return SetupDiGetClassDevsExA(class, enumstr, parent, - flags, NULL, NULL, NULL); + return SetupDiGetClassDevsExA(ClassGuid, Enumerator, hwndParent, + Flags, NULL, NULL, NULL); } /*********************************************************************** * SetupDiGetClassDevsW (SETUPAPI.@) */ -HDEVINFO WINAPI SetupDiGetClassDevsW( - CONST GUID *class, - LPCWSTR enumstr, - HWND parent, - DWORD flags) +HDEVINFO WINAPI +SetupDiGetClassDevsW( + IN CONST GUID *ClassGuid OPTIONAL, + IN PCWSTR Enumerator OPTIONAL, + IN HWND hwndParent OPTIONAL, + IN DWORD Flags) { - return SetupDiGetClassDevsExW(class, enumstr, parent, - flags, NULL, NULL, NULL); + return SetupDiGetClassDevsExW(ClassGuid, Enumerator, hwndParent, + Flags, NULL, NULL, NULL); } /*********************************************************************** * SetupDiGetClassDevsExA (SETUPAPI.@) */ -HDEVINFO WINAPI SetupDiGetClassDevsExA( - CONST GUID *class, - LPCSTR enumstr, - HWND parent, - DWORD flags, - HDEVINFO deviceset, - LPCSTR machine, - PVOID reserved) +HDEVINFO WINAPI +SetupDiGetClassDevsExA( + IN CONST GUID *ClassGuid OPTIONAL, + IN PCSTR Enumerator OPTIONAL, + IN HWND hwndParent OPTIONAL, + IN DWORD Flags, + IN HDEVINFO DeviceInfoSet OPTIONAL, + IN PCSTR MachineName OPTIONAL, + IN PVOID Reserved) { HDEVINFO ret; LPWSTR enumstrW = NULL; LPWSTR machineW = NULL; - if (enumstr) + if (Enumerator) { - int len = MultiByteToWideChar(CP_ACP, 0, enumstr, -1, NULL, 0); + int len = MultiByteToWideChar(CP_ACP, 0, Enumerator, -1, NULL, 0); enumstrW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); if (!enumstrW) { ret = (HDEVINFO)INVALID_HANDLE_VALUE; goto end; } - MultiByteToWideChar(CP_ACP, 0, enumstr, -1, enumstrW, len); + MultiByteToWideChar(CP_ACP, 0, Enumerator, -1, enumstrW, len); } - if (machine) + if (MachineName) { - int len = MultiByteToWideChar(CP_ACP, 0, machine, -1, NULL, 0); + int len = MultiByteToWideChar(CP_ACP, 0, MachineName, -1, NULL, 0); machineW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); if (!machineW) { ret = (HDEVINFO)INVALID_HANDLE_VALUE; goto end; } - MultiByteToWideChar(CP_ACP, 0, machine, -1, machineW, len); + MultiByteToWideChar(CP_ACP, 0, MachineName, -1, machineW, len); } - ret = SetupDiGetClassDevsExW(class, enumstrW, parent, flags, deviceset, machineW, reserved); + ret = SetupDiGetClassDevsExW(ClassGuid, enumstrW, hwndParent, Flags, DeviceInfoSet, machineW, Reserved); end: HeapFree(GetProcessHeap(), 0, enumstrW); @@ -1422,13 +1443,14 @@ CreateDeviceInterface( return TRUE; } -static LONG SETUP_CreateDevListFromEnumerator( - struct DeviceInfoSet *list, - LPCGUID pClassGuid OPTIONAL, - LPCWSTR Enumerator, - HKEY hEnumeratorKey) /* handle to Enumerator registry key */ +static LONG +SETUP_CreateDevListFromEnumerator( + struct DeviceInfoSet *list, + CONST GUID *pClassGuid OPTIONAL, + LPCWSTR Enumerator, + HKEY hEnumeratorKey) /* handle to Enumerator registry key */ { - HKEY hDeviceIdKey, hInstanceIdKey; + HKEY hDeviceIdKey = NULL, hInstanceIdKey; WCHAR KeyBuffer[MAX_PATH]; WCHAR InstancePath[MAX_PATH]; LPWSTR pEndOfInstancePath; /* Pointer into InstancePath buffer */ @@ -1445,13 +1467,15 @@ static LONG SETUP_CreateDevListFromEnumerator( if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) - return rc; + goto cleanup; i++; /* Open device id sub key */ + if (hDeviceIdKey != NULL) + RegCloseKey(hDeviceIdKey); rc = RegOpenKeyExW(hEnumeratorKey, KeyBuffer, 0, KEY_ENUMERATE_SUB_KEYS, &hDeviceIdKey); if (rc != ERROR_SUCCESS) - return rc; + goto cleanup; strcpyW(InstancePath, Enumerator); strcatW(InstancePath, L"\\"); strcatW(InstancePath, KeyBuffer); @@ -1469,19 +1493,13 @@ static LONG SETUP_CreateDevListFromEnumerator( if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) - { - RegCloseKey(hDeviceIdKey); - return rc; - } + goto cleanup; j++; /* Open instance id sub key */ rc = RegOpenKeyExW(hDeviceIdKey, KeyBuffer, 0, KEY_QUERY_VALUE, &hInstanceIdKey); if (rc != ERROR_SUCCESS) - { - RegCloseKey(hDeviceIdKey); - return rc; - } + goto cleanup; *pEndOfInstancePath = '\0'; strcatW(InstancePath, KeyBuffer); @@ -1499,13 +1517,12 @@ static LONG SETUP_CreateDevListFromEnumerator( } else if (rc != ERROR_SUCCESS) { - RegCloseKey(hDeviceIdKey); - return rc; + goto cleanup; } else if (dwRegType != REG_SZ) { - RegCloseKey(hDeviceIdKey); - return ERROR_GEN_FAILURE; + rc = ERROR_GEN_FAILURE; + goto cleanup; } else { @@ -1524,25 +1541,32 @@ static LONG SETUP_CreateDevListFromEnumerator( /* Add the entry to the list */ if (!CreateDeviceInfoElement(list, InstancePath, &KeyGuid, &deviceInfo)) { - RegCloseKey(hDeviceIdKey); - return GetLastError(); + rc = GetLastError(); + goto cleanup; } TRACE("Adding '%s' to device info set %p\n", debugstr_w(InstancePath), list); InsertTailList(&list->ListHead, &deviceInfo->ListEntry); } - RegCloseKey(hDeviceIdKey); } - return ERROR_SUCCESS; + rc = ERROR_SUCCESS; + +cleanup: + if (hDeviceIdKey != NULL) + RegCloseKey(hDeviceIdKey); + return rc; } -static LONG SETUP_CreateDevList( - struct DeviceInfoSet *list, - PCWSTR MachineName OPTIONAL, - LPGUID class OPTIONAL, - PCWSTR Enumerator OPTIONAL) +static LONG +SETUP_CreateDevList( + struct DeviceInfoSet *list, + PCWSTR MachineName OPTIONAL, + CONST GUID *class OPTIONAL, + PCWSTR Enumerator OPTIONAL) { - HKEY HKLM, hEnumKey, hEnumeratorKey; + HKEY HKLM = HKEY_LOCAL_MACHINE; + HKEY hEnumKey = NULL; + HKEY hEnumeratorKey = NULL; WCHAR KeyBuffer[MAX_PATH]; DWORD i; DWORD dwLength; @@ -1551,24 +1575,22 @@ static LONG SETUP_CreateDevList( if (class && IsEqualIID(class, &GUID_NULL)) class = NULL; - /* Open Enum key */ + /* Open Enum key (if applicable) */ if (MachineName != NULL) { rc = RegConnectRegistryW(MachineName, HKEY_LOCAL_MACHINE, &HKLM); if (rc != ERROR_SUCCESS) - return rc; + goto cleanup; } - else - HKLM = HKEY_LOCAL_MACHINE; - rc = RegOpenKeyExW(HKLM, + rc = RegOpenKeyExW( + HKLM, REGSTR_PATH_SYSTEMENUM, 0, KEY_ENUMERATE_SUB_KEYS, &hEnumKey); - if (MachineName != NULL) RegCloseKey(HKLM); if (rc != ERROR_SUCCESS) - return rc; + goto cleanup; /* If enumerator is provided, call directly SETUP_CreateDevListFromEnumerator. * Else, enumerate all enumerators and call SETUP_CreateDevListFromEnumerator @@ -1582,12 +1604,9 @@ static LONG SETUP_CreateDevList( 0, KEY_ENUMERATE_SUB_KEYS, &hEnumeratorKey); - RegCloseKey(hEnumKey); if (rc != ERROR_SUCCESS) - return rc; + goto cleanup; rc = SETUP_CreateDevListFromEnumerator(list, class, Enumerator, hEnumeratorKey); - RegCloseKey(hEnumeratorKey); - return rc; } else { @@ -1599,48 +1618,49 @@ static LONG SETUP_CreateDevList( rc = RegEnumKeyExW(hEnumKey, i, KeyBuffer, &dwLength, NULL, NULL, NULL, NULL); if (rc == ERROR_NO_MORE_ITEMS) break; - if (rc != ERROR_SUCCESS) - { - RegCloseKey(hEnumKey); - return rc; - } + else if (rc != ERROR_SUCCESS) + goto cleanup; i++; /* Open sub key */ + if (hEnumeratorKey != NULL) + RegCloseKey(hEnumeratorKey); rc = RegOpenKeyExW(hEnumKey, KeyBuffer, 0, KEY_ENUMERATE_SUB_KEYS, &hEnumeratorKey); if (rc != ERROR_SUCCESS) - { - RegCloseKey(hEnumKey); - return rc; - } + goto cleanup; /* Call SETUP_CreateDevListFromEnumerator */ rc = SETUP_CreateDevListFromEnumerator(list, class, KeyBuffer, hEnumeratorKey); - RegCloseKey(hEnumeratorKey); if (rc != ERROR_SUCCESS) - { - RegCloseKey(hEnumKey); - return rc; - } + goto cleanup; } - RegCloseKey(hEnumKey); - return ERROR_SUCCESS; + rc = ERROR_SUCCESS; } + +cleanup: + if (HKLM != HKEY_LOCAL_MACHINE) + RegCloseKey(HKLM); + if (hEnumKey != NULL) + RegCloseKey(hEnumKey); + if (hEnumeratorKey != NULL) + RegCloseKey(hEnumeratorKey); + return rc; } -static BOOL DestroyDeviceInterface(struct DeviceInterface* deviceInterface) +static BOOL +DestroyDeviceInterface( + struct DeviceInterface* deviceInterface) { - HeapFree(GetProcessHeap(), 0, deviceInterface); - return TRUE; + return HeapFree(GetProcessHeap(), 0, deviceInterface); } -static LONG SETUP_CreateInterfaceList( - struct DeviceInfoSet *list, - PCWSTR MachineName, - LPGUID InterfaceGuid, - PCWSTR DeviceInstanceW /* OPTIONAL */, - BOOL OnlyPresentInterfaces - ) +static LONG +SETUP_CreateInterfaceList( + struct DeviceInfoSet *list, + PCWSTR MachineName, + CONST GUID *InterfaceGuid, + PCWSTR DeviceInstanceW /* OPTIONAL */, + BOOL OnlyPresentInterfaces) { HKEY hInterfaceKey; /* HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID} */ HKEY hDeviceInstanceKey; /* HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID}\##?#{InstancePath} */ @@ -1660,8 +1680,8 @@ static LONG SETUP_CreateInterfaceList( struct DeviceInfoElement *deviceInfo; hInterfaceKey = INVALID_HANDLE_VALUE; - hDeviceInstanceKey = INVALID_HANDLE_VALUE; - hReferenceKey = INVALID_HANDLE_VALUE; + hDeviceInstanceKey = NULL; + hReferenceKey = NULL; /* Open registry key related to this interface */ hInterfaceKey = SetupDiOpenClassRegKeyExW(InterfaceGuid, KEY_ENUMERATE_SUB_KEYS, DIOCR_INTERFACE, MachineName, NULL); @@ -1684,7 +1704,7 @@ static LONG SETUP_CreateInterfaceList( i++; /* Open sub key */ - if (hDeviceInstanceKey != INVALID_HANDLE_VALUE) + if (hDeviceInstanceKey != NULL) RegCloseKey(hDeviceInstanceKey); rc = RegOpenKeyExW(hInterfaceKey, KeyBuffer, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &hDeviceInstanceKey); if (rc != ERROR_SUCCESS) @@ -1699,8 +1719,7 @@ static LONG SETUP_CreateInterfaceList( rc = ERROR_GEN_FAILURE; goto cleanup; } - if (InstancePath != NULL) - HeapFree(GetProcessHeap(), 0, InstancePath); + HeapFree(GetProcessHeap(), 0, InstancePath); InstancePath = HeapAlloc(GetProcessHeap(), 0, dwInstancePathLength + sizeof(WCHAR)); if (!InstancePath) { @@ -1774,7 +1793,7 @@ static LONG SETUP_CreateInterfaceList( continue; /* Open sub key */ - if (hReferenceKey != INVALID_HANDLE_VALUE) + if (hReferenceKey != NULL) RegCloseKey(hReferenceKey); rc = RegOpenKeyExW(hDeviceInstanceKey, KeyBuffer, 0, KEY_QUERY_VALUE, &hReferenceKey); if (rc != ERROR_SUCCESS) @@ -1801,8 +1820,7 @@ static LONG SETUP_CreateInterfaceList( InsertTailList(&list->ListHead, &deviceInfo->ListEntry); /* Step 2. Create an interface list for this element */ - if (pSymbolicLink != NULL) - HeapFree(GetProcessHeap(), 0, pSymbolicLink); + HeapFree(GetProcessHeap(), 0, pSymbolicLink); pSymbolicLink = HeapAlloc(GetProcessHeap(), 0, (dwLength + 1) * sizeof(WCHAR)); if (!pSymbolicLink) { @@ -1811,7 +1829,6 @@ static LONG SETUP_CreateInterfaceList( } rc = RegQueryValueExW(hReferenceKey, SymbolicLink, NULL, NULL, (LPBYTE)pSymbolicLink, &dwLength); pSymbolicLink[dwLength / sizeof(WCHAR)] = '\0'; - RegCloseKey(hReferenceKey); if (rc != ERROR_SUCCESS) goto cleanup; if (!CreateDeviceInterface(deviceInfo, pSymbolicLink, InterfaceGuid, &interfaceInfo)) @@ -1850,57 +1867,57 @@ static LONG SETUP_CreateInterfaceList( rc = ERROR_SUCCESS; cleanup: - if (hReferenceKey != INVALID_HANDLE_VALUE) + if (hReferenceKey != NULL) RegCloseKey(hReferenceKey); - if (hDeviceInstanceKey != INVALID_HANDLE_VALUE) + if (hDeviceInstanceKey != NULL) RegCloseKey(hDeviceInstanceKey); if (hInterfaceKey != INVALID_HANDLE_VALUE) RegCloseKey(hInterfaceKey); - if (InstancePath != NULL) - HeapFree(GetProcessHeap(), 0, InstancePath); - if (pSymbolicLink != NULL) - HeapFree(GetProcessHeap(), 0, pSymbolicLink); + HeapFree(GetProcessHeap(), 0, InstancePath); + HeapFree(GetProcessHeap(), 0, pSymbolicLink); return rc; } /*********************************************************************** * SetupDiGetClassDevsExW (SETUPAPI.@) */ -HDEVINFO WINAPI SetupDiGetClassDevsExW( - CONST GUID *class, - LPCWSTR enumstr, - HWND parent, - DWORD flags, - HDEVINFO deviceset, - LPCWSTR machine, - PVOID reserved) +HDEVINFO WINAPI +SetupDiGetClassDevsExW( + IN CONST GUID *ClassGuid OPTIONAL, + IN PCWSTR Enumerator OPTIONAL, + IN HWND hwndParent OPTIONAL, + IN DWORD Flags, + IN HDEVINFO DeviceInfoSet OPTIONAL, + IN PCWSTR MachineName OPTIONAL, + IN PVOID Reserved) { HDEVINFO hDeviceInfo = INVALID_HANDLE_VALUE; struct DeviceInfoSet *list; - LPGUID pClassGuid; + CONST GUID *pClassGuid; LONG rc; + HDEVINFO ret = INVALID_HANDLE_VALUE; - TRACE("%s %s %p 0x%08lx %p %s %p\n", debugstr_guid(class), debugstr_w(enumstr), - parent, flags, deviceset, debugstr_w(machine), reserved); + TRACE("%s %s %p 0x%08lx %p %s %p\n", debugstr_guid(ClassGuid), debugstr_w(Enumerator), + hwndParent, Flags, DeviceInfoSet, debugstr_w(MachineName), Reserved); /* Create the deviceset if not set */ - if (deviceset) + if (DeviceInfoSet) { - list = (struct DeviceInfoSet *)deviceset; + list = (struct DeviceInfoSet *)DeviceInfoSet; if (list->magic != SETUP_DEV_INFO_SET_MAGIC) { SetLastError(ERROR_INVALID_HANDLE); - return INVALID_HANDLE_VALUE; + goto cleanup; } - hDeviceInfo = deviceset; + hDeviceInfo = DeviceInfoSet; } else { hDeviceInfo = SetupDiCreateDeviceInfoListExW( - flags & DIGCF_DEVICEINTERFACE ? NULL : class, - NULL, machine, NULL); + Flags & DIGCF_DEVICEINTERFACE ? NULL : ClassGuid, + NULL, MachineName, NULL); if (hDeviceInfo == INVALID_HANDLE_VALUE) - return INVALID_HANDLE_VALUE; + goto cleanup; list = (struct DeviceInfoSet *)hDeviceInfo; } @@ -1909,62 +1926,60 @@ HDEVINFO WINAPI SetupDiGetClassDevsExW( else pClassGuid = &list->ClassGuid; - if (flags & DIGCF_PROFILE) + if (Flags & DIGCF_PROFILE) FIXME(": flag DIGCF_PROFILE ignored\n"); - if (flags & DIGCF_ALLCLASSES) + if (Flags & DIGCF_ALLCLASSES) { - rc = SETUP_CreateDevList(list, machine, pClassGuid, enumstr); + rc = SETUP_CreateDevList(list, MachineName, pClassGuid, Enumerator); if (rc != ERROR_SUCCESS) { SetLastError(rc); - if (!deviceset) - SetupDiDestroyDeviceInfoList(hDeviceInfo); - return INVALID_HANDLE_VALUE; + goto cleanup; } - return hDeviceInfo; + ret = hDeviceInfo; } - else if (flags & DIGCF_DEVICEINTERFACE) + else if (Flags & DIGCF_DEVICEINTERFACE) { - if (class == NULL) + if (ClassGuid == NULL) { SetLastError(ERROR_INVALID_PARAMETER); - if (!deviceset) - SetupDiDestroyDeviceInfoList(hDeviceInfo); - return INVALID_HANDLE_VALUE; + goto cleanup; } - rc = SETUP_CreateInterfaceList(list, machine, (LPGUID)class, enumstr, flags & DIGCF_PRESENT); + rc = SETUP_CreateInterfaceList(list, MachineName, ClassGuid, Enumerator, Flags & DIGCF_PRESENT); if (rc != ERROR_SUCCESS) { SetLastError(rc); - if (!deviceset) - SetupDiDestroyDeviceInfoList(hDeviceInfo); - return INVALID_HANDLE_VALUE; + goto cleanup; } - return hDeviceInfo; + ret = hDeviceInfo; } else { - rc = SETUP_CreateDevList(list, machine, (LPGUID)class, enumstr); + rc = SETUP_CreateDevList(list, MachineName, ClassGuid, Enumerator); if (rc != ERROR_SUCCESS) { SetLastError(rc); - if (!deviceset) - SetupDiDestroyDeviceInfoList(hDeviceInfo); - return INVALID_HANDLE_VALUE; + goto cleanup; } - return hDeviceInfo; + ret = hDeviceInfo; } + +cleanup: + if (!DeviceInfoSet && hDeviceInfo != INVALID_HANDLE_VALUE && hDeviceInfo != ret) + SetupDiDestroyDeviceInfoList(hDeviceInfo); + return ret; } /*********************************************************************** * SetupDiGetClassImageIndex (SETUPAPI.@) */ -static BOOL GetIconIndex( - IN HKEY hClassKey, - OUT PINT ImageIndex) +static BOOL +GetIconIndex( + IN HKEY hClassKey, + OUT PINT ImageIndex) { LPWSTR Buffer = NULL; DWORD dwRegType, dwLength; @@ -2006,10 +2021,11 @@ cleanup: return ret; } -BOOL WINAPI SetupDiGetClassImageIndex( - IN PSP_CLASSIMAGELIST_DATA ClassImageListData, - IN CONST GUID *ClassGuid, - OUT PINT ImageIndex) +BOOL WINAPI +SetupDiGetClassImageIndex( + IN PSP_CLASSIMAGELIST_DATA ClassImageListData, + IN CONST GUID *ClassGuid, + OUT PINT ImageIndex) { struct ClassImageList *list; BOOL ret = FALSE; @@ -2059,8 +2075,9 @@ cleanup: /*********************************************************************** * SetupDiGetClassImageList(SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassImageList( - OUT PSP_CLASSIMAGELIST_DATA ClassImageListData) +BOOL WINAPI +SetupDiGetClassImageList( + OUT PSP_CLASSIMAGELIST_DATA ClassImageListData) { return SetupDiGetClassImageListExW(ClassImageListData, NULL, NULL); } @@ -2068,10 +2085,11 @@ BOOL WINAPI SetupDiGetClassImageList( /*********************************************************************** * SetupDiGetClassImageListExA(SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassImageListExA( - OUT PSP_CLASSIMAGELIST_DATA ClassImageListData, - IN PCSTR MachineName OPTIONAL, - IN PVOID Reserved) +BOOL WINAPI +SetupDiGetClassImageListExA( + OUT PSP_CLASSIMAGELIST_DATA ClassImageListData, + IN PCSTR MachineName OPTIONAL, + IN PVOID Reserved) { PWSTR MachineNameW = NULL; BOOL ret; @@ -2094,10 +2112,11 @@ BOOL WINAPI SetupDiGetClassImageListExA( /*********************************************************************** * SetupDiGetClassImageListExW(SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassImageListExW( - OUT PSP_CLASSIMAGELIST_DATA ClassImageListData, - IN PCWSTR MachineName OPTIONAL, - IN PVOID Reserved) +BOOL WINAPI +SetupDiGetClassImageListExW( + OUT PSP_CLASSIMAGELIST_DATA ClassImageListData, + IN PCWSTR MachineName OPTIONAL, + IN PVOID Reserved) { BOOL ret = FALSE; @@ -2150,10 +2169,11 @@ cleanup: /*********************************************************************** * SetupDiLoadClassIcon(SETUPAPI.@) */ -BOOL WINAPI SetupDiLoadClassIcon( - IN CONST GUID *ClassGuid, - OUT HICON *LargeIcon OPTIONAL, - OUT PINT MiniIconIndex OPTIONAL) +BOOL WINAPI +SetupDiLoadClassIcon( + IN CONST GUID *ClassGuid, + OUT HICON *LargeIcon OPTIONAL, + OUT PINT MiniIconIndex OPTIONAL) { BOOL ret = FALSE; @@ -2264,12 +2284,13 @@ cleanup: /*********************************************************************** * SetupDiEnumDeviceInterfaces (SETUPAPI.@) */ -BOOL WINAPI SetupDiEnumDeviceInterfaces( - HDEVINFO DeviceInfoSet, - PSP_DEVINFO_DATA DeviceInfoData, - CONST GUID * InterfaceClassGuid, - DWORD MemberIndex, - PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData) +BOOL WINAPI +SetupDiEnumDeviceInterfaces( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN CONST GUID *InterfaceClassGuid, + IN DWORD MemberIndex, + OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData) { BOOL ret = FALSE; @@ -2334,12 +2355,14 @@ BOOL WINAPI SetupDiEnumDeviceInterfaces( return ret; } -static VOID ReferenceInfFile(struct InfFileDetails* infFile) +static VOID +ReferenceInfFile(struct InfFileDetails* infFile) { InterlockedIncrement(&infFile->References); } -static VOID DereferenceInfFile(struct InfFileDetails* infFile) +static VOID +DereferenceInfFile(struct InfFileDetails* infFile) { if (InterlockedDecrement(&infFile->References) == 0) { @@ -2348,7 +2371,8 @@ static VOID DereferenceInfFile(struct InfFileDetails* infFile) } } -static BOOL DestroyDriverInfoElement(struct DriverInfoElement* driverInfo) +static BOOL +DestroyDriverInfoElement(struct DriverInfoElement* driverInfo) { DereferenceInfFile(driverInfo->InfFileDetails); HeapFree(GetProcessHeap(), 0, driverInfo->MatchingId); @@ -2356,13 +2380,14 @@ static BOOL DestroyDriverInfoElement(struct DriverInfoElement* driverInfo) return TRUE; } -static BOOL DestroyClassInstallParams(struct ClassInstallParams* installParams) +static BOOL +DestroyClassInstallParams(struct ClassInstallParams* installParams) { - HeapFree(GetProcessHeap(), 0, installParams->PropChange); - return TRUE; + return HeapFree(GetProcessHeap(), 0, installParams->PropChange); } -static BOOL DestroyDeviceInfoElement(struct DeviceInfoElement* deviceInfo) +static BOOL +DestroyDeviceInfoElement(struct DeviceInfoElement* deviceInfo) { PLIST_ENTRY ListEntry; struct DriverInfoElement *driverInfo; @@ -2383,11 +2408,11 @@ static BOOL DestroyDeviceInfoElement(struct DeviceInfoElement* deviceInfo) return FALSE; } DestroyClassInstallParams(&deviceInfo->ClassInstallParams); - HeapFree(GetProcessHeap(), 0, deviceInfo); - return TRUE; + return HeapFree(GetProcessHeap(), 0, deviceInfo); } -static BOOL DestroyDeviceInfoSet(struct DeviceInfoSet* list) +static BOOL +DestroyDeviceInfoSet(struct DeviceInfoSet* list) { PLIST_ENTRY ListEntry; struct DeviceInfoElement *deviceInfo; @@ -2403,21 +2428,22 @@ static BOOL DestroyDeviceInfoSet(struct DeviceInfoSet* list) RegCloseKey(list->HKLM); CM_Disconnect_Machine(list->hMachine); DestroyClassInstallParams(&list->ClassInstallParams); - HeapFree(GetProcessHeap(), 0, list); - return TRUE; + return HeapFree(GetProcessHeap(), 0, list); } /*********************************************************************** * SetupDiDestroyDeviceInfoList (SETUPAPI.@) */ -BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo) +BOOL WINAPI +SetupDiDestroyDeviceInfoList( + IN HDEVINFO DeviceInfoSet) { BOOL ret = FALSE; - TRACE("%p\n", devinfo); - if (devinfo && devinfo != (HDEVINFO)INVALID_HANDLE_VALUE) + TRACE("%p\n", DeviceInfoSet); + if (DeviceInfoSet && DeviceInfoSet != (HDEVINFO)INVALID_HANDLE_VALUE) { - struct DeviceInfoSet *list = (struct DeviceInfoSet *)devinfo; + struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet; if (list->magic == SETUP_DEV_INFO_SET_MAGIC) ret = DestroyDeviceInfoSet(list); @@ -2434,13 +2460,14 @@ BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo) /*********************************************************************** * SetupDiGetDeviceInterfaceDetailA (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInterfaceDetailA( - HDEVINFO DeviceInfoSet, - PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, - PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData, - DWORD DeviceInterfaceDetailDataSize, - PDWORD RequiredSize, - PSP_DEVINFO_DATA DeviceInfoData) +BOOL WINAPI +SetupDiGetDeviceInterfaceDetailA( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, + OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData OPTIONAL, + IN DWORD DeviceInterfaceDetailDataSize, + OUT PDWORD RequiredSize OPTIONAL, + OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailDataW = NULL; DWORD sizeW = 0, sizeA; @@ -2504,13 +2531,14 @@ BOOL WINAPI SetupDiGetDeviceInterfaceDetailA( /*********************************************************************** * SetupDiGetDeviceInterfaceDetailW (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInterfaceDetailW( - HDEVINFO DeviceInfoSet, - PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, - PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, - DWORD DeviceInterfaceDetailDataSize, - PDWORD RequiredSize, - PSP_DEVINFO_DATA DeviceInfoData) +BOOL WINAPI +SetupDiGetDeviceInterfaceDetailW( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, + OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData OPTIONAL, + IN DWORD DeviceInterfaceDetailDataSize, + OUT PDWORD RequiredSize OPTIONAL, + OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { BOOL ret = FALSE; @@ -2570,31 +2598,40 @@ BOOL WINAPI SetupDiGetDeviceInterfaceDetailW( /*********************************************************************** * SetupDiGetDeviceRegistryPropertyA (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceRegistryPropertyA( - HDEVINFO devinfo, - PSP_DEVINFO_DATA DeviceInfoData, - DWORD Property, - PDWORD PropertyRegDataType, - PBYTE PropertyBuffer, - DWORD PropertyBufferSize, - PDWORD RequiredSize) +BOOL WINAPI +SetupDiGetDeviceRegistryPropertyA( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN DWORD Property, + OUT PDWORD PropertyRegDataType OPTIONAL, + OUT PBYTE PropertyBuffer OPTIONAL, + IN DWORD PropertyBufferSize, + OUT PDWORD RequiredSize OPTIONAL) { BOOL bResult; BOOL bIsStringProperty; DWORD RegType; DWORD RequiredSizeA, RequiredSizeW; - DWORD PropertyBufferSizeW; - PBYTE PropertyBufferW; + DWORD PropertyBufferSizeW = 0; + PBYTE PropertyBufferW = NULL; - TRACE("%p %p %ld %p %p %ld %p\n", devinfo, DeviceInfoData, + TRACE("%p %p %ld %p %p %ld %p\n", DeviceInfoSet, DeviceInfoData, Property, PropertyRegDataType, PropertyBuffer, PropertyBufferSize, RequiredSize); - PropertyBufferSizeW = PropertyBufferSize * 2; - PropertyBufferW = HeapAlloc(GetProcessHeap(), 0, PropertyBufferSizeW); + if (PropertyBufferSize != 0) + { + PropertyBufferSizeW = PropertyBufferSize * 2; + PropertyBufferW = HeapAlloc(GetProcessHeap(), 0, PropertyBufferSizeW); + if (!PropertyBufferW) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + } bResult = SetupDiGetDeviceRegistryPropertyW( - devinfo, + DeviceInfoSet, DeviceInfoData, Property, &RegType, @@ -2648,14 +2685,15 @@ BOOL WINAPI SetupDiGetDeviceRegistryPropertyA( /*********************************************************************** * SetupDiGetDeviceRegistryPropertyW (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceRegistryPropertyW( - HDEVINFO DeviceInfoSet, - PSP_DEVINFO_DATA DeviceInfoData, - DWORD Property, - PDWORD PropertyRegDataType, - PBYTE PropertyBuffer, - DWORD PropertyBufferSize, - PDWORD RequiredSize) +BOOL WINAPI +SetupDiGetDeviceRegistryPropertyW( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN DWORD Property, + OUT PDWORD PropertyRegDataType OPTIONAL, + OUT PBYTE PropertyBuffer OPTIONAL, + IN DWORD PropertyBufferSize, + OUT PDWORD RequiredSize OPTIONAL) { HKEY hEnumKey, hKey; DWORD rc; @@ -2846,12 +2884,13 @@ BOOL WINAPI SetupDiGetDeviceRegistryPropertyW( /*********************************************************************** * SetupDiSetDeviceRegistryPropertyA (SETUPAPI.@) */ -BOOL WINAPI SetupDiSetDeviceRegistryPropertyA( - IN HDEVINFO DeviceInfoSet, - IN OUT PSP_DEVINFO_DATA DeviceInfoData, - IN DWORD Property, - IN CONST BYTE *PropertyBuffer, - IN DWORD PropertyBufferSize) +BOOL WINAPI +SetupDiSetDeviceRegistryPropertyA( + IN HDEVINFO DeviceInfoSet, + IN OUT PSP_DEVINFO_DATA DeviceInfoData, + IN DWORD Property, + IN CONST BYTE *PropertyBuffer OPTIONAL, + IN DWORD PropertyBufferSize) { FIXME("%p %p 0x%lx %p 0x%lx\n", DeviceInfoSet, DeviceInfoData, Property, PropertyBuffer, PropertyBufferSize); @@ -2862,12 +2901,13 @@ BOOL WINAPI SetupDiSetDeviceRegistryPropertyA( /*********************************************************************** * SetupDiSetDeviceRegistryPropertyW (SETUPAPI.@) */ -BOOL WINAPI SetupDiSetDeviceRegistryPropertyW( - IN HDEVINFO DeviceInfoSet, - IN OUT PSP_DEVINFO_DATA DeviceInfoData, - IN DWORD Property, - IN const BYTE *PropertyBuffer, - IN DWORD PropertyBufferSize) +BOOL WINAPI +SetupDiSetDeviceRegistryPropertyW( + IN HDEVINFO DeviceInfoSet, + IN OUT PSP_DEVINFO_DATA DeviceInfoData, + IN DWORD Property, + IN CONST BYTE *PropertyBuffer OPTIONAL, + IN DWORD PropertyBufferSize) { struct DeviceInfoSet *list; BOOL ret = FALSE; @@ -2996,11 +3036,12 @@ BOOL WINAPI SetupDiSetDeviceRegistryPropertyW( /*********************************************************************** * SetupDiInstallClassA (SETUPAPI.@) */ -BOOL WINAPI SetupDiInstallClassA( - IN HWND hwndParent OPTIONAL, - IN PCSTR InfFileName, - IN DWORD Flags, - IN HSPFILEQ FileQueue OPTIONAL) +BOOL WINAPI +SetupDiInstallClassA( + IN HWND hwndParent OPTIONAL, + IN PCSTR InfFileName, + IN DWORD Flags, + IN HSPFILEQ FileQueue OPTIONAL) { return SetupDiInstallClassExA(hwndParent, InfFileName, Flags, FileQueue, NULL, NULL, NULL); } @@ -3009,11 +3050,12 @@ BOOL WINAPI SetupDiInstallClassA( /*********************************************************************** * SetupDiInstallClassW (SETUPAPI.@) */ -BOOL WINAPI SetupDiInstallClassW( - IN HWND hwndParent OPTIONAL, - IN PCWSTR InfFileName, - IN DWORD Flags, - IN HSPFILEQ FileQueue OPTIONAL) +BOOL WINAPI +SetupDiInstallClassW( + IN HWND hwndParent OPTIONAL, + IN PCWSTR InfFileName, + IN DWORD Flags, + IN HSPFILEQ FileQueue OPTIONAL) { return SetupDiInstallClassExW(hwndParent, InfFileName, Flags, FileQueue, NULL, NULL, NULL); } @@ -3022,14 +3064,15 @@ BOOL WINAPI SetupDiInstallClassW( /*********************************************************************** * SetupDiInstallClassExA (SETUPAPI.@) */ -BOOL WINAPI SetupDiInstallClassExA( - IN HWND hwndParent OPTIONAL, - IN PCSTR InfFileName OPTIONAL, - IN DWORD Flags, - IN HSPFILEQ FileQueue OPTIONAL, - IN const GUID* InterfaceClassGuid OPTIONAL, - IN PVOID Reserved1, - IN PVOID Reserved2) +BOOL WINAPI +SetupDiInstallClassExA( + IN HWND hwndParent OPTIONAL, + IN PCSTR InfFileName OPTIONAL, + IN DWORD Flags, + IN HSPFILEQ FileQueue OPTIONAL, + IN CONST GUID *InterfaceClassGuid OPTIONAL, + IN PVOID Reserved1, + IN PVOID Reserved2) { PWSTR InfFileNameW = NULL; BOOL Result; @@ -3053,82 +3096,89 @@ BOOL WINAPI SetupDiInstallClassExA( } -static HKEY CreateClassKey(HINF hInf) +static HKEY +CreateClassKey(HINF hInf) { WCHAR FullBuffer[MAX_PATH]; WCHAR Buffer[MAX_PATH]; DWORD RequiredSize; - HKEY hClassKey; + HKEY hClassKey = NULL; + HKEY ret = INVALID_HANDLE_VALUE; + FullBuffer[0] = '\0'; Buffer[0] = '\\'; if (!SetupGetLineTextW(NULL, - hInf, - Version, - ClassGUID, - &Buffer[1], - MAX_PATH - 1, - &RequiredSize)) + hInf, + Version, + ClassGUID, + &Buffer[1], + MAX_PATH - 1, + &RequiredSize)) { - return INVALID_HANDLE_VALUE; + goto cleanup; } lstrcpyW(FullBuffer, REGSTR_PATH_CLASS_NT); lstrcatW(FullBuffer, Buffer); - if (!SetupGetLineTextW(NULL, - hInf, - Version, - Class, - Buffer, - MAX_PATH, - &RequiredSize)) + hInf, + Version, + Class, + Buffer, + MAX_PATH, + &RequiredSize)) { RegDeleteKeyW(HKEY_LOCAL_MACHINE, FullBuffer); - return INVALID_HANDLE_VALUE; + goto cleanup; } if (ERROR_SUCCESS != RegCreateKeyExW(HKEY_LOCAL_MACHINE, - FullBuffer, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_SET_VALUE, - NULL, - &hClassKey, - NULL)) + FullBuffer, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_SET_VALUE, + NULL, + &hClassKey, + NULL)) { - RegDeleteKeyW(HKEY_LOCAL_MACHINE, FullBuffer); - return INVALID_HANDLE_VALUE; + goto cleanup; } if (ERROR_SUCCESS != RegSetValueExW(hClassKey, - Class, - 0, - REG_SZ, - (LPBYTE)Buffer, - RequiredSize * sizeof(WCHAR))) + Class, + 0, + REG_SZ, + (LPBYTE)Buffer, + RequiredSize * sizeof(WCHAR))) { - RegCloseKey(hClassKey); - RegDeleteKeyW(HKEY_LOCAL_MACHINE, FullBuffer); - return INVALID_HANDLE_VALUE; + goto cleanup; } - return hClassKey; + ret = hClassKey; + +cleanup: + if (hClassKey != NULL && hClassKey != ret) + RegCloseKey(hClassKey); + if (ret == INVALID_HANDLE_VALUE && FullBuffer[0] != '\0') + RegDeleteKeyW(HKEY_LOCAL_MACHINE, FullBuffer); + return ret; } /*********************************************************************** * SetupDiInstallClassExW (SETUPAPI.@) */ -BOOL WINAPI SetupDiInstallClassExW( - IN HWND hwndParent OPTIONAL, - IN PCWSTR InfFileName OPTIONAL, - IN DWORD Flags, - IN HSPFILEQ FileQueue OPTIONAL, - IN const GUID* InterfaceClassGuid OPTIONAL, - IN PVOID Reserved1, - IN PVOID Reserved2) +BOOL WINAPI +SetupDiInstallClassExW( + IN HWND hwndParent OPTIONAL, + IN PCWSTR InfFileName OPTIONAL, + IN DWORD Flags, + IN HSPFILEQ FileQueue OPTIONAL, + IN CONST GUID *InterfaceClassGuid OPTIONAL, + IN PVOID Reserved1, + IN PVOID Reserved2) { BOOL ret = FALSE; @@ -3237,7 +3287,7 @@ BOOL WINAPI SetupDiInstallClassExW( SectionName, SPINST_REGISTRY | SPINST_FILES | SPINST_BITREG | SPINST_INIFILES | SPINST_INI2REG, hRootKey, - NULL, /* SourceRootPath */ + NULL, /* FIXME: SourceRootPath */ !(Flags & DI_NOVCP) && (Flags & DI_FORCECOPY) ? SP_COPY_FORCE_IN_USE : 0, /* CopyFlags */ SetupDefaultQueueCallbackW, callback_context, @@ -3280,9 +3330,10 @@ cleanup: /*********************************************************************** * SetupDiOpenClassRegKey (SETUPAPI.@) */ -HKEY WINAPI SetupDiOpenClassRegKey( - const GUID* ClassGuid, - REGSAM samDesired) +HKEY WINAPI +SetupDiOpenClassRegKey( + IN CONST GUID *ClassGuid OPTIONAL, + IN REGSAM samDesired) { return SetupDiOpenClassRegKeyExW(ClassGuid, samDesired, DIOCR_INSTALLER, NULL, NULL); @@ -3292,12 +3343,13 @@ HKEY WINAPI SetupDiOpenClassRegKey( /*********************************************************************** * SetupDiOpenClassRegKeyExA (SETUPAPI.@) */ -HKEY WINAPI SetupDiOpenClassRegKeyExA( - const GUID* ClassGuid OPTIONAL, - REGSAM samDesired, - DWORD Flags, - PCSTR MachineName OPTIONAL, - PVOID Reserved) +HKEY WINAPI +SetupDiOpenClassRegKeyExA( + IN CONST GUID *ClassGuid OPTIONAL, + IN REGSAM samDesired, + IN DWORD Flags, + IN PCSTR MachineName OPTIONAL, + IN PVOID Reserved) { PWSTR MachineNameW = NULL; HKEY hKey; @@ -3324,12 +3376,13 @@ HKEY WINAPI SetupDiOpenClassRegKeyExA( /*********************************************************************** * SetupDiOpenClassRegKeyExW (SETUPAPI.@) */ -HKEY WINAPI SetupDiOpenClassRegKeyExW( - const GUID* ClassGuid OPTIONAL, - REGSAM samDesired, - DWORD Flags, - PCWSTR MachineName OPTIONAL, - PVOID Reserved) +HKEY WINAPI +SetupDiOpenClassRegKeyExW( + IN CONST GUID* ClassGuid OPTIONAL, + IN REGSAM samDesired, + IN DWORD Flags, + IN PCWSTR MachineName OPTIONAL, + IN PVOID Reserved) { LPWSTR lpGuidString = NULL; LPWSTR lpFullGuidString = NULL; @@ -3418,13 +3471,12 @@ HKEY WINAPI SetupDiOpenClassRegKeyExW( cleanup: if (hClassKey != NULL && hClassKey != ret) - RegCloseKey(hClassesKey); + RegCloseKey(hClassKey); if (hClassesKey != NULL && hClassesKey != ret) RegCloseKey(hClassesKey); if (lpGuidString) RpcStringFreeW(&lpGuidString); - if (lpFullGuidString) - HeapFree(GetProcessHeap(), 0, lpFullGuidString); + HeapFree(GetProcessHeap(), 0, lpFullGuidString); return ret; } @@ -3432,11 +3484,12 @@ cleanup: /*********************************************************************** * SetupDiOpenDeviceInterfaceW (SETUPAPI.@) */ -BOOL WINAPI SetupDiOpenDeviceInterfaceW( - HDEVINFO DeviceInfoSet, - PCWSTR DevicePath, - DWORD OpenFlags, - PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData) +BOOL WINAPI +SetupDiOpenDeviceInterfaceW( + IN HDEVINFO DeviceInfoSet, + IN PCWSTR DevicePath, + IN DWORD OpenFlags, + OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL) { FIXME("%p %s %08lx %p\n", DeviceInfoSet, debugstr_w(DevicePath), OpenFlags, DeviceInterfaceData); @@ -3446,11 +3499,12 @@ BOOL WINAPI SetupDiOpenDeviceInterfaceW( /*********************************************************************** * SetupDiOpenDeviceInterfaceA (SETUPAPI.@) */ -BOOL WINAPI SetupDiOpenDeviceInterfaceA( - HDEVINFO DeviceInfoSet, - PCSTR DevicePath, - DWORD OpenFlags, - PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData) +BOOL WINAPI +SetupDiOpenDeviceInterfaceA( + IN HDEVINFO DeviceInfoSet, + IN PCSTR DevicePath, + IN DWORD OpenFlags, + OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL) { LPWSTR DevicePathW = NULL; BOOL bResult; @@ -3472,11 +3526,12 @@ BOOL WINAPI SetupDiOpenDeviceInterfaceA( /*********************************************************************** * SetupDiSetClassInstallParamsA (SETUPAPI.@) */ -BOOL WINAPI SetupDiSetClassInstallParamsA( - HDEVINFO DeviceInfoSet, - PSP_DEVINFO_DATA DeviceInfoData, - PSP_CLASSINSTALL_HEADER ClassInstallParams, - DWORD ClassInstallParamsSize) +BOOL WINAPI +SetupDiSetClassInstallParamsA( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL, + IN DWORD ClassInstallParamsSize) { FIXME("%p %p %x %lu\n",DeviceInfoSet, DeviceInfoData, ClassInstallParams->InstallFunction, ClassInstallParamsSize); @@ -3486,11 +3541,12 @@ BOOL WINAPI SetupDiSetClassInstallParamsA( /*********************************************************************** * SetupDiSetClassInstallParamsW (SETUPAPI.@) */ -BOOL WINAPI SetupDiSetClassInstallParamsW( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, - IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL, - IN DWORD ClassInstallParamsSize) +BOOL WINAPI +SetupDiSetClassInstallParamsW( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL, + IN DWORD ClassInstallParamsSize) { struct DeviceInfoSet *list; BOOL ret = FALSE; @@ -3555,11 +3611,12 @@ done: return ret; } -static BOOL PropertyChangeHandler( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL, - IN DWORD ClassInstallParamsSize) +static BOOL +PropertyChangeHandler( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL, + IN DWORD ClassInstallParamsSize) { PSP_PROPCHANGE_PARAMS PropChangeParams = (PSP_PROPCHANGE_PARAMS)ClassInstallParams; BOOL ret = FALSE; @@ -3616,9 +3673,9 @@ done: static DWORD GetFunctionPointer( - IN PWSTR InstallerName, - OUT HMODULE* ModulePointer, - OUT PVOID* FunctionPointer) + IN PWSTR InstallerName, + OUT HMODULE* ModulePointer, + OUT PVOID* FunctionPointer) { HMODULE hModule = NULL; LPSTR FunctionNameA = NULL; @@ -3677,8 +3734,8 @@ cleanup: static DWORD FreeFunctionPointer( - IN HMODULE ModulePointer, - IN PVOID FunctionPointer) + IN HMODULE ModulePointer, + IN PVOID FunctionPointer) { if (ModulePointer == NULL) return ERROR_SUCCESS; @@ -3699,10 +3756,11 @@ IntSetupDiRegisterDeviceInfo( /*********************************************************************** * SetupDiCallClassInstaller (SETUPAPI.@) */ -BOOL WINAPI SetupDiCallClassInstaller( - IN DI_FUNCTION InstallFunction, - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) +BOOL WINAPI +SetupDiCallClassInstaller( + IN DI_FUNCTION InstallFunction, + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { BOOL ret = FALSE; @@ -4035,12 +4093,12 @@ BOOL WINAPI SetupDiCallClassInstaller( while (!IsListEmpty(&ClassCoInstallersListHead)) { ListEntry = RemoveHeadList(&ClassCoInstallersListHead); - HeapFree(GetProcessHeap(), 0, ListEntry); + HeapFree(GetProcessHeap(), 0, CONTAINING_RECORD(ListEntry, struct CoInstallerElement, ListEntry)); } while (!IsListEmpty(&DeviceCoInstallersListHead)) { ListEntry = RemoveHeadList(&DeviceCoInstallersListHead); - HeapFree(GetProcessHeap(), 0, ListEntry); + HeapFree(GetProcessHeap(), 0, CONTAINING_RECORD(ListEntry, struct CoInstallerElement, ListEntry)); } ret = (rc == NO_ERROR); @@ -4054,9 +4112,10 @@ BOOL WINAPI SetupDiCallClassInstaller( /*********************************************************************** * SetupDiGetDeviceInfoListClass (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInfoListClass( - IN HDEVINFO DeviceInfoSet, - OUT LPGUID ClassGuid) +BOOL WINAPI +SetupDiGetDeviceInfoListClass( + IN HDEVINFO DeviceInfoSet, + OUT LPGUID ClassGuid) { struct DeviceInfoSet *list; BOOL ret = FALSE; @@ -4083,9 +4142,10 @@ BOOL WINAPI SetupDiGetDeviceInfoListClass( /*********************************************************************** * SetupDiGetDeviceInfoListDetailW (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInfoListDetailW( - IN HDEVINFO DeviceInfoSet, - OUT PSP_DEVINFO_LIST_DETAIL_DATA_W DeviceInfoListDetailData) +BOOL WINAPI +SetupDiGetDeviceInfoListDetailW( + IN HDEVINFO DeviceInfoSet, + OUT PSP_DEVINFO_LIST_DETAIL_DATA_W DeviceInfoListDetailData) { struct DeviceInfoSet *list; BOOL ret = FALSE; @@ -4122,10 +4182,11 @@ BOOL WINAPI SetupDiGetDeviceInfoListDetailW( /*********************************************************************** * SetupDiGetDeviceInstallParamsA (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInstallParamsA( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, - OUT PSP_DEVINSTALL_PARAMS_A DeviceInstallParams) +BOOL WINAPI +SetupDiGetDeviceInstallParamsA( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + OUT PSP_DEVINSTALL_PARAMS_A DeviceInstallParams) { SP_DEVINSTALL_PARAMS_W deviceInstallParamsW; BOOL ret = FALSE; @@ -4164,10 +4225,11 @@ BOOL WINAPI SetupDiGetDeviceInstallParamsA( /*********************************************************************** * SetupDiGetDeviceInstallParamsW (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInstallParamsW( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, - OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams) +BOOL WINAPI +SetupDiGetDeviceInstallParamsW( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams) { struct DeviceInfoSet *list; BOOL ret = FALSE; @@ -4202,7 +4264,7 @@ BOOL WINAPI SetupDiGetDeviceInstallParamsW( static BOOL CheckDeviceInstallParameters( - IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams) + IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams) { DWORD SupportedFlags = DI_NOVCP | /* 0x00000008 */ @@ -4257,10 +4319,11 @@ CheckDeviceInstallParameters( /*********************************************************************** * SetupDiSetDeviceInstallParamsW (SETUPAPI.@) */ -BOOL WINAPI SetupDiSetDeviceInstallParamsW( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams) +BOOL WINAPI +SetupDiSetDeviceInstallParamsW( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams) { struct DeviceInfoSet *list; BOOL ret = FALSE; @@ -4296,12 +4359,13 @@ BOOL WINAPI SetupDiSetDeviceInstallParamsW( /*********************************************************************** * SetupDiGetDeviceInstanceIdA(SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInstanceIdA( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - OUT PSTR DeviceInstanceId OPTIONAL, - IN DWORD DeviceInstanceIdSize, - OUT PDWORD RequiredSize OPTIONAL) +BOOL WINAPI +SetupDiGetDeviceInstanceIdA( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + OUT PSTR DeviceInstanceId OPTIONAL, + IN DWORD DeviceInstanceIdSize, + OUT PDWORD RequiredSize OPTIONAL) { PWSTR DeviceInstanceIdW = NULL; BOOL ret = FALSE; @@ -4342,12 +4406,13 @@ BOOL WINAPI SetupDiGetDeviceInstanceIdA( /*********************************************************************** * SetupDiGetDeviceInstanceIdW(SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInstanceIdW( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - OUT PWSTR DeviceInstanceId OPTIONAL, - IN DWORD DeviceInstanceIdSize, - OUT PDWORD RequiredSize OPTIONAL) +BOOL WINAPI +SetupDiGetDeviceInstanceIdW( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + OUT PWSTR DeviceInstanceId OPTIONAL, + IN DWORD DeviceInstanceIdSize, + OUT PDWORD RequiredSize OPTIONAL) { BOOL ret = FALSE; @@ -4391,13 +4456,14 @@ BOOL WINAPI SetupDiGetDeviceInstanceIdW( /*********************************************************************** * SetupDiGetClassDevPropertySheetsA(SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDevPropertySheetsA( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, - IN LPPROPSHEETHEADERA PropertySheetHeader, - IN DWORD PropertySheetHeaderPageListSize, - OUT PDWORD RequiredSize OPTIONAL, - IN DWORD PropertySheetType) +BOOL WINAPI +SetupDiGetClassDevPropertySheetsA( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN LPPROPSHEETHEADERA PropertySheetHeader, + IN DWORD PropertySheetHeaderPageListSize, + OUT PDWORD RequiredSize OPTIONAL, + IN DWORD PropertySheetType) { PROPSHEETHEADERW psh; BOOL ret = FALSE; @@ -4429,9 +4495,10 @@ struct ClassDevPropertySheetsData DWORD NumberOfPages; }; -static BOOL WINAPI GetClassDevPropertySheetsCallback( - IN HPROPSHEETPAGE hPropSheetPage, - IN OUT LPARAM lParam) +static BOOL WINAPI +GetClassDevPropertySheetsCallback( + IN HPROPSHEETPAGE hPropSheetPage, + IN OUT LPARAM lParam) { struct ClassDevPropertySheetsData *PropPageData; @@ -4450,13 +4517,14 @@ static BOOL WINAPI GetClassDevPropertySheetsCallback( /*********************************************************************** * SetupDiGetClassDevPropertySheetsW(SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDevPropertySheetsW( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, - IN OUT LPPROPSHEETHEADERW PropertySheetHeader, - IN DWORD PropertySheetHeaderPageListSize, - OUT PDWORD RequiredSize OPTIONAL, - IN DWORD PropertySheetType) +BOOL WINAPI +SetupDiGetClassDevPropertySheetsW( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN OUT LPPROPSHEETHEADERW PropertySheetHeader, + IN DWORD PropertySheetHeaderPageListSize, + OUT PDWORD RequiredSize OPTIONAL, + IN DWORD PropertySheetType) { struct DeviceInfoSet *list; BOOL ret = FALSE; @@ -4581,14 +4649,15 @@ cleanup: /*********************************************************************** * SetupDiCreateDevRegKeyA (SETUPAPI.@) */ -HKEY WINAPI SetupDiCreateDevRegKeyA( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN DWORD Scope, - IN DWORD HwProfile, - IN DWORD KeyType, - IN HINF InfHandle OPTIONAL, - IN PCSTR InfSectionName OPTIONAL) +HKEY WINAPI +SetupDiCreateDevRegKeyA( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN DWORD Scope, + IN DWORD HwProfile, + IN DWORD KeyType, + IN HINF InfHandle OPTIONAL, + IN PCSTR InfSectionName OPTIONAL) { PCWSTR InfSectionNameW = NULL; HKEY ret = INVALID_HANDLE_VALUE; @@ -4615,12 +4684,12 @@ HKEY WINAPI SetupDiCreateDevRegKeyA( static HKEY OpenHardwareProfileKey( - IN HKEY HKLM, - IN DWORD HwProfile, - IN DWORD samDesired) + IN HKEY HKLM, + IN DWORD HwProfile, + IN DWORD samDesired) { - HKEY hHWProfilesKey = INVALID_HANDLE_VALUE; - HKEY hHWProfileKey = INVALID_HANDLE_VALUE; + HKEY hHWProfilesKey = NULL; + HKEY hHWProfileKey = NULL; HKEY ret = INVALID_HANDLE_VALUE; LONG rc; @@ -4663,9 +4732,9 @@ OpenHardwareProfileKey( ret = hHWProfileKey; cleanup: - if (hHWProfilesKey != INVALID_HANDLE_VALUE) + if (hHWProfilesKey != NULL) RegCloseKey(hHWProfilesKey); - if (hHWProfileKey != INVALID_HANDLE_VALUE && hHWProfileKey != ret) + if (hHWProfileKey != NULL && hHWProfileKey != ret) RegCloseKey(hHWProfileKey); return ret; } @@ -4673,14 +4742,15 @@ cleanup: /*********************************************************************** * SetupDiCreateDevRegKeyW (SETUPAPI.@) */ -HKEY WINAPI SetupDiCreateDevRegKeyW( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN DWORD Scope, - IN DWORD HwProfile, - IN DWORD KeyType, - IN HINF InfHandle OPTIONAL, - IN PCWSTR InfSectionName OPTIONAL) +HKEY WINAPI +SetupDiCreateDevRegKeyW( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN DWORD Scope, + IN DWORD HwProfile, + IN DWORD KeyType, + IN HINF InfHandle OPTIONAL, + IN PCWSTR InfSectionName OPTIONAL) { struct DeviceInfoSet *list; HKEY ret = INVALID_HANDLE_VALUE; @@ -4712,10 +4782,10 @@ HKEY WINAPI SetupDiCreateDevRegKeyW( DWORD Index; /* Index used in the DriverKey name */ DWORD rc; HKEY hHWProfileKey = INVALID_HANDLE_VALUE; - HKEY hEnumKey = INVALID_HANDLE_VALUE; - HKEY hClassKey = INVALID_HANDLE_VALUE; + HKEY hEnumKey = NULL; + HKEY hClassKey = NULL; HKEY hDeviceKey = INVALID_HANDLE_VALUE; - HKEY hKey = INVALID_HANDLE_VALUE; + HKEY hKey = NULL; HKEY RootKey; if (Scope == DICS_FLAG_GLOBAL) @@ -4820,7 +4890,7 @@ HKEY WINAPI SetupDiCreateDevRegKeyW( if (Disposition == REG_CREATED_NEW_KEY) break; RegCloseKey(hKey); - hKey = INVALID_HANDLE_VALUE; + hKey = NULL; Index++; } if (Index > 9999) @@ -4856,13 +4926,13 @@ cleanup: HeapFree(GetProcessHeap(), 0, DriverKey); if (hHWProfileKey != INVALID_HANDLE_VALUE) RegCloseKey(hHWProfileKey); - if (hEnumKey != INVALID_HANDLE_VALUE) + if (hEnumKey != NULL) RegCloseKey(hEnumKey); - if (hClassKey != INVALID_HANDLE_VALUE) + if (hClassKey != NULL) RegCloseKey(hClassKey); if (hDeviceKey != INVALID_HANDLE_VALUE) RegCloseKey(hDeviceKey); - if (hKey != INVALID_HANDLE_VALUE && hKey != ret) + if (hKey != NULL && hKey != ret) RegCloseKey(hKey); } @@ -4873,13 +4943,14 @@ cleanup: /*********************************************************************** * SetupDiOpenDevRegKey (SETUPAPI.@) */ -HKEY WINAPI SetupDiOpenDevRegKey( - HDEVINFO DeviceInfoSet, - PSP_DEVINFO_DATA DeviceInfoData, - DWORD Scope, - DWORD HwProfile, - DWORD KeyType, - REGSAM samDesired) +HKEY WINAPI +SetupDiOpenDevRegKey( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN DWORD Scope, + IN DWORD HwProfile, + IN DWORD KeyType, + IN REGSAM samDesired) { struct DeviceInfoSet *list; HKEY ret = INVALID_HANDLE_VALUE; @@ -4907,8 +4978,8 @@ HKEY WINAPI SetupDiOpenDevRegKey( DWORD dwRegType; DWORD rc; HKEY hHWProfileKey = INVALID_HANDLE_VALUE; - HKEY hEnumKey = INVALID_HANDLE_VALUE; - HKEY hKey = INVALID_HANDLE_VALUE; + HKEY hEnumKey = NULL; + HKEY hKey = NULL; HKEY RootKey; if (Scope == DICS_FLAG_GLOBAL) @@ -4939,7 +5010,7 @@ HKEY WINAPI SetupDiOpenDevRegKey( KeyType == DIREG_DEV ? samDesired : KEY_QUERY_VALUE, &hKey); RegCloseKey(hEnumKey); - hEnumKey = INVALID_HANDLE_VALUE; + hEnumKey = NULL; if (rc != ERROR_SUCCESS) { SetLastError(rc); @@ -4976,7 +5047,7 @@ HKEY WINAPI SetupDiOpenDevRegKey( goto cleanup; } RegCloseKey(hKey); - hKey = INVALID_HANDLE_VALUE; + hKey = NULL; /* Need to open the driver key */ rc = RegOpenKeyExW( RootKey, @@ -5005,9 +5076,9 @@ HKEY WINAPI SetupDiOpenDevRegKey( cleanup: if (hHWProfileKey != INVALID_HANDLE_VALUE) RegCloseKey(hHWProfileKey); - if (hEnumKey != INVALID_HANDLE_VALUE) + if (hEnumKey != NULL) RegCloseKey(hEnumKey); - if (hKey != INVALID_HANDLE_VALUE && hKey != ret) + if (hKey != NULL && hKey != ret) RegCloseKey(hKey); } @@ -5018,14 +5089,15 @@ cleanup: /*********************************************************************** * SetupDiCreateDeviceInfoA (SETUPAPI.@) */ -BOOL WINAPI SetupDiCreateDeviceInfoA( - HDEVINFO DeviceInfoSet, - PCSTR DeviceName, - CONST GUID *ClassGuid, - PCSTR DeviceDescription, - HWND hwndParent, - DWORD CreationFlags, - PSP_DEVINFO_DATA DeviceInfoData) +BOOL WINAPI +SetupDiCreateDeviceInfoA( + IN HDEVINFO DeviceInfoSet, + IN PCSTR DeviceName, + IN CONST GUID *ClassGuid, + IN PCSTR DeviceDescription OPTIONAL, + IN HWND hwndParent OPTIONAL, + IN DWORD CreationFlags, + OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { LPWSTR DeviceNameW = NULL; LPWSTR DeviceDescriptionW = NULL; @@ -5062,14 +5134,15 @@ BOOL WINAPI SetupDiCreateDeviceInfoA( /*********************************************************************** * SetupDiCreateDeviceInfoW (SETUPAPI.@) */ -BOOL WINAPI SetupDiCreateDeviceInfoW( - HDEVINFO DeviceInfoSet, - PCWSTR DeviceName, - CONST GUID *ClassGuid, - PCWSTR DeviceDescription, - HWND hwndParent, - DWORD CreationFlags, - PSP_DEVINFO_DATA DeviceInfoData) +BOOL WINAPI +SetupDiCreateDeviceInfoW( + IN HDEVINFO DeviceInfoSet, + IN PCWSTR DeviceName, + IN CONST GUID *ClassGuid, + IN PCWSTR DeviceDescription OPTIONAL, + IN HWND hwndParent OPTIONAL, + IN DWORD CreationFlags, + OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { struct DeviceInfoSet *list; BOOL ret = FALSE; @@ -5566,13 +5639,56 @@ done: return Result; } +static struct InfFileDetails * +CreateInfFileDetails( + IN LPCWSTR InfFileName) +{ + struct InfFileDetails *details; + PWCHAR last; + DWORD Needed; + + last = strrchrW(InfFileName, '\\'); + Needed = FIELD_OFFSET(struct InfFileDetails, szData) + + strlenW(InfFileName) * sizeof(WCHAR) + sizeof(UNICODE_NULL); + if (last != NULL) + Needed += (last - InfFileName) * sizeof(WCHAR) + sizeof(UNICODE_NULL); + + details = HeapAlloc(GetProcessHeap(), 0, Needed); + if (!details) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return NULL; + } + + memset(details, 0, Needed); + if (last) + { + details->DirectoryName = details->szData; + details->FullInfFileName = &details->szData[last - InfFileName + 1]; + strncpyW(details->DirectoryName, InfFileName, last - InfFileName); + } + else + details->FullInfFileName = details->szData; + strcpyW(details->FullInfFileName, InfFileName); + ReferenceInfFile(details); + details->hInf = SetupOpenInfFileW(InfFileName, NULL, INF_STYLE_WIN4, NULL); + if (details->hInf == INVALID_HANDLE_VALUE) + { + HeapFree(GetProcessHeap(), 0, details); + return NULL; + } + DPRINT1("FullInfFileName %S\n", details->FullInfFileName); + DPRINT1("DirectoryName %S\n", details->DirectoryName); + return details; +} + /*********************************************************************** * SetupDiBuildDriverInfoList (SETUPAPI.@) */ BOOL WINAPI SetupDiBuildDriverInfoList( IN HDEVINFO DeviceInfoSet, - IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType) { struct DeviceInfoSet *list; @@ -5730,23 +5846,9 @@ SetupDiBuildDriverInfoList( strcpyW(pFullFilename, filename); TRACE("Opening file %s\n", debugstr_w(FullInfFileName)); - currentInfFileDetails = HeapAlloc( - GetProcessHeap(), - 0, - FIELD_OFFSET(struct InfFileDetails, FullInfFileName) + strlenW(FullInfFileName) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + currentInfFileDetails = CreateInfFileDetails(FullInfFileName); if (!currentInfFileDetails) continue; - memset(currentInfFileDetails, 0, sizeof(struct InfFileDetails)); - strcpyW(currentInfFileDetails->FullInfFileName, FullInfFileName); - - currentInfFileDetails->hInf = SetupOpenInfFileW(FullInfFileName, NULL, INF_STYLE_WIN4, NULL); - ReferenceInfFile(currentInfFileDetails); - if (currentInfFileDetails->hInf == INVALID_HANDLE_VALUE) - { - HeapFree(GetProcessHeap(), 0, currentInfFileDetails); - currentInfFileDetails = NULL; - continue; - } if (!GetVersionInformationFromInfFile( currentInfFileDetails->hInf, @@ -5755,8 +5857,7 @@ SetupDiBuildDriverInfoList( &DriverDate, &DriverVersion)) { - SetupCloseInfFile(currentInfFileDetails->hInf); - HeapFree(GetProcessHeap(), 0, currentInfFileDetails->hInf); + DereferenceInfFile(currentInfFileDetails); currentInfFileDetails = NULL; continue; } @@ -5995,7 +6096,7 @@ SetupDiDeleteDeviceInfo( BOOL WINAPI SetupDiDestroyDriverInfoList( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType) { struct DeviceInfoSet *list; @@ -6082,7 +6183,7 @@ SetupDiOpenDeviceInfoA( IN PCSTR DeviceInstanceId, IN HWND hwndParent OPTIONAL, IN DWORD OpenFlags, - OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) + OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { LPWSTR DeviceInstanceIdW = NULL; BOOL bResult; @@ -6111,10 +6212,10 @@ SetupDiOpenDeviceInfoW( IN PCWSTR DeviceInstanceId, IN HWND hwndParent OPTIONAL, IN DWORD OpenFlags, - OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) + OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { struct DeviceInfoSet *list; - HKEY hEnumKey, hKey; + HKEY hEnumKey, hKey = NULL; DWORD rc; BOOL ret = FALSE; @@ -6172,7 +6273,7 @@ SetupDiOpenDeviceInfoW( if (rc != ERROR_SUCCESS) { SetLastError(rc); - return FALSE; + goto cleanup; } rc = RegOpenKeyExW( hEnumKey, @@ -6186,20 +6287,16 @@ SetupDiOpenDeviceInfoW( if (rc == ERROR_FILE_NOT_FOUND) rc = ERROR_NO_SUCH_DEVINST; SetLastError(rc); - return FALSE; + goto cleanup; } /* FIXME: try to get ClassGUID from registry, instead of * sending GUID_NULL to CreateDeviceInfoElement */ if (!CreateDeviceInfoElement(list, DeviceInstanceId, &GUID_NULL, &deviceInfo)) - { - RegCloseKey(hKey); - return FALSE; - } + goto cleanup; InsertTailList(&list->ListHead, &deviceInfo->ListEntry); - RegCloseKey(hKey); ret = TRUE; } @@ -6211,6 +6308,9 @@ SetupDiOpenDeviceInfoW( } } +cleanup: + if (hKey != NULL) + RegCloseKey(hKey); return ret; } @@ -6221,7 +6321,7 @@ SetupDiOpenDeviceInfoW( BOOL WINAPI SetupDiEnumDriverInfoA( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType, IN DWORD MemberIndex, OUT PSP_DRVINFO_DATA_A DriverInfoData) @@ -6285,7 +6385,7 @@ SetupDiEnumDriverInfoA( BOOL WINAPI SetupDiEnumDriverInfoW( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType, IN DWORD MemberIndex, OUT PSP_DRVINFO_DATA_W DriverInfoData) @@ -6389,7 +6489,7 @@ SetupDiGetSelectedDevice( BOOL WINAPI SetupDiGetSelectedDriverA( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, OUT PSP_DRVINFO_DATA_A DriverInfoData) { SP_DRVINFO_DATA_V2_W driverInfoData2W; @@ -6449,7 +6549,7 @@ SetupDiGetSelectedDriverA( BOOL WINAPI SetupDiGetSelectedDriverW( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, OUT PSP_DRVINFO_DATA_W DriverInfoData) { BOOL ret = FALSE; @@ -6533,8 +6633,8 @@ SetupDiSetSelectedDevice( BOOL WINAPI SetupDiSetSelectedDriverA( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, - IN OUT PSP_DRVINFO_DATA_A DriverInfoData OPTIONAL) + IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN OUT PSP_DRVINFO_DATA_A DriverInfoData OPTIONAL) { SP_DRVINFO_DATA_V1_W DriverInfoDataW; PSP_DRVINFO_DATA_W pDriverInfoDataW = NULL; @@ -6596,8 +6696,8 @@ SetupDiSetSelectedDriverA( BOOL WINAPI SetupDiSetSelectedDriverW( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, - IN OUT PSP_DRVINFO_DATA_W DriverInfoData OPTIONAL) + IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN OUT PSP_DRVINFO_DATA_W DriverInfoData OPTIONAL) { BOOL ret = FALSE; @@ -6683,11 +6783,11 @@ SetupDiSetSelectedDriverW( BOOL WINAPI SetupDiGetDriverInfoDetailA( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN PSP_DRVINFO_DATA_A DriverInfoData, - OUT PSP_DRVINFO_DETAIL_DATA_A DriverInfoDetailData OPTIONAL, + IN OUT PSP_DRVINFO_DETAIL_DATA_A DriverInfoDetailData OPTIONAL, IN DWORD DriverInfoDetailDataSize, - OUT PDWORD RequiredSize OPTIONAL) + OUT PDWORD RequiredSize OPTIONAL) { SP_DRVINFO_DATA_V2_W DriverInfoDataW; PSP_DRVINFO_DETAIL_DATA_W DriverInfoDetailDataW = NULL; @@ -6884,11 +6984,11 @@ Cleanup: BOOL WINAPI SetupDiGetDriverInfoDetailW( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN PSP_DRVINFO_DATA_W DriverInfoData, - OUT PSP_DRVINFO_DETAIL_DATA_W DriverInfoDetailData OPTIONAL, + IN OUT PSP_DRVINFO_DETAIL_DATA_W DriverInfoDetailData OPTIONAL, IN DWORD DriverInfoDetailDataSize, - OUT PDWORD RequiredSize OPTIONAL) + OUT PDWORD RequiredSize OPTIONAL) { BOOL ret = FALSE; @@ -7010,7 +7110,7 @@ static DWORD GetCurrentHwProfile( IN HDEVINFO DeviceInfoSet) { - HKEY hKey = INVALID_HANDLE_VALUE; + HKEY hKey = NULL; DWORD dwRegType, dwLength; DWORD hwProfile; LONG rc; @@ -7049,7 +7149,7 @@ GetCurrentHwProfile( ret = hwProfile; cleanup: - if (hKey != INVALID_HANDLE_VALUE) + if (hKey != NULL) RegCloseKey(hKey); return hwProfile; @@ -7096,7 +7196,7 @@ static BOOL StopDevice( BOOL WINAPI SetupDiChangeState( IN HDEVINFO DeviceInfoSet, - IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) + IN OUT PSP_DEVINFO_DATA DeviceInfoData) { PSP_PROPCHANGE_PARAMS PropChange; HKEY hKey = INVALID_HANDLE_VALUE; @@ -7208,7 +7308,7 @@ cleanup: BOOL WINAPI SetupDiSelectBestCompatDrv( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData) + IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { SP_DRVINFO_DATA_W drvInfoData; BOOL ret; @@ -7244,7 +7344,7 @@ SetupDiSelectBestCompatDrv( BOOL WINAPI SetupDiInstallDriverFiles( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) + IN PSP_DEVINFO_DATA DeviceInfoData) { BOOL ret = FALSE; @@ -7306,7 +7406,7 @@ SetupDiInstallDriverFiles( } ret = SetupInstallFromInfSectionW(InstallParams.hwndParent, SelectedDriver->InfFileDetails->hInf, SectionName, - SPINST_FILES, NULL, NULL, SP_COPY_NEWER, + SPINST_FILES, NULL, SelectedDriver->InfFileDetails->DirectoryName, SP_COPY_NEWER, InstallMsgHandler, InstallMsgHandlerContext, DeviceInfoSet, DeviceInfoData); if (!ret) @@ -7316,7 +7416,7 @@ SetupDiInstallDriverFiles( lstrcatW(SectionName, DotCoInstallers); ret = SetupInstallFromInfSectionW(InstallParams.hwndParent, SelectedDriver->InfFileDetails->hInf, SectionName, - SPINST_FILES, NULL, NULL, SP_COPY_NEWER, + SPINST_FILES, NULL, SelectedDriver->InfFileDetails->DirectoryName, SP_COPY_NEWER, InstallMsgHandler, InstallMsgHandlerContext, DeviceInfoSet, DeviceInfoData); if (!ret) @@ -7413,7 +7513,7 @@ SetupDiRegisterCoDeviceInstallers( } Result = SetupInstallFromInfSectionW(InstallParams.hwndParent, SelectedDriver->InfFileDetails->hInf, SectionName, - DoAction, hKey, NULL, SP_COPY_NEWER, + DoAction, hKey, SelectedDriver->InfFileDetails->DirectoryName, SP_COPY_NEWER, SetupDefaultQueueCallback, Context, DeviceInfoSet, DeviceInfoData); if (!Result) @@ -7576,7 +7676,7 @@ cleanup: return ret; } -BOOL +static BOOL InfIsFromOEMLocation( IN PCWSTR FullName, OUT LPBOOL IsOEMLocation) @@ -7621,7 +7721,7 @@ InfIsFromOEMLocation( BOOL WINAPI SetupDiInstallDevice( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData) + IN OUT PSP_DEVINFO_DATA DeviceInfoData) { SP_DEVINSTALL_PARAMS_W InstallParams; struct DriverInfoElement *SelectedDriver; @@ -7638,7 +7738,6 @@ SetupDiInstallDevice( LPWSTR lpGuidString = NULL, lpFullGuidString = NULL; BOOL RebootRequired = FALSE; HKEY hKey = INVALID_HANDLE_VALUE; - HKEY hClassKey = INVALID_HANDLE_VALUE; BOOL NeedtoCopyFile; LARGE_INTEGER fullVersion; LONG rc; @@ -7721,7 +7820,7 @@ SetupDiInstallDevice( pSectionName = &SectionName[strlenW(SectionName)]; /* Get information from [Version] section */ - if (!SetupDiGetINFClassW(SelectedDriver->Details.InfFileName, &ClassGuid, ClassName, MAX_CLASS_NAME_LEN, &RequiredSize)) + if (!SetupDiGetINFClassW(SelectedDriver->InfFileDetails->FullInfFileName, &ClassGuid, ClassName, MAX_CLASS_NAME_LEN, &RequiredSize)) goto cleanup; /* Format ClassGuid to a string */ if (UuidToStringW((UUID*)&ClassGuid, &lpGuidString) != RPC_S_OK) @@ -7763,7 +7862,7 @@ SetupDiInstallDevice( *pSectionName = '\0'; Result = SetupInstallFromInfSectionW(InstallParams.hwndParent, SelectedDriver->InfFileDetails->hInf, SectionName, - DoAction, hKey, NULL, SP_COPY_NEWER, + DoAction, hKey, SelectedDriver->InfFileDetails->DirectoryName, SP_COPY_NEWER, SetupDefaultQueueCallback, Context, DeviceInfoSet, DeviceInfoData); if (!Result) @@ -7894,8 +7993,6 @@ SetupDiInstallDevice( cleanup: /* End of installation */ - if (hClassKey != INVALID_HANDLE_VALUE) - RegCloseKey(hClassKey); if (hKey != INVALID_HANDLE_VALUE) RegCloseKey(hKey); if (lpGuidString)