8181 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8282 *
8383 **********************************************************************/
84-
8584#include " StackWalker.h"
8685
86+ #include < sstream>
8787#include < stdio.h>
8888#include < stdlib.h>
89+ #include < string>
8990#include < tchar.h>
9091#include < windows.h>
9192#pragma comment(lib, "version.lib") // for "VerQueryValue"
9293#pragma warning(disable : 4826)
9394
94-
9595// If VC7 and later, then use the shipped 'dbghelp.h'-file
9696#pragma pack(push, 8)
9797#if _MSC_VER >= 1300
@@ -1418,15 +1418,63 @@ void StackWalker::OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr)
14181418 OnOutput (buffer);
14191419}
14201420
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+
14211468void StackWalker::OnSymInit (LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)
14221469{
14231470 CHAR buffer[STACKWALK_MAX_NAMELEN];
14241471 size_t maxLen = STACKWALK_MAX_NAMELEN;
14251472#if _MSC_VER >= 1400
14261473 maxLen = _TRUNCATE;
14271474#endif
1428- _snprintf_s (buffer, sizeof (buffer), maxLen, " SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n " ,
1429- szSearchPath, symOptions, szUserName);
1475+ _snprintf_s (buffer, sizeof (buffer), maxLen,
1476+ " SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n " , szSearchPath,
1477+ symOptions, szUserName);
14301478 buffer[_countof (buffer) - 1 ] = ' \0 ' ;
14311479 OnOutput (buffer);
14321480
@@ -1441,37 +1489,39 @@ void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUser
14411489 RTL_OSVERSIONINFOEXW osInfo;
14421490 osInfo.dwOSVersionInfoSize = sizeof (osInfo);
14431491 f_RtlGetVersion (&osInfo);
1444- CHAR servicePack[128 ] = {' \0 ' };
1445- if (wcslen (osInfo.szCSDVersion ) > 0 )
1446- {
1447- _snprintf_s (servicePack, sizeof (servicePack), _countof (servicePack), " (%s) " , 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);
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 ());
14541503 }
14551504#else
14561505#if _MSC_VER <= 1200
1457- OSVERSIONINFOA ver ;
1506+ OSVERSIONINFOA osInfo ;
14581507#else
1459- OSVERSIONINFOEXA ver ;
1508+ OSVERSIONINFOEXA osInfo ;
14601509#endif
1461- ZeroMemory (&ver , sizeof (ver ));
1462- ver .dwOSVersionInfoSize = sizeof (ver );
1463- if (GetVersionExA (&ver ) != FALSE )
1510+ ZeroMemory (&osInfo , sizeof (osInfo ));
1511+ osInfo .dwOSVersionInfoSize = sizeof (osInfo );
1512+ if (GetVersionExA ((OSVERSIONINFOA*)&osInfo ) != FALSE )
14641513 {
1465- #if _MSC_VER <= 1200
1466- _snprintf_s (buffer, sizeof (buffer), maxLen, " OS-Version: %d.%d.%d (%s)\n " , ver.dwMajorVersion ,
1467- ver.dwMinorVersion , ver.dwBuildNumber , ver.szCSDVersion );
1468- #else
1469- _snprintf_s (buffer, sizeof (buffer), maxLen, " OS-Version: %d.%d.%d (%s) 0x%x-0x%x\n " , ver.dwMajorVersion ,
1470- ver.dwMinorVersion , ver.dwBuildNumber , ver.szCSDVersion , ver.wSuiteMask ,
1471- ver.wProductType );
1472- #endif
1473- buffer[_countof (buffer) - 1 ] = ' \0 ' ;
1474- 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 ());
14751525 }
14761526#endif
14771527}
0 commit comments