Windows: Implement a new way to detect Windows version to overcome MSI limitation
This commit is contained in:
parent
ec8a6d9b82
commit
4dc3d9c1a7
|
@ -2875,6 +2875,45 @@ void DoPostInstallTasks (HWND hwndDlg)
|
||||||
SavePostInstallTasksSettings (TC_POST_INSTALL_CFG_REMOVE_ALL);
|
SavePostInstallTasksSettings (TC_POST_INSTALL_CFG_REMOVE_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SETUP_DLL
|
||||||
|
static BOOL GetWindowVersionFromFile(DWORD* pdwMajor, DWORD* pdwMinor, DWORD* pdwBuildNumber)
|
||||||
|
{
|
||||||
|
wchar_t dllPath[MAX_PATH];
|
||||||
|
BOOL bRet = FALSE;
|
||||||
|
LPBYTE versionInfo = NULL;
|
||||||
|
UINT size;
|
||||||
|
VS_FIXEDFILEINFO *vinfo;
|
||||||
|
|
||||||
|
/* Load dll explictely from System32 to avoid Dll hijacking attacks*/
|
||||||
|
if (!GetSystemDirectory(dllPath, MAX_PATH))
|
||||||
|
StringCbCopyW(dllPath, sizeof(dllPath), L"C:\\Windows\\System32");
|
||||||
|
|
||||||
|
StringCbCatW(dllPath, sizeof(dllPath), L"\\");
|
||||||
|
StringCbCatW(dllPath, sizeof(dllPath), L"Kernel32.dll");
|
||||||
|
|
||||||
|
size = GetFileVersionInfoSizeW(dllPath, NULL);
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
versionInfo = (LPBYTE) TCalloc(size);
|
||||||
|
if (GetFileVersionInfo(dllPath, 0, size, versionInfo))
|
||||||
|
{
|
||||||
|
|
||||||
|
if (VerQueryValueW(versionInfo, L"\\", (LPVOID *)&vinfo, &size) && (size >=sizeof(VS_FIXEDFILEINFO)))
|
||||||
|
{
|
||||||
|
*pdwMajor = HIWORD(vinfo->dwProductVersionMS);
|
||||||
|
*pdwMinor = LOWORD(vinfo->dwProductVersionMS);
|
||||||
|
*pdwBuildNumber = HIWORD(vinfo->dwProductVersionLS);
|
||||||
|
bRet = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (versionInfo)
|
||||||
|
TCfree(versionInfo);
|
||||||
|
return bRet;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use RtlGetVersion to get Windows version because GetVersionEx is affected by application manifestation.
|
* Use RtlGetVersion to get Windows version because GetVersionEx is affected by application manifestation.
|
||||||
*/
|
*/
|
||||||
|
@ -2883,6 +2922,9 @@ typedef NTSTATUS (WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
|
||||||
static BOOL GetWindowsVersion(LPOSVERSIONINFOW lpVersionInformation)
|
static BOOL GetWindowsVersion(LPOSVERSIONINFOW lpVersionInformation)
|
||||||
{
|
{
|
||||||
BOOL bRet = FALSE;
|
BOOL bRet = FALSE;
|
||||||
|
#ifdef SETUP_DLL
|
||||||
|
DWORD dwMajor, dwMinor, dwBuildNumber;
|
||||||
|
#endif
|
||||||
RtlGetVersionPtr RtlGetVersionFn = (RtlGetVersionPtr) GetProcAddress(GetModuleHandle (L"ntdll.dll"), "RtlGetVersion");
|
RtlGetVersionPtr RtlGetVersionFn = (RtlGetVersionPtr) GetProcAddress(GetModuleHandle (L"ntdll.dll"), "RtlGetVersion");
|
||||||
if (RtlGetVersionFn != NULL)
|
if (RtlGetVersionFn != NULL)
|
||||||
{
|
{
|
||||||
|
@ -2893,6 +2935,17 @@ static BOOL GetWindowsVersion(LPOSVERSIONINFOW lpVersionInformation)
|
||||||
if (!bRet)
|
if (!bRet)
|
||||||
bRet = GetVersionExW (lpVersionInformation);
|
bRet = GetVersionExW (lpVersionInformation);
|
||||||
|
|
||||||
|
#ifdef SETUP_DLL
|
||||||
|
// we get real version from Kernel32.dll version since MSI always sets current version to 6.0
|
||||||
|
// https://stackoverflow.com/questions/49335885/windows-10-not-detecting-on-installshield/49343826#49343826
|
||||||
|
if (GetWindowVersionFromFile(&dwMajor, &dwMinor, &dwBuildNumber))
|
||||||
|
{
|
||||||
|
lpVersionInformation->dwMajorVersion = dwMajor;
|
||||||
|
lpVersionInformation->dwMinorVersion = dwMinor;
|
||||||
|
lpVersionInformation->dwBuildNumber = dwBuildNumber;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return bRet;
|
return bRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue