mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 19:53:22 +08:00
44 lines
1.3 KiB
C++
44 lines
1.3 KiB
C++
#include "stdafx.h"
|
|
|
|
#include <string>
|
|
#include <memory>
|
|
|
|
namespace utils
|
|
{
|
|
|
|
std::string GetWinErrorText(DWORD dwError)
|
|
{
|
|
HLOCAL hLocal = NULL; // Buffer that gets the error message string
|
|
|
|
// Get the error code's textual description
|
|
DWORD strSize = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
NULL, dwError, 0 /* Default language */, (LPSTR) &hLocal, 0, NULL);
|
|
|
|
if (!strSize)
|
|
{
|
|
// Is it a network-related error?
|
|
HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES);
|
|
if (hDll == INVALID_HANDLE_VALUE)
|
|
return std::string("Can't load netmsg.dll");
|
|
std::tr1::shared_ptr<void> guard1(hDll, ::FreeLibrary);
|
|
strSize = FormatMessageA(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM,
|
|
hDll, dwError, 0 /* Default language */, (LPSTR) &hLocal, 0, NULL);
|
|
}
|
|
|
|
if (strSize != NULL)
|
|
{
|
|
std::tr1::shared_ptr<void> guard2(hLocal, ::LocalFree);
|
|
std::string str;
|
|
str += reinterpret_cast<const char*>(::LocalLock(hLocal));
|
|
return str;
|
|
}
|
|
|
|
return std::string("Unknown error.");
|
|
}
|
|
|
|
std::string GetLastErrorStr()
|
|
{
|
|
return GetWinErrorText(::GetLastError());
|
|
}
|
|
|
|
} // namespace utils
|