diff options
author | jan.nijtmans <jan.nijtmans@noemail.net> | 2014-02-04 08:35:02 (GMT) |
---|---|---|
committer | jan.nijtmans <jan.nijtmans@noemail.net> | 2014-02-04 08:35:02 (GMT) |
commit | 61ecb5fb5ce6b1d15d57c3228e2e9868d08a71ef (patch) | |
tree | 063c791e55d86b9c923c8e536fe584a2c56e2d02 /win | |
parent | 74bc5015d687fed83cbe99f0a1d12394d4463eec (diff) | |
download | tk-61ecb5fb5ce6b1d15d57c3228e2e9868d08a71ef.zip tk-61ecb5fb5ce6b1d15d57c3228e2e9868d08a71ef.tar.gz tk-61ecb5fb5ce6b1d15d57c3228e2e9868d08a71ef.tar.bz2 |
Fix [http://core.tcl.tk/tcl/info/651e828a52|651e828a52]: Wrong Windows version reported for Windows 8.1
FossilOrigin-Name: 380b17045fce105356c09bf3aa0a39ba09870058
Diffstat (limited to 'win')
-rw-r--r-- | win/tkWinX.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/win/tkWinX.c b/win/tkWinX.c index 60e5e90..a37fa0a 100644 --- a/win/tkWinX.c +++ b/win/tkWinX.c @@ -166,20 +166,31 @@ TkGetServerInfo( Tk_Window tkwin) /* Token for window; this selects a particular * display and server. */ { - char buffer[60]; + static char buffer[32]; /* Empty string means not initialized yet. */ OSVERSIONINFOW os; - os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); - GetVersionExW(&os); - sprintf(buffer, "Windows %d.%d %d %s", (int)os.dwMajorVersion, - (int)os.dwMinorVersion, (int)os.dwBuildNumber, + if (!buffer[0]) { + HANDLE handle = LoadLibraryW(L"NTDLL"); + int(*getversion)(void *) = (int(*)(void *))GetProcAddress(handle, "RtlGetVersion"); + os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); + if (!getversion || getversion(&os)) { + GetVersionExW(&os); + } + if (handle) { + FreeLibrary(handle); + } + /* Write the first character last, preventing multi-thread issues. */ + sprintf(buffer+1, "indows %d.%d %d %s", (int)os.dwMajorVersion, + (int)os.dwMinorVersion, (int)os.dwBuildNumber, #ifdef _WIN64 - "Win64" + "Win64" #else - "Win32" + "Win32" #endif - ); - Tcl_SetResult(interp, buffer, TCL_VOLATILE); + ); + buffer[0] = 'W'; + } + Tcl_SetResult(interp, buffer, TCL_STATIC); } /* |