@@ -1423,41 +1423,56 @@ void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUser
14231423#if _MSC_VER >= 1400
14241424 maxLen = _TRUNCATE;
14251425#endif
1426- _snprintf_s (buffer, maxLen, " SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n " ,
1427- szSearchPath, symOptions, szUserName);
1428- buffer[STACKWALK_MAX_NAMELEN - 1 ] = 0 ;
1426+ _snprintf_s (buffer, sizeof (buffer), maxLen,
1427+ " SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n " , szSearchPath,
1428+ symOptions, szUserName);
1429+ buffer[_countof (buffer) - 1 ] = ' \0 ' ;
14291430 OnOutput (buffer);
1431+
14301432 // Also display the OS-version
1433+ #if _WIN32_WINNT > 0x0600 // _WIN32_WINNT_VISTA
1434+ // Get a handle on RtlGetVersion
1435+ HMODULE h_NtDll = GetModuleHandleW (L" ntdll.dll" );
1436+ typedef LONG (WINAPI * tRtlGetVersion)(RTL_OSVERSIONINFOEXW*);
1437+ tRtlGetVersion f_RtlGetVersion = (tRtlGetVersion)GetProcAddress (h_NtDll, " RtlGetVersion" );
1438+ if (f_RtlGetVersion)
1439+ {
1440+ RTL_OSVERSIONINFOEXW osInfo;
1441+ osInfo.dwOSVersionInfoSize = sizeof (osInfo);
1442+ f_RtlGetVersion (&osInfo);
1443+ CHAR servicePack[128 ] = {' \0 ' };
1444+ if (wcslen (osInfo.szCSDVersion ) > 0 )
1445+ {
1446+ _snprintf_s (servicePack, sizeof (servicePack), _countof (servicePack), " (%s) " ,
1447+ osInfo.szCSDVersion );
1448+ }
1449+ _snprintf_s (buffer, sizeof (buffer), maxLen, " OS-Version: %d.%d.%d %s0x%x-0x%x\n " ,
1450+ osInfo.dwMajorVersion , osInfo.dwMinorVersion , osInfo.dwBuildNumber , servicePack,
1451+ osInfo.wSuiteMask , osInfo.wProductType );
1452+ buffer[_countof (buffer) - 1 ] = ' \0 ' ;
1453+ OnOutput (buffer);
1454+ }
1455+ #else
14311456#if _MSC_VER <= 1200
14321457 OSVERSIONINFOA ver;
1433- ZeroMemory (&ver, sizeof (OSVERSIONINFOA));
1458+ #else
1459+ OSVERSIONINFOEXA ver;
1460+ #endif
1461+ ZeroMemory (&ver, sizeof (ver));
14341462 ver.dwOSVersionInfoSize = sizeof (ver);
14351463 if (GetVersionExA (&ver) != FALSE )
14361464 {
1437- _snprintf_s (buffer, maxLen, " OS-Version: %d.%d.%d (%s)\n " , ver.dwMajorVersion ,
1465+ #if _MSC_VER <= 1200
1466+ _snprintf_s (buffer, sizeof (buffer), maxLen, " OS-Version: %d.%d.%d (%s)\n " , ver.dwMajorVersion ,
14381467 ver.dwMinorVersion , ver.dwBuildNumber , ver.szCSDVersion );
1439- buffer[STACKWALK_MAX_NAMELEN - 1 ] = 0 ;
1440- OnOutput (buffer);
1441- }
14421468#else
1443- OSVERSIONINFOEXA ver;
1444- ZeroMemory (&ver, sizeof (OSVERSIONINFOEXA));
1445- ver.dwOSVersionInfoSize = sizeof (ver);
1446- #if _MSC_VER >= 1900
1447- #pragma warning(push)
1448- #pragma warning(disable : 4996)
1469+ _snprintf_s (buffer, sizeof (buffer), maxLen, " OS-Version: %d.%d.%d (%s) 0x%x-0x%x\n " ,
1470+ ver.dwMajorVersion , ver.dwMinorVersion , ver.dwBuildNumber , ver.szCSDVersion ,
1471+ ver.wSuiteMask , ver.wProductType );
14491472#endif
1450- if (GetVersionExA ((OSVERSIONINFOA*)&ver) != FALSE )
1451- {
1452- _snprintf_s (buffer, maxLen, " OS-Version: %d.%d.%d (%s) 0x%x-0x%x\n " , ver.dwMajorVersion ,
1453- ver.dwMinorVersion , ver.dwBuildNumber , ver.szCSDVersion , ver.wSuiteMask ,
1454- ver.wProductType );
1455- buffer[STACKWALK_MAX_NAMELEN - 1 ] = 0 ;
1473+ buffer[_countof (buffer) - 1 ] = ' \0 ' ;
14561474 OnOutput (buffer);
14571475 }
1458- #if _MSC_VER >= 1900
1459- #pragma warning(pop)
1460- #endif
14611476#endif
14621477}
14631478
0 commit comments