Skip to content

Commit a7127f2

Browse files
author
Matthieu Longo
committed
Refactor code using C++ STL (should be compatible C++03 I guess)
1 parent 413118d commit a7127f2

1 file changed

Lines changed: 79 additions & 27 deletions

File tree

Main/StackWalker/StackWalker.cpp

Lines changed: 79 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,10 @@
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+
14191468
void 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

Comments
 (0)