*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "setupapi_private.h"
PVOID PrivateData;
};
+struct GetSectionCallbackInfo
+{
+ PSP_ALTPLATFORM_INFO PlatformInfo;
+ BYTE ProductType;
+ WORD SuiteMask;
+ WCHAR BestSection[LINE_LEN + 1];
+ DWORD BestScore1, BestScore2, BestScore3, BestScore4, BestScore5;
+};
+
static BOOL
PropertyChangeHandler(
IN HDEVINFO DeviceInfoSet,
BOOL WINAPI
SetupDiBuildClassInfoList(
IN DWORD Flags,
- OUT LPGUID ClassGuidList OPTIONAL,
+ OUT LPGUID ClassGuidList OPTIONAL,
IN DWORD ClassGuidListSize,
OUT PDWORD RequiredSize)
{
BOOL WINAPI
SetupDiBuildClassInfoListExA(
IN DWORD Flags,
- OUT LPGUID ClassGuidList OPTIONAL,
+ OUT LPGUID ClassGuidList OPTIONAL,
IN DWORD ClassGuidListSize,
OUT PDWORD RequiredSize,
- IN PCSTR MachineName OPTIONAL,
+ IN PCSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
LPWSTR MachineNameW = NULL;
BOOL WINAPI
SetupDiBuildClassInfoListExW(
IN DWORD Flags,
- OUT LPGUID ClassGuidList OPTIONAL,
+ OUT LPGUID ClassGuidList OPTIONAL,
IN DWORD ClassGuidListSize,
OUT PDWORD RequiredSize,
- IN PCWSTR MachineName OPTIONAL,
+ IN PCWSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
WCHAR szKeyName[MAX_GUID_STRING_LEN + 1];
OUT LPGUID ClassGuidList,
IN DWORD ClassGuidListSize,
OUT PDWORD RequiredSize,
- IN PCSTR MachineName OPTIONAL,
+ IN PCSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
LPWSTR ClassNameW = NULL;
OUT LPGUID ClassGuidList,
IN DWORD ClassGuidListSize,
OUT PDWORD RequiredSize,
- IN PCWSTR MachineName OPTIONAL,
+ IN PCWSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
WCHAR szKeyName[MAX_GUID_STRING_LEN + 1];
IN CONST GUID* ClassGuid,
OUT PSTR ClassName,
IN DWORD ClassNameSize,
- OUT PDWORD RequiredSize OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL)
{
return SetupDiClassNameFromGuidExA(ClassGuid, ClassName,
ClassNameSize, RequiredSize,
IN CONST GUID* ClassGuid,
OUT PWSTR ClassName,
IN DWORD ClassNameSize,
- OUT PDWORD RequiredSize OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL)
{
return SetupDiClassNameFromGuidExW(ClassGuid, ClassName,
ClassNameSize, RequiredSize,
IN CONST GUID* ClassGuid,
OUT PSTR ClassName,
IN DWORD ClassNameSize,
- OUT PDWORD RequiredSize OPTIONAL,
- IN PCSTR MachineName OPTIONAL,
+ OUT PDWORD RequiredSize OPTIONAL,
+ IN PCSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
WCHAR ClassNameW[MAX_CLASS_NAME_LEN];
IN CONST GUID* ClassGuid,
OUT PWSTR ClassName,
IN DWORD ClassNameSize,
- OUT PDWORD RequiredSize OPTIONAL,
- IN PCWSTR MachineName OPTIONAL,
+ OUT PDWORD RequiredSize OPTIONAL,
+ IN PCWSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
HKEY hKey;
*/
HDEVINFO WINAPI
SetupDiCreateDeviceInfoList(
- IN CONST GUID *ClassGuid OPTIONAL,
- IN HWND hwndParent OPTIONAL)
+ IN CONST GUID *ClassGuid OPTIONAL,
+ IN HWND hwndParent OPTIONAL)
{
return SetupDiCreateDeviceInfoListExW(ClassGuid, hwndParent, NULL, NULL);
}
*/
HDEVINFO WINAPI
SetupDiCreateDeviceInfoListExA(
- IN CONST GUID *ClassGuid OPTIONAL,
- IN HWND hwndParent OPTIONAL,
- IN PCSTR MachineName OPTIONAL,
+ IN CONST GUID *ClassGuid OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
+ IN PCSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
LPWSTR MachineNameW = NULL;
*/
HDEVINFO WINAPI
SetupDiCreateDeviceInfoListExW(
- IN CONST GUID *ClassGuid OPTIONAL,
- IN HWND hwndParent OPTIONAL,
- IN PCWSTR MachineName OPTIONAL,
+ IN CONST GUID *ClassGuid OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
+ IN PCWSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
struct DeviceInfoSet *list;
SetupDiGetActualSectionToInstallA(
IN HINF InfHandle,
IN PCSTR InfSectionName,
- OUT PSTR InfSectionWithExt OPTIONAL,
+ OUT PSTR InfSectionWithExt OPTIONAL,
IN DWORD InfSectionWithExtSize,
- OUT PDWORD RequiredSize OPTIONAL,
- OUT PSTR *Extension OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL,
+ OUT PSTR *Extension OPTIONAL)
{
return SetupDiGetActualSectionToInstallExA(InfHandle, InfSectionName,
NULL, InfSectionWithExt, InfSectionWithExtSize, RequiredSize,
SetupDiGetActualSectionToInstallW(
IN HINF InfHandle,
IN PCWSTR InfSectionName,
- OUT PWSTR InfSectionWithExt OPTIONAL,
+ OUT PWSTR InfSectionWithExt OPTIONAL,
IN DWORD InfSectionWithExtSize,
- OUT PDWORD RequiredSize OPTIONAL,
- OUT PWSTR *Extension OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL,
+ OUT PWSTR *Extension OPTIONAL)
{
return SetupDiGetActualSectionToInstallExW(InfHandle, InfSectionName,
NULL, InfSectionWithExt, InfSectionWithExtSize, RequiredSize,
SetupDiGetActualSectionToInstallExA(
IN HINF InfHandle,
IN PCSTR InfSectionName,
- IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo OPTIONAL,
- OUT PSTR InfSectionWithExt OPTIONAL,
+ IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo OPTIONAL,
+ OUT PSTR InfSectionWithExt OPTIONAL,
IN DWORD InfSectionWithExtSize,
- OUT PDWORD RequiredSize OPTIONAL,
- OUT PSTR* Extension OPTIONAL,
+ OUT PDWORD RequiredSize OPTIONAL,
+ OUT PSTR* Extension OPTIONAL,
IN PVOID Reserved)
{
LPWSTR InfSectionNameW = NULL;
return bResult;
}
+/* Lower scores are best ones */
+static BOOL
+CheckSectionValid(
+ IN LPCWSTR SectionName,
+ IN PSP_ALTPLATFORM_INFO PlatformInfo,
+ IN BYTE ProductType,
+ IN WORD SuiteMask,
+ OUT PDWORD ScorePlatform,
+ OUT PDWORD ScoreMajorVersion,
+ OUT PDWORD ScoreMinorVersion,
+ OUT PDWORD ScoreProductType,
+ OUT PDWORD ScoreSuiteMask)
+{
+ LPWSTR Section = NULL;
+ LPCWSTR pExtensionPlatform, pExtensionArchitecture;
+ LPWSTR Fields[6];
+ DWORD i;
+ BOOL ret = FALSE;
+
+ TRACE("%s %p 0x%x 0x%x\n",
+ debugstr_w(SectionName), PlatformInfo, ProductType, SuiteMask);
+
+ static const WCHAR ExtensionPlatformNone[] = {'.',0};
+ static const WCHAR ExtensionPlatformNT[] = {'.','N','T',0};
+ static const WCHAR ExtensionPlatformWindows[] = {'.','W','i','n',0};
+
+ static const WCHAR ExtensionArchitectureNone[] = {0};
+ static const WCHAR ExtensionArchitecturealpha[] = {'a','l','p','h','a',0};
+ static const WCHAR ExtensionArchitectureamd64[] = {'a','m','d','6','4',0};
+ static const WCHAR ExtensionArchitectureia64[] = {'i','a','6','4',0};
+ static const WCHAR ExtensionArchitecturemips[] = {'m','i','p','s',0};
+ static const WCHAR ExtensionArchitectureppc[] = {'p','p','c',0};
+ static const WCHAR ExtensionArchitecturex86[] = {'x','8','6',0};
+
+ *ScorePlatform = *ScoreMajorVersion = *ScoreMinorVersion = *ScoreProductType = *ScoreSuiteMask = 0;
+
+ Section = DuplicateString(SectionName);
+ if (!Section)
+ {
+ TRACE("DuplicateString() failed\n");
+ goto cleanup;
+ }
+
+ /* Set various extensions values */
+ switch (PlatformInfo->Platform)
+ {
+ case VER_PLATFORM_WIN32_WINDOWS:
+ pExtensionPlatform = ExtensionPlatformWindows;
+ break;
+ case VER_PLATFORM_WIN32_NT:
+ pExtensionPlatform = ExtensionPlatformNT;
+ break;
+ default:
+ ERR("Unkown platform 0x%lx\n", PlatformInfo->Platform);
+ pExtensionPlatform = ExtensionPlatformNone;
+ break;
+ }
+ switch (PlatformInfo->ProcessorArchitecture)
+ {
+ case PROCESSOR_ARCHITECTURE_ALPHA:
+ pExtensionArchitecture = ExtensionArchitecturealpha;
+ break;
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ pExtensionArchitecture = ExtensionArchitectureamd64;
+ break;
+ case PROCESSOR_ARCHITECTURE_IA64:
+ pExtensionArchitecture = ExtensionArchitectureia64;
+ break;
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ pExtensionArchitecture = ExtensionArchitecturex86;
+ break;
+ case PROCESSOR_ARCHITECTURE_MIPS:
+ pExtensionArchitecture = ExtensionArchitecturemips;
+ break;
+ case PROCESSOR_ARCHITECTURE_PPC:
+ pExtensionArchitecture = ExtensionArchitectureppc;
+ break;
+ default:
+ ERR("Unknown processor architecture 0x%x\n", PlatformInfo->ProcessorArchitecture);
+ case PROCESSOR_ARCHITECTURE_UNKNOWN:
+ pExtensionArchitecture = ExtensionArchitectureNone;
+ break;
+ }
+
+ /*
+ * Field[0] Platform
+ * Field[1] Architecture
+ * Field[2] Major version
+ * Field[3] Minor version
+ * Field[4] Product type
+ * Field[5] Suite mask
+ * Remark: lastests fields may be NULL if the information is not provided
+ */
+ Fields[0] = strchrW(Section, '.');
+ if (Fields[0] == NULL)
+ {
+ TRACE("No extension found\n");
+ *ScorePlatform = *ScoreMajorVersion = *ScoreMinorVersion = *ScoreProductType = *ScoreSuiteMask = ULONG_MAX;
+ ret = TRUE;
+ goto cleanup;
+ }
+ Fields[1] = Fields[0] + 1;
+ Fields[2] = Fields[3] = Fields[4] = Fields[5] = NULL;
+ for (i = 2; Fields[i - 1] != NULL && i < 6; i++)
+ {
+ Fields[i] = wcschr(Fields[i - 1], '.');
+ if (Fields[i])
+ {
+ Fields[i]++;
+ *(Fields[i] - 1) = L'\0';
+ }
+ }
+ /* Take care of first 2 fields */
+ if (strncmpiW(Fields[0], ExtensionPlatformWindows, strlenW(ExtensionPlatformWindows)) == 0)
+ {
+ if (PlatformInfo->Platform != VER_PLATFORM_WIN32_WINDOWS)
+ {
+ TRACE("Mismatch on platform field\n");
+ goto cleanup;
+ }
+ Fields[1] += wcslen(ExtensionPlatformWindows) - 1;
+ }
+ else if (strncmpiW(Fields[0], ExtensionPlatformNT, strlenW(ExtensionPlatformNT)) == 0)
+ {
+ if (PlatformInfo->Platform != VER_PLATFORM_WIN32_NT)
+ {
+ TRACE("Mismatch on platform field\n");
+ goto cleanup;
+ }
+ Fields[1] += wcslen(ExtensionPlatformNT) - 1;
+ }
+ else
+ {
+ /* No platform specified */
+ *ScorePlatform |= 0x02;
+ }
+ if (strcmpiW(Fields[1], ExtensionArchitectureNone) == 0)
+ {
+ /* No architecture specified */
+ *ScorePlatform |= 0x01;
+ }
+ else if (strcmpiW(Fields[1], pExtensionArchitecture) != 0)
+ {
+ TRACE("Mismatch on architecture field ('%s' and '%s')\n",
+ debugstr_w(Fields[1]), debugstr_w(pExtensionArchitecture));
+ goto cleanup;
+ }
+
+ /* Check if informations are matching */
+ if (Fields[2] && *Fields[2])
+ {
+ DWORD MajorVersion, MinorVersion = 0;
+ MajorVersion = strtoulW(Fields[2], NULL, 0);
+ if ((MajorVersion == 0 || MajorVersion == ULONG_MAX) &&
+ (errno == ERANGE || errno == EINVAL))
+ {
+ TRACE("Wrong MajorVersion ('%s')\n", debugstr_w(Fields[2]));
+ goto cleanup;
+ }
+ if (Fields[3] && *Fields[3])
+ {
+ MinorVersion = strtoulW(Fields[3], NULL, 0);
+ if ((MinorVersion == 0 || MinorVersion == ULONG_MAX) &&
+ (errno == ERANGE || errno == EINVAL))
+ {
+ TRACE("Wrong MinorVersion ('%s')\n", debugstr_w(Fields[3]));
+ goto cleanup;
+ }
+ }
+ if (PlatformInfo->MajorVersion < MajorVersion ||
+ (PlatformInfo->MajorVersion == MajorVersion && PlatformInfo->MinorVersion < MinorVersion))
+ {
+ TRACE("Mismatch on version field (%lu.%lu and %lu.%lu)\n",
+ MajorVersion, MinorVersion, PlatformInfo->MajorVersion, PlatformInfo->MinorVersion);
+ goto cleanup;
+ }
+ *ScoreMajorVersion = MajorVersion - PlatformInfo->MajorVersion;
+ if (MajorVersion == PlatformInfo->MajorVersion)
+ *ScoreMinorVersion = MinorVersion - PlatformInfo->MinorVersion;
+ else
+ *ScoreMinorVersion = MinorVersion;
+ }
+ else if (Fields[3] && *Fields[3])
+ {
+ TRACE("Minor version found without major version\n");
+ goto cleanup;
+ }
+ else
+ {
+ *ScoreMajorVersion = PlatformInfo->MajorVersion;
+ *ScoreMinorVersion = PlatformInfo->MinorVersion;
+ }
+
+ if (Fields[4] && *Fields[4])
+ {
+ DWORD CurrentProductType;
+ CurrentProductType = strtoulW(Fields[4], NULL, 0);
+ if ((CurrentProductType == 0 || CurrentProductType == ULONG_MAX) &&
+ (errno == ERANGE || errno == EINVAL))
+ {
+ TRACE("Wrong Product type ('%s')\n", debugstr_w(Fields[4]));
+ goto cleanup;
+ }
+ if (CurrentProductType != ProductType)
+ {
+ TRACE("Mismatch on product type (0x%08lx and 0x%08x)\n",
+ CurrentProductType, ProductType);
+ goto cleanup;
+ }
+ }
+ else
+ *ScoreProductType = 1;
+
+ if (Fields[5] && *Fields[5])
+ {
+ DWORD CurrentSuiteMask;
+ CurrentSuiteMask = strtoulW(Fields[5], NULL, 0);
+ if ((CurrentSuiteMask == 0 || CurrentSuiteMask == ULONG_MAX) &&
+ (errno == ERANGE || errno == EINVAL))
+ {
+ TRACE("Wrong Suite mask ('%s')\n", debugstr_w(Fields[5]));
+ goto cleanup;
+ }
+ if ((CurrentSuiteMask & ~SuiteMask) != 0)
+ {
+ TRACE("Mismatch on suite mask (0x%08lx and 0x%08x)\n",
+ CurrentSuiteMask, SuiteMask);
+ goto cleanup;
+ }
+ *ScoreSuiteMask = SuiteMask & ~CurrentSuiteMask;
+ }
+ else
+ *ScoreSuiteMask = SuiteMask;
+
+ ret = TRUE;
+
+cleanup:
+ MyFree(Section);
+ return ret;
+}
+
+static BOOL
+GetSectionCallback(
+ IN LPCWSTR SectionName,
+ IN PVOID Context)
+{
+ struct GetSectionCallbackInfo *info = Context;
+ DWORD Score1, Score2, Score3, Score4, Score5;
+ BOOL ret;
+
+ ret = CheckSectionValid(
+ SectionName,
+ info->PlatformInfo,
+ info->ProductType,
+ info->SuiteMask,
+ &Score1, &Score2, &Score3, &Score4, &Score5);
+ if (!ret)
+ {
+ TRACE("Section %s not compatible\n", debugstr_w(SectionName));
+ return TRUE;
+ }
+ if (Score1 > info->BestScore1) goto done;
+ if (Score1 < info->BestScore1) goto bettersection;
+ if (Score2 > info->BestScore2) goto done;
+ if (Score2 < info->BestScore2) goto bettersection;
+ if (Score3 > info->BestScore3) goto done;
+ if (Score3 < info->BestScore3) goto bettersection;
+ if (Score4 > info->BestScore4) goto done;
+ if (Score4 < info->BestScore4) goto bettersection;
+ if (Score5 > info->BestScore5) goto done;
+ if (Score5 < info->BestScore5) goto bettersection;
+ goto done;
+
+bettersection:
+ strcpyW(info->BestSection, SectionName);
+ info->BestScore1 = Score1;
+ info->BestScore2 = Score2;
+ info->BestScore3 = Score3;
+ info->BestScore4 = Score4;
+ info->BestScore5 = Score5;
+
+done:
+ return TRUE;
+}
+
/***********************************************************************
* SetupDiGetActualSectionToInstallExW (SETUPAPI.@)
*/
SetupDiGetActualSectionToInstallExW(
IN HINF InfHandle,
IN PCWSTR InfSectionName,
- IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo OPTIONAL,
- OUT PWSTR InfSectionWithExt OPTIONAL,
+ IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo OPTIONAL,
+ OUT PWSTR InfSectionWithExt OPTIONAL,
IN DWORD InfSectionWithExtSize,
- OUT PDWORD RequiredSize OPTIONAL,
- OUT PWSTR* Extension OPTIONAL,
+ OUT PDWORD RequiredSize OPTIONAL,
+ OUT PWSTR* Extension OPTIONAL,
IN PVOID Reserved)
{
BOOL ret = FALSE;
else
{
static SP_ALTPLATFORM_INFO CurrentPlatform = { 0, };
+ static BYTE CurrentProductType = 0;
+ static WORD CurrentSuiteMask = 0;
PSP_ALTPLATFORM_INFO pPlatformInfo = &CurrentPlatform;
- LPCWSTR pExtensionPlatform, pExtensionArchitecture;
- WCHAR SectionName[LINE_LEN + 1];
- LONG lLineCount = -1;
+ struct GetSectionCallbackInfo CallbackInfo;
DWORD dwFullLength;
+ BYTE ProductType;
+ WORD SuiteMask;
/* Fill platform info if needed */
if (AlternatePlatformInfo)
- pPlatformInfo = AlternatePlatformInfo;
- else if (CurrentPlatform.cbSize != sizeof(SP_ALTPLATFORM_INFO))
{
- /* That's the first time we go here. We need to fill in the structure */
- OSVERSIONINFO VersionInfo;
- SYSTEM_INFO SystemInfo;
- VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- ret = GetVersionEx(&VersionInfo);
- if (!ret)
- goto done;
- GetSystemInfo(&SystemInfo);
- CurrentPlatform.cbSize = sizeof(SP_ALTPLATFORM_INFO);
- CurrentPlatform.Platform = VersionInfo.dwPlatformId;
- CurrentPlatform.MajorVersion = VersionInfo.dwMajorVersion;
- CurrentPlatform.MinorVersion = VersionInfo.dwMinorVersion;
- CurrentPlatform.ProcessorArchitecture = SystemInfo.wProcessorArchitecture;
- CurrentPlatform.Reserved = 0;
- }
-
-static const WCHAR ExtensionPlatformNone[] = {'.',0};
-static const WCHAR ExtensionPlatformNT[] = {'.','N','T',0};
-static const WCHAR ExtensionPlatformWindows[] = {'.','W','i','n',0};
-
-static const WCHAR ExtensionArchitectureNone[] = {0};
-static const WCHAR ExtensionArchitecturealpha[] = {'a','l','p','h','a',0};
-static const WCHAR ExtensionArchitectureamd64[] = {'a','m','d','6','4',0};
-static const WCHAR ExtensionArchitectureia64[] = {'i','a','6','4',0};
-static const WCHAR ExtensionArchitecturemips[] = {'m','i','p','s',0};
-static const WCHAR ExtensionArchitectureppc[] = {'p','p','c',0};
-static const WCHAR ExtensionArchitecturex86[] = {'x','8','6',0};
-
- /* Set various extensions values */
- switch (pPlatformInfo->Platform)
- {
- case VER_PLATFORM_WIN32_WINDOWS:
- pExtensionPlatform = ExtensionPlatformWindows;
- break;
- case VER_PLATFORM_WIN32_NT:
- pExtensionPlatform = ExtensionPlatformNT;
- break;
- default:
- ERR("Unkown platform 0x%lx\n", pPlatformInfo->Platform);
- pExtensionPlatform = ExtensionPlatformNone;
- break;
+ pPlatformInfo = AlternatePlatformInfo;
+ ProductType = 0;
+ SuiteMask = 0;
}
- switch (pPlatformInfo->ProcessorArchitecture)
+ else
{
- case PROCESSOR_ARCHITECTURE_ALPHA:
- pExtensionArchitecture = ExtensionArchitecturealpha;
- break;
- case PROCESSOR_ARCHITECTURE_AMD64:
- pExtensionArchitecture = ExtensionArchitectureamd64;
- break;
- case PROCESSOR_ARCHITECTURE_IA64:
- pExtensionArchitecture = ExtensionArchitectureia64;
- break;
- case PROCESSOR_ARCHITECTURE_INTEL:
- pExtensionArchitecture = ExtensionArchitecturex86;
- break;
- case PROCESSOR_ARCHITECTURE_MIPS:
- pExtensionArchitecture = ExtensionArchitecturemips;
- break;
- case PROCESSOR_ARCHITECTURE_PPC:
- pExtensionArchitecture = ExtensionArchitectureppc;
- break;
- default:
- ERR("Unknown processor architecture 0x%x\n", pPlatformInfo->ProcessorArchitecture);
- case PROCESSOR_ARCHITECTURE_UNKNOWN:
- pExtensionArchitecture = ExtensionArchitectureNone;
- break;
+ if (CurrentPlatform.cbSize != sizeof(SP_ALTPLATFORM_INFO))
+ {
+ /* That's the first time we go here. We need to fill in the structure */
+ OSVERSIONINFOEX VersionInfo;
+ SYSTEM_INFO SystemInfo;
+ VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+ ret = GetVersionEx((POSVERSIONINFO)&VersionInfo);
+ if (!ret)
+ goto done;
+ GetSystemInfo(&SystemInfo);
+ CurrentPlatform.cbSize = sizeof(SP_ALTPLATFORM_INFO);
+ CurrentPlatform.Platform = VersionInfo.dwPlatformId;
+ CurrentPlatform.MajorVersion = VersionInfo.dwMajorVersion;
+ CurrentPlatform.MinorVersion = VersionInfo.dwMinorVersion;
+ CurrentPlatform.ProcessorArchitecture = SystemInfo.wProcessorArchitecture;
+ CurrentPlatform.Reserved = 0;
+ CurrentProductType = VersionInfo.wProductType;
+ CurrentSuiteMask = VersionInfo.wSuiteMask;
+ }
+ ProductType = CurrentProductType;
+ SuiteMask = CurrentSuiteMask;
+ }
+
+ CallbackInfo.PlatformInfo = pPlatformInfo;
+ CallbackInfo.ProductType = ProductType;
+ CallbackInfo.SuiteMask = SuiteMask;
+ CallbackInfo.BestScore1 = ULONG_MAX;
+ CallbackInfo.BestScore2 = ULONG_MAX;
+ CallbackInfo.BestScore3 = ULONG_MAX;
+ CallbackInfo.BestScore4 = ULONG_MAX;
+ CallbackInfo.BestScore5 = ULONG_MAX;
+ strcpyW(CallbackInfo.BestSection, InfSectionName);
+ if (!EnumerateSectionsStartingWith(
+ InfHandle,
+ InfSectionName,
+ GetSectionCallback,
+ &CallbackInfo))
+ {
+ SetLastError(ERROR_GEN_FAILURE);
+ goto done;
}
-static const WCHAR FormatPlatformArchitectureMajorMinor[] = {'%','s','%','s','%','s','.','%','l','u','.','%','l','u',0};
-static const WCHAR FormatPlatformMajorMinor[] = {'%','s','%','s','.','%','l','u','.','%','l','u',0};
-static const WCHAR FormatPlatformArchitectureMajor[] = {'%','s','%','s','%','s','.','%','l','u',0};
-static const WCHAR FormatPlatformMajor[] = {'%','s','%','s','.','%','l','u',0};
-static const WCHAR FormatPlatformArchitecture[] = {'%','s','%','s','%','s',0};
-static const WCHAR FormatPlatform[] = {'%','s','%','s',0};
-static const WCHAR FormatNone[] = {'%','s',0};
-
- SectionName[LINE_LEN] = UNICODE_NULL;
-
- /* Test with platform.architecture.major.minor extension */
- snprintfW(SectionName, LINE_LEN, FormatPlatformArchitectureMajorMinor, InfSectionName,
- pExtensionPlatform, pExtensionArchitecture, pPlatformInfo->MajorVersion, pPlatformInfo->MinorVersion);
- lLineCount = SetupGetLineCountW(InfHandle, SectionName);
- if (lLineCount != -1) goto sectionfound;
-
- /* Test with platform.major.minor extension */
- snprintfW(SectionName, LINE_LEN, FormatPlatformMajorMinor, InfSectionName,
- pExtensionPlatform, pPlatformInfo->MajorVersion, pPlatformInfo->MinorVersion);
- lLineCount = SetupGetLineCountW(InfHandle, SectionName);
- if (lLineCount != -1) goto sectionfound;
-
- /* Test with platform.architecture.major extension */
- snprintfW(SectionName, LINE_LEN, FormatPlatformArchitectureMajor, InfSectionName,
- pExtensionPlatform, pExtensionArchitecture, pPlatformInfo->MajorVersion);
- lLineCount = SetupGetLineCountW(InfHandle, SectionName);
- if (lLineCount != -1) goto sectionfound;
-
- /* Test with platform.major extension */
- snprintfW(SectionName, LINE_LEN, FormatPlatformMajor, InfSectionName,
- pExtensionPlatform, pPlatformInfo->MajorVersion);
- lLineCount = SetupGetLineCountW(InfHandle, SectionName);
- if (lLineCount != -1) goto sectionfound;
-
- /* Test with platform.architecture extension */
- snprintfW(SectionName, LINE_LEN, FormatPlatformArchitecture, InfSectionName,
- pExtensionPlatform, pExtensionArchitecture);
- lLineCount = SetupGetLineCountW(InfHandle, SectionName);
- if (lLineCount != -1) goto sectionfound;
-
- /* Test with platform extension */
- snprintfW(SectionName, LINE_LEN, FormatPlatform, InfSectionName,
- pExtensionPlatform);
- lLineCount = SetupGetLineCountW(InfHandle, SectionName);
- if (lLineCount != -1) goto sectionfound;
-
- /* Test without extension */
- snprintfW(SectionName, LINE_LEN, FormatNone, InfSectionName);
- lLineCount = SetupGetLineCountW(InfHandle, SectionName);
- if (lLineCount != -1) goto sectionfound;
-
- /* No appropriate section found */
- SetLastError(ERROR_INVALID_PARAMETER);
- goto done;
+ dwFullLength = lstrlenW(CallbackInfo.BestSection);
+ if (RequiredSize != NULL)
+ *RequiredSize = dwFullLength + 1;
-sectionfound:
- dwFullLength = lstrlenW(SectionName);
- if (InfSectionWithExt != NULL && InfSectionWithExtSize != 0)
+ if (InfSectionWithExtSize > 0)
{
- if (InfSectionWithExtSize < (dwFullLength + 1))
+ if (InfSectionWithExtSize < dwFullLength + 1)
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
goto done;
}
-
- lstrcpyW(InfSectionWithExt, SectionName);
- if (Extension != NULL)
+ strcpyW(InfSectionWithExt, CallbackInfo.BestSection);
+ if (Extension)
{
- DWORD dwLength = lstrlenW(SectionName);
+ DWORD dwLength = lstrlenW(InfSectionName);
*Extension = (dwLength == dwFullLength) ? NULL : &InfSectionWithExt[dwLength];
}
}
- if (RequiredSize != NULL)
- *RequiredSize = dwFullLength + 1;
-
ret = TRUE;
}
IN CONST GUID *ClassGuid,
OUT PSTR ClassDescription,
IN DWORD ClassDescriptionSize,
- OUT PDWORD RequiredSize OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL)
{
return SetupDiGetClassDescriptionExA(ClassGuid, ClassDescription,
ClassDescriptionSize,
IN CONST GUID *ClassGuid,
OUT PWSTR ClassDescription,
IN DWORD ClassDescriptionSize,
- OUT PDWORD RequiredSize OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL)
{
return SetupDiGetClassDescriptionExW(ClassGuid, ClassDescription,
ClassDescriptionSize,
IN CONST GUID *ClassGuid,
OUT PSTR ClassDescription,
IN DWORD ClassDescriptionSize,
- OUT PDWORD RequiredSize OPTIONAL,
- IN PCSTR MachineName OPTIONAL,
+ OUT PDWORD RequiredSize OPTIONAL,
+ IN PCSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
PWCHAR ClassDescriptionW;
IN CONST GUID *ClassGuid,
OUT PWSTR ClassDescription,
IN DWORD ClassDescriptionSize,
- OUT PDWORD RequiredSize OPTIONAL,
- IN PCWSTR MachineName OPTIONAL,
+ OUT PDWORD RequiredSize OPTIONAL,
+ IN PCWSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
HKEY hKey = INVALID_HANDLE_VALUE;
*/
HDEVINFO WINAPI
SetupDiGetClassDevsA(
- IN CONST GUID *ClassGuid OPTIONAL,
- IN PCSTR Enumerator OPTIONAL,
- IN HWND hwndParent OPTIONAL,
+ IN CONST GUID *ClassGuid OPTIONAL,
+ IN PCSTR Enumerator OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
IN DWORD Flags)
{
return SetupDiGetClassDevsExA(ClassGuid, Enumerator, hwndParent,
*/
HDEVINFO WINAPI
SetupDiGetClassDevsW(
- IN CONST GUID *ClassGuid OPTIONAL,
- IN PCWSTR Enumerator OPTIONAL,
- IN HWND hwndParent OPTIONAL,
+ IN CONST GUID *ClassGuid OPTIONAL,
+ IN PCWSTR Enumerator OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
IN DWORD Flags)
{
return SetupDiGetClassDevsExW(ClassGuid, Enumerator, hwndParent,
*/
HDEVINFO WINAPI
SetupDiGetClassDevsExA(
- IN CONST GUID *ClassGuid OPTIONAL,
- IN PCSTR Enumerator OPTIONAL,
- IN HWND hwndParent OPTIONAL,
+ 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 HDEVINFO DeviceInfoSet OPTIONAL,
+ IN PCSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
HDEVINFO ret;
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)
{
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)
{
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;
}
*/
HDEVINFO WINAPI
SetupDiGetClassDevsExW(
- IN CONST GUID *ClassGuid OPTIONAL,
- IN PCWSTR Enumerator OPTIONAL,
- IN HWND hwndParent OPTIONAL,
+ 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 HDEVINFO DeviceInfoSet OPTIONAL,
+ IN PCWSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
HDEVINFO hDeviceInfo = INVALID_HANDLE_VALUE;
BOOL WINAPI
SetupDiGetClassImageListExA(
OUT PSP_CLASSIMAGELIST_DATA ClassImageListData,
- IN PCSTR MachineName OPTIONAL,
+ IN PCSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
PWSTR MachineNameW = NULL;
BOOL WINAPI
SetupDiGetClassImageListExW(
OUT PSP_CLASSIMAGELIST_DATA ClassImageListData,
- IN PCWSTR MachineName OPTIONAL,
+ IN PCWSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
BOOL ret = FALSE;
BOOL WINAPI
SetupDiLoadClassIcon(
IN CONST GUID *ClassGuid,
- OUT HICON *LargeIcon OPTIONAL,
- OUT PINT MiniIconIndex OPTIONAL)
+ OUT HICON *LargeIcon OPTIONAL,
+ OUT PINT MiniIconIndex OPTIONAL)
{
BOOL ret = FALSE;
BOOL WINAPI
SetupDiEnumDeviceInterfaces(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN CONST GUID *InterfaceClassGuid,
IN DWORD MemberIndex,
OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
SetupDiGetDeviceInterfaceDetailA(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
- OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData OPTIONAL,
+ OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData OPTIONAL,
IN DWORD DeviceInterfaceDetailDataSize,
- OUT PDWORD RequiredSize OPTIONAL,
- OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL,
+ OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
{
PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailDataW = NULL;
DWORD sizeW = 0, sizeA;
SetupDiGetDeviceInterfaceDetailW(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
- OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData OPTIONAL,
+ OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData OPTIONAL,
IN DWORD DeviceInterfaceDetailDataSize,
- OUT PDWORD RequiredSize OPTIONAL,
- OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL,
+ OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
{
BOOL ret = FALSE;
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
IN DWORD Property,
- OUT PDWORD PropertyRegDataType OPTIONAL,
- OUT PBYTE PropertyBuffer OPTIONAL,
+ OUT PDWORD PropertyRegDataType OPTIONAL,
+ OUT PBYTE PropertyBuffer OPTIONAL,
IN DWORD PropertyBufferSize,
- OUT PDWORD RequiredSize OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL)
{
BOOL bResult;
BOOL bIsStringProperty;
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
IN DWORD Property,
- OUT PDWORD PropertyRegDataType OPTIONAL,
- OUT PBYTE PropertyBuffer OPTIONAL,
+ OUT PDWORD PropertyRegDataType OPTIONAL,
+ OUT PBYTE PropertyBuffer OPTIONAL,
IN DWORD PropertyBufferSize,
- OUT PDWORD RequiredSize OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL)
{
HKEY hEnumKey, hKey;
DWORD rc;
IN HDEVINFO DeviceInfoSet,
IN OUT PSP_DEVINFO_DATA DeviceInfoData,
IN DWORD Property,
- IN CONST BYTE *PropertyBuffer OPTIONAL,
+ IN CONST BYTE *PropertyBuffer OPTIONAL,
IN DWORD PropertyBufferSize)
{
FIXME("%p %p 0x%lx %p 0x%lx\n", DeviceInfoSet, DeviceInfoData,
IN HDEVINFO DeviceInfoSet,
IN OUT PSP_DEVINFO_DATA DeviceInfoData,
IN DWORD Property,
- IN CONST BYTE *PropertyBuffer OPTIONAL,
+ IN CONST BYTE *PropertyBuffer OPTIONAL,
IN DWORD PropertyBufferSize)
{
struct DeviceInfoSet *list;
*/
BOOL WINAPI
SetupDiInstallClassA(
- IN HWND hwndParent OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
IN PCSTR InfFileName,
IN DWORD Flags,
- IN HSPFILEQ FileQueue OPTIONAL)
+ IN HSPFILEQ FileQueue OPTIONAL)
{
return SetupDiInstallClassExA(hwndParent, InfFileName, Flags, FileQueue, NULL, NULL, NULL);
}
*/
BOOL WINAPI
SetupDiInstallClassW(
- IN HWND hwndParent OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
IN PCWSTR InfFileName,
IN DWORD Flags,
- IN HSPFILEQ FileQueue OPTIONAL)
+ IN HSPFILEQ FileQueue OPTIONAL)
{
return SetupDiInstallClassExW(hwndParent, InfFileName, Flags, FileQueue, NULL, NULL, NULL);
}
*/
BOOL WINAPI
SetupDiInstallClassExA(
- IN HWND hwndParent OPTIONAL,
- IN PCSTR InfFileName OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
+ IN PCSTR InfFileName OPTIONAL,
IN DWORD Flags,
- IN HSPFILEQ FileQueue OPTIONAL,
- IN CONST GUID *InterfaceClassGuid OPTIONAL,
+ 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 HWND hwndParent OPTIONAL,
+ IN PCWSTR InfFileName OPTIONAL,
IN DWORD Flags,
- IN HSPFILEQ FileQueue OPTIONAL,
- IN CONST GUID *InterfaceClassGuid OPTIONAL,
+ IN HSPFILEQ FileQueue OPTIONAL,
+ IN CONST GUID *InterfaceClassGuid OPTIONAL,
IN PVOID Reserved1,
IN PVOID Reserved2)
{
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,
*/
HKEY WINAPI
SetupDiOpenClassRegKey(
- IN CONST GUID *ClassGuid OPTIONAL,
+ IN CONST GUID *ClassGuid OPTIONAL,
IN REGSAM samDesired)
{
return SetupDiOpenClassRegKeyExW(ClassGuid, samDesired,
*/
HKEY WINAPI
SetupDiOpenClassRegKeyExA(
- IN CONST GUID *ClassGuid OPTIONAL,
+ IN CONST GUID *ClassGuid OPTIONAL,
IN REGSAM samDesired,
IN DWORD Flags,
- IN PCSTR MachineName OPTIONAL,
+ IN PCSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
PWSTR MachineNameW = NULL;
*/
HKEY WINAPI
SetupDiOpenClassRegKeyExW(
- IN CONST GUID* ClassGuid OPTIONAL,
+ IN CONST GUID* ClassGuid OPTIONAL,
IN REGSAM samDesired,
IN DWORD Flags,
- IN PCWSTR MachineName OPTIONAL,
+ IN PCWSTR MachineName OPTIONAL,
IN PVOID Reserved)
{
LPWSTR lpGuidString = NULL;
RegCloseKey(hClassesKey);
if (lpGuidString)
RpcStringFreeW(&lpGuidString);
- if (lpFullGuidString)
- HeapFree(GetProcessHeap(), 0, lpFullGuidString);
+ HeapFree(GetProcessHeap(), 0, lpFullGuidString);
return ret;
}
IN HDEVINFO DeviceInfoSet,
IN PCWSTR DevicePath,
IN DWORD OpenFlags,
- OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL)
+ OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL)
{
FIXME("%p %s %08lx %p\n",
DeviceInfoSet, debugstr_w(DevicePath), OpenFlags, DeviceInterfaceData);
IN HDEVINFO DeviceInfoSet,
IN PCSTR DevicePath,
IN DWORD OpenFlags,
- OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL)
+ OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL)
{
LPWSTR DevicePathW = NULL;
BOOL bResult;
BOOL WINAPI
SetupDiSetClassInstallParamsA(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
- IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
IN DWORD ClassInstallParamsSize)
{
FIXME("%p %p %x %lu\n",DeviceInfoSet, DeviceInfoData,
BOOL WINAPI
SetupDiSetClassInstallParamsW(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
- IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
IN DWORD ClassInstallParamsSize)
{
struct DeviceInfoSet *list;
SetupDiCallClassInstaller(
IN DI_FUNCTION InstallFunction,
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
{
BOOL ret = FALSE;
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);
BOOL WINAPI
SetupDiGetDeviceInstallParamsA(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
OUT PSP_DEVINSTALL_PARAMS_A DeviceInstallParams)
{
SP_DEVINSTALL_PARAMS_W deviceInstallParamsW;
BOOL WINAPI
SetupDiGetDeviceInstallParamsW(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
{
struct DeviceInfoSet *list;
BOOL WINAPI
SetupDiSetDeviceInstallParamsW(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
{
struct DeviceInfoSet *list;
SetupDiGetDeviceInstanceIdA(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
- OUT PSTR DeviceInstanceId OPTIONAL,
+ OUT PSTR DeviceInstanceId OPTIONAL,
IN DWORD DeviceInstanceIdSize,
- OUT PDWORD RequiredSize OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL)
{
PWSTR DeviceInstanceIdW = NULL;
BOOL ret = FALSE;
SetupDiGetDeviceInstanceIdW(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
- OUT PWSTR DeviceInstanceId OPTIONAL,
+ OUT PWSTR DeviceInstanceId OPTIONAL,
IN DWORD DeviceInstanceIdSize,
- OUT PDWORD RequiredSize OPTIONAL)
+ OUT PDWORD RequiredSize OPTIONAL)
{
BOOL ret = FALSE;
BOOL WINAPI
SetupDiGetClassDevPropertySheetsA(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN LPPROPSHEETHEADERA PropertySheetHeader,
IN DWORD PropertySheetHeaderPageListSize,
- OUT PDWORD RequiredSize OPTIONAL,
+ OUT PDWORD RequiredSize OPTIONAL,
IN DWORD PropertySheetType)
{
PROPSHEETHEADERW psh;
BOOL WINAPI
SetupDiGetClassDevPropertySheetsW(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN OUT LPPROPSHEETHEADERW PropertySheetHeader,
IN DWORD PropertySheetHeaderPageListSize,
- OUT PDWORD RequiredSize OPTIONAL,
+ OUT PDWORD RequiredSize OPTIONAL,
IN DWORD PropertySheetType)
{
struct DeviceInfoSet *list;
IN DWORD Scope,
IN DWORD HwProfile,
IN DWORD KeyType,
- IN HINF InfHandle OPTIONAL,
- IN PCSTR InfSectionName OPTIONAL)
+ IN HINF InfHandle OPTIONAL,
+ IN PCSTR InfSectionName OPTIONAL)
{
PCWSTR InfSectionNameW = NULL;
HKEY ret = INVALID_HANDLE_VALUE;
IN DWORD Scope,
IN DWORD HwProfile,
IN DWORD KeyType,
- IN HINF InfHandle OPTIONAL,
- IN PCWSTR InfSectionName OPTIONAL)
+ IN HINF InfHandle OPTIONAL,
+ IN PCWSTR InfSectionName OPTIONAL)
{
struct DeviceInfoSet *list;
HKEY ret = INVALID_HANDLE_VALUE;
IN HDEVINFO DeviceInfoSet,
IN PCSTR DeviceName,
IN CONST GUID *ClassGuid,
- IN PCSTR DeviceDescription OPTIONAL,
- IN HWND hwndParent OPTIONAL,
+ IN PCSTR DeviceDescription OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
IN DWORD CreationFlags,
- OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+ OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
{
LPWSTR DeviceNameW = NULL;
LPWSTR DeviceDescriptionW = NULL;
IN HDEVINFO DeviceInfoSet,
IN PCWSTR DeviceName,
IN CONST GUID *ClassGuid,
- IN PCWSTR DeviceDescription OPTIONAL,
- IN HWND hwndParent OPTIONAL,
+ IN PCWSTR DeviceDescription OPTIONAL,
+ IN HWND hwndParent OPTIONAL,
IN DWORD CreationFlags,
- OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+ OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
{
struct DeviceInfoSet *list;
BOOL ret = FALSE;
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;
+ }
+ 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;
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,
&DriverDate,
&DriverVersion))
{
- SetupCloseInfFile(currentInfFileDetails->hInf);
- HeapFree(GetProcessHeap(), 0, currentInfFileDetails->hInf);
+ DereferenceInfFile(currentInfFileDetails);
currentInfFileDetails = NULL;
continue;
}
DriverAlreadyAdded = FALSE;
for (DriverRank = 0, currentId = (LPCWSTR)HardwareIDs; !DriverAlreadyAdded && *currentId; currentId += strlenW(currentId) + 1, DriverRank++)
{
- if (wcsicmp(DeviceId, currentId) == 0)
+ if (strcmpiW(DeviceId, currentId) == 0)
{
AddDriverToList(
pDriverListHead,
{
for (DriverRank = 0, currentId = (LPCWSTR)CompatibleIDs; !DriverAlreadyAdded && *currentId; currentId += strlenW(currentId) + 1, DriverRank++)
{
- if (wcsicmp(DeviceId, currentId) == 0)
+ if (strcmpiW(DeviceId, currentId) == 0)
{
AddDriverToList(
pDriverListHead,
BOOL WINAPI
SetupDiDestroyDriverInfoList(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN DWORD DriverType)
{
struct DeviceInfoSet *list;
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;
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 = NULL;
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)
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)
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;
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;
BOOL WINAPI
SetupDiSetSelectedDriverA(
IN HDEVINFO DeviceInfoSet,
- IN OUT 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;
BOOL WINAPI
SetupDiSetSelectedDriverW(
IN HDEVINFO DeviceInfoSet,
- IN OUT 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;
BOOL WINAPI
SetupDiGetDriverInfoDetailA(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN PSP_DRVINFO_DATA_A DriverInfoData,
- IN 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;
BOOL WINAPI
SetupDiGetDriverInfoDetailW(
IN HDEVINFO DeviceInfoSet,
- IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN PSP_DRVINFO_DATA_W DriverInfoData,
- IN 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;
DeviceID = HardwareIDs;
while (DeviceID && *DeviceID && (size = wcslen(DeviceID)) + 1 < sizeLeft)
{
- TRACE("Adding %S to list\n", DeviceID);
+ TRACE("Adding %s to list\n", debugstr_w(DeviceID));
wcscpy(pBuffer, DeviceID);
DeviceID += size + 1;
pBuffer += size + 1;
DeviceID = CompatibleIDs;
while (DeviceID && *DeviceID && (size = wcslen(DeviceID)) + 1 < sizeLeft)
{
- TRACE("Adding %S to list\n", DeviceID);
+ TRACE("Adding %s to list\n", debugstr_w(DeviceID));
wcscpy(pBuffer, DeviceID);
DeviceID += size + 1;
pBuffer += size + 1;
BOOL WINAPI
SetupDiSelectBestCompatDrv(
IN HDEVINFO DeviceInfoSet,
- IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+ IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
{
SP_DRVINFO_DATA_W drvInfoData;
BOOL ret;
}
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)
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)
}
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)
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)
*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)
TRACE("InfSectionExt : '%s'\n", debugstr_w(&SectionName[strlenW(SelectedDriver->Details.SectionName)]));
TRACE("MatchingDeviceId: '%s'\n", debugstr_w(SelectedDriver->MatchingId));
TRACE("ProviderName : '%s'\n", debugstr_w(SelectedDriver->Info.ProviderName));
- swprintf(Buffer, L"%u-%u-%u", DriverDate.wMonth, DriverDate.wDay, DriverDate.wYear);
+ sprintfW(Buffer, L"%u-%u-%u", DriverDate.wMonth, DriverDate.wDay, DriverDate.wYear);
rc = RegSetValueEx(hKey, REGSTR_DRIVER_DATE, 0, REG_SZ, (const BYTE *)Buffer, (strlenW(Buffer) + 1) * sizeof(WCHAR));
if (rc == ERROR_SUCCESS)
rc = RegSetValueEx(hKey, REGSTR_DRIVER_DATE_DATA, 0, REG_BINARY, (const BYTE *)&SelectedDriver->Info.DriverDate, sizeof(FILETIME));
rc = RegSetValueEx(hKey, REGSTR_VAL_DRVDESC, 0, REG_SZ, (const BYTE *)SelectedDriver->Info.Description, (strlenW(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR));
if (rc == ERROR_SUCCESS)
{
- swprintf(Buffer, L"%u.%u.%u.%u", fullVersion.HighPart >> 16, fullVersion.HighPart & 0xffff, fullVersion.LowPart >> 16, fullVersion.LowPart & 0xffff);
+ sprintfW(Buffer, L"%u.%u.%u.%u", fullVersion.HighPart >> 16, fullVersion.HighPart & 0xffff, fullVersion.LowPart >> 16, fullVersion.LowPart & 0xffff);
rc = RegSetValueEx(hKey, REGSTR_DRIVER_VERSION, 0, REG_SZ, (const BYTE *)Buffer, (strlenW(Buffer) + 1) * sizeof(WCHAR));
}
if (rc == ERROR_SUCCESS)