#include <Windows.h>
#include <cstdio>
#include <string>
#include <sstream>
#include <fstream>
#include <iomanip>
#include "common.h"
std::string GetPluginName()
{
std::stringstream ss_name;
ss_name << "BWAPI " << BWAPI_VER << " Injector [" << BUILD_STR << "]";
return ss_name.str();
}
std::string GetBWAPITarget()
{
return GetBWAPIDataDirectory() + ("\\" MODULE);
}
std::string GetBWAPIDataDirectory()
{
std::string sInstallPath = GetRegString("SOFTWARE\\Blizzard Entertainment\\Starcraft", "InstallPath");
return sInstallPath + "\\bwapi-data";
}
DWORD GetSingleRegString(HKEY hBaseKey, const char *pszSubKey, const char *pszValueName, char *pszOutput, DWORD *dwOutSize)
{
HKEY hKey = NULL;
pszOutput[0] = '\0';
DWORD dwErrCode = RegOpenKeyExA(hBaseKey, pszSubKey, 0, KEY_QUERY_VALUE, &hKey);
if ( dwErrCode != ERROR_SUCCESS )
return dwErrCode;
dwErrCode = RegQueryValueExA(hKey, pszValueName, NULL, NULL, (LPBYTE)pszOutput, dwOutSize);
RegCloseKey(hKey);
return dwErrCode;
}
std::string GetRegString(const char *pszSubKey, const char *pszValueName)
{
char szTemp[MAX_PATH];
DWORD dwSize = MAX_PATH;
DWORD dwErrCode = GetSingleRegString(HKEY_CURRENT_USER, pszSubKey, pszValueName, szTemp, &dwSize);
if (dwErrCode != ERROR_SUCCESS)
{
GetSingleRegString(HKEY_LOCAL_MACHINE, pszSubKey, pszValueName, szTemp, &dwSize);
}
return std::string(szTemp);
}
bool BWAPIError(const char *format, ...)
{
char buffer[MAX_PATH];
va_list ap;
va_start(ap, format);
vsnprintf_s(buffer, MAX_PATH, MAX_PATH, format, ap);
va_end(ap);
wchar_t szErrMsg[MAX_PATH];
DWORD dwLastError = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwLastError, 0, szErrMsg, MAX_PATH, NULL);
std::wostringstream errorMessage;
errorMessage << buffer << '\n'
<< "ID " << reinterpret_cast<void*>(dwLastError) << ": \n"
<< szErrMsg << std::endl;
std::wofstream log{ "bwapi-error.txt", std::ios::app };
if (log)
{
const time_t now = std::time(nullptr);
log << '[' << std::put_time(std::localtime(&now), L"%F %T") << "] " << errorMessage.str();
}
MessageBox(NULL, errorMessage.str().c_str(), NULL, MB_OK | MB_ICONERROR);
return false;
}