Skip to content

Commit 3110f60

Browse files
author
Matthieu Longo
committed
Refactor code using C++ STL (should be compatible C++03 I guess)
1 parent 6dacd30 commit 3110f60

1 file changed

Lines changed: 79 additions & 29 deletions

File tree

Main/StackWalker/StackWalker.cpp

Lines changed: 79 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,17 @@
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+
14211468
void 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

Comments
 (0)