8181 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8282 *
8383 **********************************************************************/
84+ #include < sstream>
8485#include < stdio.h>
8586#include < stdlib.h>
87+ #include < string>
8688#include < tchar.h>
8789#include < windows.h>
8890#pragma comment(lib, "version.lib") // for "VerQueryValue"
@@ -1416,15 +1418,63 @@ void StackWalker::OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr)
14161418 OnOutput (buffer);
14171419}
14181420
1421+ namespace
1422+ {
1423+ namespace details
1424+ {
1425+ namespace char_traits
1426+ {
1427+ template <typename char_type> std::size_t length (const char_type* s)
1428+ {
1429+ return strlen (s);
1430+ }
1431+
1432+ template <> std::size_t length (const WCHAR* s)
1433+ {
1434+ return wcslen (s);
1435+ }
1436+ } // namespace char_traits
1437+ } // namespace details
1438+
1439+ template <typename OsInfo> std::string to_string (const OsInfo& osInfo)
1440+ {
1441+ std::ostringstream oss;
1442+ oss << " OS-Version: " << osInfo.dwMajorVersion << " ." << osInfo.dwMinorVersion << " ."
1443+ << osInfo.dwBuildNumber ;
1444+ if (details::char_traits::length (osInfo.szCSDVersion ) > 0 )
1445+ {
1446+ oss << " (" << osInfo.szCSDVersion << " )" ;
1447+ }
1448+ oss << " 0x" << std::hex << osInfo.wSuiteMask << " -0x" << std::hex
1449+ << static_cast <unsigned int >(osInfo.wProductType );
1450+ oss << std::endl;
1451+ return oss.str ();
1452+ }
1453+
1454+ template <> std::string to_string (const OSVERSIONINFOA& osInfo)
1455+ {
1456+ std::ostringstream oss;
1457+ oss << " OS-Version: " << osInfo.dwMajorVersion << " ." << osInfo.dwMinorVersion << " ."
1458+ << osInfo.dwBuildNumber ;
1459+ if (details::char_traits::length (osInfo.szCSDVersion ) > 0 )
1460+ {
1461+ oss << " (" << osInfo.szCSDVersion << " )" ;
1462+ }
1463+ oss << std::endl;
1464+ return oss.str ();
1465+ }
1466+ } // namespace
1467+
14191468void StackWalker::OnSymInit (LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)
14201469{
14211470 CHAR buffer[STACKWALK_MAX_NAMELEN];
14221471 size_t maxLen = STACKWALK_MAX_NAMELEN;
14231472#if _MSC_VER >= 1400
14241473 maxLen = _TRUNCATE;
14251474#endif
1426- _snprintf_s (buffer, sizeof (buffer), maxLen, " SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n " ,
1427- szSearchPath, symOptions, szUserName);
1475+ _snprintf_s (buffer, sizeof (buffer), maxLen,
1476+ " SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n " , szSearchPath,
1477+ symOptions, szUserName);
14281478 buffer[_countof (buffer) - 1 ] = ' \0 ' ;
14291479 OnOutput (buffer);
14301480
@@ -1439,37 +1489,39 @@ void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUser
14391489 RTL_OSVERSIONINFOEXW osInfo;
14401490 osInfo.dwOSVersionInfoSize = sizeof (osInfo);
14411491 f_RtlGetVersion (&osInfo);
1442- CHAR servicePack[128 ] = {' \0 ' };
1443- if (wcslen (osInfo.szCSDVersion ) > 0 )
1444- {
1445- _snprintf_s (servicePack, sizeof (servicePack), _countof (servicePack), " (%s) " , osInfo.szCSDVersion );
1446- }
1447- _snprintf_s (buffer, sizeof (buffer), maxLen, " OS-Version: %d.%d.%d %s0x%x-0x%x\n " ,
1448- osInfo.dwMajorVersion , osInfo.dwMinorVersion , osInfo.dwBuildNumber , servicePack,
1449- osInfo.wSuiteMask , osInfo.wProductType );
1450- buffer[_countof (buffer) - 1 ] = ' \0 ' ;
1451- OnOutput (buffer);
1492+ // CHAR servicePack[128] = {'\0'};
1493+ // if (wcslen(osInfo.szCSDVersion) > 0)
1494+ // {
1495+ // _snprintf_s(servicePack, sizeof(servicePack), _countof(servicePack), "(%s) ", osInfo.szCSDVersion);
1496+ // }
1497+ // _snprintf_s(buffer, sizeof(buffer), maxLen, "OS-Version: %d.%d.%d %s0x%x-0x%x\n",
1498+ // osInfo.dwMajorVersion, osInfo.dwMinorVersion, osInfo.dwBuildNumber, servicePack,
1499+ // osInfo.wSuiteMask, osInfo.wProductType);
1500+ // buffer[_countof(buffer) - 1] = '\0';
1501+ // OnOutput(buffer);
1502+ OnOutput (::to_string (osInfo).c_str ());
14521503 }
14531504#else
14541505#if _MSC_VER <= 1200
1455- OSVERSIONINFOA ver ;
1506+ OSVERSIONINFOA osInfo ;
14561507#else
1457- OSVERSIONINFOEXA ver ;
1508+ OSVERSIONINFOEXA osInfo ;
14581509#endif
1459- ZeroMemory (&ver , sizeof (ver ));
1460- ver .dwOSVersionInfoSize = sizeof (ver );
1461- if (GetVersionExA (&ver ) != FALSE )
1510+ ZeroMemory (&osInfo , sizeof (osInfo ));
1511+ osInfo .dwOSVersionInfoSize = sizeof (osInfo );
1512+ if (GetVersionExA ((OSVERSIONINFOA*)&osInfo ) != FALSE )
14621513 {
1463- #if _MSC_VER <= 1200
1464- _snprintf_s (buffer, sizeof (buffer), maxLen, " OS-Version: %d.%d.%d (%s)\n " , ver.dwMajorVersion ,
1465- ver.dwMinorVersion , ver.dwBuildNumber , ver.szCSDVersion );
1466- #else
1467- _snprintf_s (buffer, sizeof (buffer), maxLen, " OS-Version: %d.%d.%d (%s) 0x%x-0x%x\n " , ver.dwMajorVersion ,
1468- ver.dwMinorVersion , ver.dwBuildNumber , ver.szCSDVersion , ver.wSuiteMask ,
1469- ver.wProductType );
1470- #endif
1471- buffer[_countof (buffer) - 1 ] = ' \0 ' ;
1472- OnOutput (buffer);
1514+ // #if _MSC_VER <= 1200
1515+ // _snprintf_s(buffer, sizeof(buffer), maxLen, "OS-Version: %d.%d.%d (%s)\n", ver.dwMajorVersion,
1516+ // ver.dwMinorVersion, ver.dwBuildNumber, ver.szCSDVersion);
1517+ // #else
1518+ // _snprintf_s(buffer, sizeof(buffer), maxLen, "OS-Version: %d.%d.%d (%s) 0x%x-0x%x\n", ver.dwMajorVersion,
1519+ // ver.dwMinorVersion, ver.dwBuildNumber, ver.szCSDVersion, ver.wSuiteMask,
1520+ // ver.wProductType);
1521+ // #endif
1522+ // buffer[_countof(buffer) - 1] = '\0';
1523+ // OnOutput(buffer);
1524+ OnOutput (::to_string (osInfo).c_str ());
14731525 }
14741526#endif
14751527}
0 commit comments