20#pragma warning(disable: 4505)
26template<
class _Traits,
class _Ax>
27static DWORD
GetModuleFileNameA(_In_opt_ HMODULE hModule, _Out_ std::basic_string<char, _Traits, _Ax> &sValue)
noexcept
35 if (dwResult < _countof(szStackBuffer)) {
37 sValue.assign(szStackBuffer, dwResult);
42 std::unique_ptr<char[]> szBuffer(
new char[dwCapacity]);
44 if (dwResult < dwCapacity) {
45 sValue.assign(szBuffer.get(), dwResult);
57template<
class _Traits,
class _Ax>
58static DWORD
GetModuleFileNameW(_In_opt_ HMODULE hModule, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &sValue)
noexcept
64 if (dwResult < _countof(szStackBuffer)) {
66 sValue.assign(szStackBuffer, dwResult);
71 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[dwCapacity]);
73 if (dwResult < dwCapacity) {
74 sValue.assign(szBuffer.get(), dwResult);
82template<
class _Traits,
class _Ax>
83static _Success_(
return != 0) int
GetWindowTextA(_In_ HWND hWnd, _Out_ std::basic_string<
char, _Traits, _Ax> &sValue) noexcept
90 iResult = ::GetWindowTextLengthA(hWnd);
96 sValue.assign(szBuffer, iResult);
99 std::unique_ptr<char[]> szBuffer(
new char[++iResult]);
101 sValue.assign(szBuffer.get(), iResult);
115template<
class _Traits,
class _Ax>
116static _Success_(
return != 0) int
GetWindowTextW(_In_ HWND hWnd, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sValue) noexcept
123 iResult = ::GetWindowTextLengthW(hWnd);
129 sValue.assign(szBuffer, iResult);
132 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[++iResult]);
134 sValue.assign(szBuffer.get(), iResult);
144template<
class _Ty,
class _Ax>
145static _Success_(
return != 0) BOOL
GetFileVersionInfoA(_In_z_ LPCSTR lptstrFilename, __reserved DWORD dwHandle, _Out_ std::vector<_Ty, _Ax> &aValue) noexcept
150 DWORD dwVerInfoSize = ::GetFileVersionInfoSizeA(lptstrFilename, &dwHandle);
151 if (dwVerInfoSize != 0) {
153 aValue.resize((dwVerInfoSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
164template<
class _Ty,
class _Ax>
165static _Success_(
return != 0) BOOL
GetFileVersionInfoW(_In_z_ LPCWSTR lptstrFilename, __reserved DWORD dwHandle, _Out_ std::vector<_Ty, _Ax> &aValue) noexcept
170 DWORD dwVerInfoSize = ::GetFileVersionInfoSizeW(lptstrFilename, &dwHandle);
171 if (dwVerInfoSize != 0) {
173 aValue.resize((dwVerInfoSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
180template<
class _Traits,
class _Ax>
181static _Success_(
return != 0) DWORD
ExpandEnvironmentStringsA(_In_z_ LPCSTR lpSrc, _Out_ std::basic_string<
char, _Traits, _Ax> &sValue) noexcept
185 for (DWORD dwSizeOut = (DWORD)strlen(lpSrc) + 0x100;;) {
186 DWORD dwSizeIn = dwSizeOut;
187 std::unique_ptr<char[]> szBuffer(
new char[(
size_t)dwSizeIn + 2]);
189 if (dwSizeOut == 0) {
192 }
else if (dwSizeOut <= dwSizeIn) {
194 sValue.assign(szBuffer.get(), dwSizeOut - 1);
208template<
class _Traits,
class _Ax>
209static _Success_(
return != 0) DWORD
ExpandEnvironmentStringsW(_In_z_ LPCWSTR lpSrc, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sValue) noexcept
211 for (DWORD dwSizeOut = (DWORD)wcslen(lpSrc) + 0x100;;) {
212 DWORD dwSizeIn = dwSizeOut;
213 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[(
size_t)dwSizeIn + 1]);
215 if (dwSizeOut == 0) {
218 }
else if (dwSizeOut <= dwSizeIn) {
220 sValue.assign(szBuffer.get(), dwSizeOut - 1);
230template<
class _Traits,
class _Ax>
231static VOID
GuidToStringA(_In_ LPCGUID lpGuid, _Out_ std::basic_string<char, _Traits, _Ax> &str)
noexcept
235 sprintf(str,
"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
239 lpGuid->Data4[0], lpGuid->Data4[1],
240 lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]);
249template<
class _Traits,
class _Ax>
250static VOID
GuidToStringW(_In_ LPCGUID lpGuid, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &str)
noexcept
254 sprintf(str, L
"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
258 lpGuid->Data4[0], lpGuid->Data4[1],
259 lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]);
264#define GuidToString GuidToStringW
266#define GuidToString GuidToStringA
270static _Success_(
return) BOOL
StringToGuidA(_In_z_ LPCSTR lpszGuid, _Out_ LPGUID lpGuid, _Out_opt_ LPCSTR *lpszGuidEnd = NULL)
noexcept
275 unsigned long long ullTmp;
277 if (!lpszGuid || !lpGuid || *lpszGuid !=
'{')
return FALSE;
280 g.Data1 = strtoul(lpszGuid, &lpszEnd, 16);
281 if (errno == ERANGE)
return FALSE;
284 if (*lpszGuid !=
'-')
return FALSE;
287 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
288 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
289 g.Data2 =
static_cast<unsigned short>(ulTmp);
292 if (*lpszGuid !=
'-')
return FALSE;
295 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
296 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
297 g.Data3 =
static_cast<unsigned short>(ulTmp);
300 if (*lpszGuid !=
'-')
return FALSE;
303 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
304 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
305 g.Data4[0] =
static_cast<unsigned char>((ulTmp >> 8) & 0xff);
306 g.Data4[1] =
static_cast<unsigned char>( ulTmp & 0xff);
309 if (*lpszGuid !=
'-')
return FALSE;
312 ullTmp = _strtoui64(lpszGuid, &lpszEnd, 16);
313 if (errno == ERANGE || ullTmp > 0xFFFFFFFFFFFF)
return FALSE;
314 g.Data4[2] =
static_cast<unsigned char>((ullTmp >> 40) & 0xff);
315 g.Data4[3] =
static_cast<unsigned char>((ullTmp >> 32) & 0xff);
316 g.Data4[4] =
static_cast<unsigned char>((ullTmp >> 24) & 0xff);
317 g.Data4[5] =
static_cast<unsigned char>((ullTmp >> 16) & 0xff);
318 g.Data4[6] =
static_cast<unsigned char>((ullTmp >> 8) & 0xff);
319 g.Data4[7] =
static_cast<unsigned char>( ullTmp & 0xff);
322 if (*lpszGuid !=
'}')
return FALSE;
326 *lpszGuidEnd = lpszGuid;
343static _Success_(
return) BOOL
StringToGuidW(_In_z_ LPCWSTR lpszGuid, _Out_ LPGUID lpGuid, _Out_opt_ LPCWSTR *lpszGuidEnd = NULL)
noexcept
348 unsigned long long ullTmp;
350 if (!lpszGuid || !lpGuid || *lpszGuid !=
'{')
return FALSE;
353 g.Data1 = wcstoul(lpszGuid, &lpszEnd, 16);
354 if (errno == ERANGE)
return FALSE;
357 if (*lpszGuid !=
'-')
return FALSE;
360 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
361 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
362 g.Data2 =
static_cast<unsigned short>(ulTmp);
365 if (*lpszGuid !=
'-')
return FALSE;
368 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
369 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
370 g.Data3 =
static_cast<unsigned short>(ulTmp);
373 if (*lpszGuid !=
'-')
return FALSE;
376 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
377 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
378 g.Data4[0] =
static_cast<unsigned char>((ulTmp >> 8) & 0xff);
379 g.Data4[1] =
static_cast<unsigned char>( ulTmp & 0xff);
382 if (*lpszGuid !=
'-')
return FALSE;
385 ullTmp = _wcstoui64(lpszGuid, &lpszEnd, 16);
386 if (errno == ERANGE || ullTmp > 0xFFFFFFFFFFFF)
return FALSE;
387 g.Data4[2] =
static_cast<unsigned char>((ullTmp >> 40) & 0xff);
388 g.Data4[3] =
static_cast<unsigned char>((ullTmp >> 32) & 0xff);
389 g.Data4[4] =
static_cast<unsigned char>((ullTmp >> 24) & 0xff);
390 g.Data4[5] =
static_cast<unsigned char>((ullTmp >> 16) & 0xff);
391 g.Data4[6] =
static_cast<unsigned char>((ullTmp >> 8) & 0xff);
392 g.Data4[7] =
static_cast<unsigned char>( ullTmp & 0xff);
395 if (*lpszGuid !=
'}')
return FALSE;
399 *lpszGuidEnd = lpszGuid;
407#define StringToGuid StringToGuidW
409#define StringToGuid StringToGuidA
430template<
class _Traits,
class _Ax>
431static LSTATUS
RegQueryStringValue(_In_ HKEY hReg, _In_z_ LPCSTR pszName, _Out_ std::basic_string<char, _Traits, _Ax> &sValue)
noexcept
435 DWORD dwSize =
sizeof(aStackBuffer), dwType;
439 if (lResult == ERROR_SUCCESS) {
440 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
442 dwSize /=
sizeof(CHAR);
443 sValue.assign(
reinterpret_cast<LPCSTR
>(aStackBuffer), dwSize &&
reinterpret_cast<LPCSTR
>(aStackBuffer)[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
444 }
else if (dwType == REG_EXPAND_SZ) {
447 lResult = ::GetLastError();
450 lResult = ERROR_INVALID_DATA;
452 }
else if (lResult == ERROR_MORE_DATA) {
453 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
455 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[dwSize /
sizeof(CHAR)]);
456 if ((lResult =
::RegQueryValueExA(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
457 dwSize /=
sizeof(CHAR);
458 sValue.assign(szBuffer.get(), dwSize && szBuffer[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
460 }
else if (dwType == REG_EXPAND_SZ) {
462 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[dwSize /
sizeof(CHAR)]);
463 if ((lResult =
::RegQueryValueExA(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
465 lResult = ::GetLastError();
469 lResult = ERROR_INVALID_DATA;
494template<
class _Traits,
class _Ax>
495static LSTATUS
RegQueryStringValue(_In_ HKEY hReg, _In_z_ LPCWSTR pszName, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &sValue)
noexcept
499 DWORD dwSize =
sizeof(aStackBuffer), dwType;
503 if (lResult == ERROR_SUCCESS) {
504 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
506 dwSize /=
sizeof(WCHAR);
507 sValue.assign(
reinterpret_cast<LPCWSTR
>(aStackBuffer), dwSize &&
reinterpret_cast<LPCWSTR
>(aStackBuffer)[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
508 }
else if (dwType == REG_EXPAND_SZ) {
511 lResult = ::GetLastError();
514 lResult = ERROR_INVALID_DATA;
516 }
else if (lResult == ERROR_MORE_DATA) {
517 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
519 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[dwSize /
sizeof(WCHAR)]);
520 if ((lResult =
::RegQueryValueExW(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
521 dwSize /=
sizeof(WCHAR);
522 sValue.assign(szBuffer.get(), dwSize && szBuffer[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
524 }
else if (dwType == REG_EXPAND_SZ) {
526 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[dwSize /
sizeof(WCHAR)]);
527 if ((lResult =
::RegQueryValueExW(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
529 lResult = ::GetLastError();
533 lResult = ERROR_INVALID_DATA;
541template<
class _Ty,
class _Ax>
542static LSTATUS
RegQueryValueExA(_In_ HKEY hKey, _In_opt_z_ LPCSTR lpValueName, __reserved LPDWORD lpReserved, _Out_opt_ LPDWORD lpType, _Out_ std::vector<_Ty, _Ax> &aData)
noexcept
546 DWORD dwSize =
sizeof(aStackBuffer);
549 lResult =
RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, aStackBuffer, &dwSize);
550 if (lResult == ERROR_SUCCESS) {
552 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
553 memcpy(aData.data(), aStackBuffer, dwSize);
554 }
else if (lResult == ERROR_MORE_DATA) {
556 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
557 lResult =
RegQueryValueExA(hKey, lpValueName, lpReserved, NULL, aData.data(), &dwSize);
568template<
class _Ty,
class _Ax>
569static LSTATUS
RegQueryValueExW(_In_ HKEY hKey, _In_opt_z_ LPCWSTR lpValueName, __reserved LPDWORD lpReserved, _Out_opt_ LPDWORD lpType, _Out_ std::vector<_Ty, _Ax> &aData)
noexcept
573 DWORD dwSize =
sizeof(aStackBuffer);
576 lResult =
RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, aStackBuffer, &dwSize);
577 if (lResult == ERROR_SUCCESS) {
579 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
580 memcpy(aData.data(), aStackBuffer, dwSize);
581 }
else if (lResult == ERROR_MORE_DATA) {
583 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
584 lResult =
RegQueryValueExW(hKey, lpValueName, lpReserved, NULL, aData.data(), &dwSize);
590#if _WIN32_WINNT >= _WIN32_WINNT_VISTA
593template<
class _Traits,
class _Ax>
594static LSTATUS
RegLoadMUIStringA(_In_ HKEY hKey, _In_opt_z_ LPCSTR pszValue, _Out_ std::basic_string<char, _Traits, _Ax> &sOut, _In_ DWORD Flags, _In_opt_z_ LPCSTR pszDirectory)
noexcept
599 return ERROR_CALL_NOT_IMPLEMENTED;
607template<
class _Traits,
class _Ax>
608static LSTATUS
RegLoadMUIStringW(_In_ HKEY hKey, _In_opt_z_ LPCWSTR pszValue, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &sOut, _In_ DWORD Flags, _In_opt_z_ LPCWSTR pszDirectory)
noexcept
614 Flags &= ~REG_MUI_STRING_TRUNCATE;
617 lResult =
RegLoadMUIStringW(hKey, pszValue, szStackBuffer,
sizeof(szStackBuffer), &dwSize, Flags, pszDirectory);
618 if (lResult == ERROR_SUCCESS) {
620 sOut.assign(szStackBuffer, wcsnlen(szStackBuffer, dwSize/
sizeof(
wchar_t)));
621 }
else if (lResult == ERROR_MORE_DATA) {
623 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[(dwSize +
sizeof(
wchar_t) - 1)/
sizeof(
wchar_t)]);
624 sOut.assign(szBuffer.get(), (lResult =
RegLoadMUIStringW(hKey, pszValue, szBuffer.get(), dwSize, &dwSize, Flags, pszDirectory)) == ERROR_SUCCESS ? wcsnlen(szBuffer.get(), dwSize/
sizeof(
wchar_t)) : 0);
637template<
class _Traits,
class _Ax>
638static _Success_(
return != 0) int
WideCharToMultiByte(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_count_(cchWideChar) LPCWSTR lpWideCharStr, _In_
int cchWideChar, _Out_ std::basic_string<
char, _Traits, _Ax> &sMultiByteStr, _In_opt_z_ LPCSTR lpDefaultChar, _Out_opt_ LPBOOL lpUsedDefaultChar) noexcept
643 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
646 sMultiByteStr.assign(szStackBuffer, cchWideChar != -1 ? strnlen(szStackBuffer, cch) : (
size_t)cch - 1);
647 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
649 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
650 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
651 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
652 sMultiByteStr.assign(szBuffer.get(), cchWideChar != -1 ? strnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
664static _Success_(
return != 0) int
WideCharToMultiByte(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_count_(cchWideChar) LPCWSTR lpWideCharStr, _In_
int cchWideChar, _Out_ std::vector<
char, _Ax> &sMultiByteStr, _In_opt_z_ LPCSTR lpDefaultChar, _Out_opt_ LPBOOL lpUsedDefaultChar) noexcept
669 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
672 sMultiByteStr.assign(szStackBuffer, szStackBuffer + cch);
673 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
675 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
676 sMultiByteStr.resize(cch);
677 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, sMultiByteStr.data(), cch, lpDefaultChar, lpUsedDefaultChar);
688template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
689static _Success_(
return != 0) int
WideCharToMultiByte(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_ std::basic_string<
wchar_t, _Traits1, _Ax1> sWideCharStr, _Out_ std::basic_string<
char, _Traits2, _Ax2> &sMultiByteStr, _In_opt_z_ LPCSTR lpDefaultChar, _Out_opt_ LPBOOL lpUsedDefaultChar) noexcept
694 int cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
697 sMultiByteStr.assign(szStackBuffer, cch);
698 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
700 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), NULL, 0, lpDefaultChar, lpUsedDefaultChar);
701 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
702 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
703 sMultiByteStr.assign(szBuffer.get(), cch);
716template<
class _Traits,
class _Ax>
717static _Success_(
return != 0) int
SecureWideCharToMultiByte(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_count_(cchWideChar) LPCWSTR lpWideCharStr, _In_
int cchWideChar, _Out_ std::basic_string<
char, _Traits, _Ax> &sMultiByteStr, _In_opt_z_ LPCSTR lpDefaultChar, _Out_opt_ LPBOOL lpUsedDefaultChar) noexcept
722 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
725 sMultiByteStr.assign(szStackBuffer, cchWideChar != -1 ? strnlen(szStackBuffer, cch) : (
size_t)cch - 1);
726 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
728 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
729 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
730 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
731 sMultiByteStr.assign(szBuffer.get(), cchWideChar != -1 ? strnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
732 SecureZeroMemory(szBuffer.get(),
sizeof(CHAR)*cch);
735 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
748static _Success_(
return != 0) int
SecureWideCharToMultiByte(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_count_(cchWideChar) LPCWSTR lpWideCharStr, _In_
int cchWideChar, _Out_ std::vector<
char, _Ax> &sMultiByteStr, _In_opt_z_ LPCSTR lpDefaultChar, _Out_opt_ LPBOOL lpUsedDefaultChar) noexcept
753 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
756 sMultiByteStr.assign(szStackBuffer, szStackBuffer + cch);
757 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
759 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
760 sMultiByteStr.resize(cch);
761 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, sMultiByteStr.data(), cch, lpDefaultChar, lpUsedDefaultChar);
764 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
776template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
777static _Success_(
return != 0) int
SecureWideCharToMultiByte(_In_ UINT CodePage, _In_ DWORD dwFlags, _Out_ std::basic_string<
wchar_t, _Traits1, _Ax1> sWideCharStr, _Out_ std::basic_string<
char, _Traits2, _Ax2> &sMultiByteStr, _In_opt_z_ LPCSTR lpDefaultChar, _Out_opt_ LPBOOL lpUsedDefaultChar) noexcept
782 int cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
785 sMultiByteStr.assign(szStackBuffer, cch);
786 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
788 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), NULL, 0, lpDefaultChar, lpUsedDefaultChar);
789 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
790 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
791 sMultiByteStr.assign(szBuffer.get(), cch);
792 SecureZeroMemory(szBuffer.get(),
sizeof(CHAR)*cch);
795 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
805template<
class _Traits,
class _Ax>
806static _Success_(
return != 0) int
MultiByteToWideChar(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_count_(cbMultiByte) LPCSTR lpMultiByteStr, _In_
int cbMultiByte, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sWideCharStr) noexcept
811 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
814 sWideCharStr.assign(szStackBuffer, cbMultiByte != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
815 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
818 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
820 sWideCharStr.assign(szBuffer.get(), cbMultiByte != -1 ? wcsnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
832static _Success_(
return != 0) int
MultiByteToWideChar(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_count_(cbMultiByte) LPCSTR lpMultiByteStr, _In_
int cbMultiByte, _Out_ std::vector<
wchar_t, _Ax> &sWideCharStr) noexcept
837 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
840 sWideCharStr.assign(szStackBuffer, szStackBuffer + cch);
841 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
844 sWideCharStr.resize(cch);
845 cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, sWideCharStr.data(), cch);
856template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
857static _Success_(
return != 0) int
MultiByteToWideChar(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_ const std::basic_string<
char, _Traits1, _Ax1> &sMultiByteStr, _Out_ std::basic_string<
wchar_t, _Traits2, _Ax2> &sWideCharStr) noexcept
862 int cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szStackBuffer, _countof(szStackBuffer));
865 sWideCharStr.assign(szStackBuffer, cch);
866 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
868 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), NULL, 0);
869 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
870 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szBuffer.get(), cch);
871 sWideCharStr.assign(szBuffer.get(), cch);
884template<
class _Traits,
class _Ax>
885static _Success_(
return != 0) int
SecureMultiByteToWideChar(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_count_(cbMultiByte) LPCSTR lpMultiByteStr, _In_
int cbMultiByte, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sWideCharStr) noexcept
890 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
893 sWideCharStr.assign(szStackBuffer, cbMultiByte != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
894 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
897 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
899 sWideCharStr.assign(szBuffer.get(), cbMultiByte != -1 ? wcsnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
900 SecureZeroMemory(szBuffer.get(),
sizeof(WCHAR)*cch);
903 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
916static _Success_(
return != 0) int
SecureMultiByteToWideChar(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_z_count_(cbMultiByte) LPCSTR lpMultiByteStr, _In_
int cbMultiByte, _Out_ std::vector<
wchar_t, _Ax> &sWideCharStr) noexcept
921 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
924 sWideCharStr.assign(szStackBuffer, szStackBuffer + cch);
925 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
928 sWideCharStr.resize(cch);
929 cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, sWideCharStr.data(), cch);
932 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
944template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
945static _Success_(
return != 0) int
SecureMultiByteToWideChar(_In_ UINT CodePage, _In_ DWORD dwFlags, _In_ const std::basic_string<
char, _Traits1, _Ax1> &sMultiByteStr, _Out_ std::basic_string<
wchar_t, _Traits2, _Ax2> &sWideCharStr) noexcept
950 int cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szStackBuffer, _countof(szStackBuffer));
953 sWideCharStr.assign(szStackBuffer, cch);
954 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
956 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), NULL, 0);
957 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
958 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szBuffer.get(), cch);
959 sWideCharStr.assign(szBuffer.get(), cch);
960 SecureZeroMemory(szBuffer.get(),
sizeof(WCHAR)*cch);
963 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
973template<
class _Traits,
class _Ax>
974static _Success_(
return > 0) int
NormalizeString(_In_ NORM_FORM NormForm, _In_ LPCWSTR lpSrcString, _In_
int cwSrcLength, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sDstString) noexcept
979 int cch =
::NormalizeString(NormForm, lpSrcString, cwSrcLength, szStackBuffer, _countof(szStackBuffer));
982 sDstString.assign(szStackBuffer, cwSrcLength != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
984 switch (::GetLastError()) {
985 case ERROR_INSUFFICIENT_BUFFER:
986 for (
int i = 10; i--;) {
989 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
990 cch =
::NormalizeString(NormForm, lpSrcString, cwSrcLength, szBuffer.get(), cch);
992 sDstString.assign(szBuffer.get(), cwSrcLength != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
995 if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
1016template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
1017static _Success_(
return > 0) int
NormalizeString(_In_ NORM_FORM NormForm, _In_ const std::basic_string<
wchar_t, _Traits1, _Ax1> &sSrcString, _Out_ std::basic_string<
wchar_t, _Traits2, _Ax2> &sDstString) noexcept
1022 int cch =
::NormalizeString(NormForm, sSrcString.c_str(), (
int)sSrcString.length(), szStackBuffer, _countof(szStackBuffer));
1025 sDstString.assign(szStackBuffer, cch);
1027 switch (::GetLastError()) {
1028 case ERROR_INSUFFICIENT_BUFFER:
1029 for (
int i = 10; i--;) {
1032 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
1033 cch =
::NormalizeString(NormForm, sSrcString.c_str(), (
int)sSrcString.length(), szBuffer.get(), cch);
1035 sDstString.assign(szBuffer.get(), cch);
1038 if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
1055template<
class _Traits,
class _Ax>
1056static _Success_(
return != 0) int WINAPI
LoadStringA(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_ std::basic_string<
char, _Traits, _Ax> &sBuffer) noexcept
1060 int i =
LoadStringA(hInstance, uID,
reinterpret_cast<LPSTR
>(&pszStr), 0);
1062 sBuffer.assign(pszStr, i);
1073template<
class _Traits,
class _Ax>
1074static _Success_(
return != 0) int WINAPI
LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sBuffer) noexcept
1078 int i =
LoadStringW(hInstance, uID,
reinterpret_cast<LPWSTR
>(&pszStr), 0);
1080 sBuffer.assign(pszStr, i);
1094 try {
vsprintf(str, lpOutputString, arg); }
catch (...) {
return; }
1095 OutputDebugStringA(str.c_str());
1106 try {
vsprintf(str, lpOutputString, arg); }
catch (...) {
return; }
1107 OutputDebugStringW(str.c_str());
1118 va_start(arg, lpOutputString);
1131 va_start(arg, lpOutputString);
1137template<
class _Traits,
class _Ax>
1138static _Success_(
return != 0) int
GetDateFormatA(_In_ LCID Locale, _In_ DWORD dwFlags, _In_opt_ const SYSTEMTIME *lpDate, _In_opt_z_ LPCSTR lpFormat, _Out_ std::basic_string<
char, _Traits, _Ax> &sDate) noexcept
1140 int iResult =
GetDateFormatA(Locale, dwFlags, lpDate, lpFormat, NULL, 0);
1143 std::unique_ptr<char[]> szBuffer(
new char[iResult]);
1144 iResult =
GetDateFormatA(Locale, dwFlags, lpDate, lpFormat, szBuffer.get(), iResult);
1145 sDate.assign(szBuffer.get(), iResult ? iResult - 1 : 0);
1157template<
class _Traits,
class _Ax>
1158static _Success_(
return != 0) int
GetDateFormatW(_In_ LCID Locale, _In_ DWORD dwFlags, _In_opt_ const SYSTEMTIME *lpDate, _In_opt_z_ LPCWSTR lpFormat, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sDate) noexcept
1160 int iResult =
GetDateFormatW(Locale, dwFlags, lpDate, lpFormat, NULL, 0);
1163 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[iResult]);
1164 iResult =
GetDateFormatW(Locale, dwFlags, lpDate, lpFormat, szBuffer.get(), iResult);
1165 sDate.assign(szBuffer.get(), iResult ? iResult - 1 : 0);
1173template<
class _Traits,
class _Ax>
1174static _Success_(
return != 0) BOOL
LookupAccountSidA(_In_opt_z_ LPCSTR lpSystemName, _In_ PSID lpSid, _Out_opt_ std::basic_string<
char, _Traits, _Ax> *sName, _Out_opt_ std::basic_string<
char, _Traits, _Ax> *sReferencedDomainName, _Out_ PSID_NAME_USE peUse) noexcept
1178 DWORD dwNameLen = 0, dwRefDomainLen = 0;
1182 NULL, &dwRefDomainLen,
1186 if (sName ) sName ->clear();
1187 if (sReferencedDomainName) sReferencedDomainName->clear();
1189 }
else if (GetLastError() == ERROR_MORE_DATA) {
1191 std::unique_ptr<char[]> bufName (
new char[dwNameLen ]);
1192 std::unique_ptr<char[]> bufRefDomain(
new char[dwRefDomainLen]);
1194 bufName .get(), &dwNameLen ,
1195 bufRefDomain.get(), &dwRefDomainLen,
1198 if (sName ) sName ->assign(bufName .get(), dwNameLen - 1);
1199 if (sReferencedDomainName) sReferencedDomainName->assign(bufRefDomain.get(), dwRefDomainLen - 1);
1212template<
class _Traits,
class _Ax>
1213static _Success_(
return != 0) BOOL
LookupAccountSidW(_In_opt_z_ LPCWSTR lpSystemName, _In_ PSID lpSid, _Out_opt_ std::basic_string<
wchar_t, _Traits, _Ax> *sName, _Out_opt_ std::basic_string<
wchar_t, _Traits, _Ax> *sReferencedDomainName, _Out_ PSID_NAME_USE peUse) noexcept
1217 DWORD dwNameLen = 0, dwRefDomainLen = 0;
1221 NULL, &dwRefDomainLen,
1225 if (sName ) sName ->clear();
1226 if (sReferencedDomainName) sReferencedDomainName->clear();
1228 }
else if (GetLastError() == ERROR_MORE_DATA) {
1230 std::unique_ptr<wchar_t[]> bufName (
new wchar_t[dwNameLen ]);
1231 std::unique_ptr<wchar_t[]> bufRefDomain(
new wchar_t[dwRefDomainLen]);
1233 bufName .get(), &dwNameLen ,
1234 bufRefDomain.get(), &dwRefDomainLen,
1237 if (sName ) sName ->assign(bufName .get(), dwNameLen - 1);
1238 if (sReferencedDomainName) sReferencedDomainName->assign(bufRefDomain.get(), dwRefDomainLen - 1);
1252static _Success_(
return != 0) BOOL
GetTokenInformation(_In_ HANDLE TokenHandle, _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, _Out_ std::unique_ptr<_Ty> &TokenInformation) noexcept
1257 if (
GetTokenInformation(TokenHandle, TokenInformationClass, szStackBuffer,
sizeof(szStackBuffer), &dwSize)) {
1259 TokenInformation.reset((_Ty*)(
new BYTE[dwSize /
sizeof(BYTE)]));
1260 if (!TokenInformation) {
1261 SetLastError(ERROR_OUTOFMEMORY);
1264 memcpy(TokenInformation.get(), szStackBuffer, dwSize);
1266 }
else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
1268 TokenInformation.reset((_Ty*)(
new BYTE[dwSize /
sizeof(BYTE)]));
1269 if (!TokenInformation) {
1270 SetLastError(ERROR_OUTOFMEMORY);
1273 return GetTokenInformation(TokenHandle, TokenInformationClass, TokenInformation.get(), dwSize, &dwSize);
1283template<
class _Traits,
class _Ax>
1284static _Success_(
return != 0) BOOL
QueryFullProcessImageNameA(_In_ HANDLE hProcess, _In_ DWORD dwFlags, _Inout_ std::basic_string<
char, _Traits, _Ax>& sExeName)
1287 DWORD dwSize = _countof(szStackBuffer);
1292 sExeName.assign(szStackBuffer, dwSize);
1295 for (DWORD dwCapacity = 2 *
WINSTD_STACK_BUFFER_BYTES /
sizeof(
char); GetLastError() == ERROR_INSUFFICIENT_BUFFER; dwCapacity *= 2) {
1297 std::unique_ptr<char[]> szBuffer(
new char[dwCapacity]);
1298 dwSize = dwCapacity;
1300 sExeName.assign(szBuffer.get(), dwSize);
1312template<
class _Traits,
class _Ax>
1313static _Success_(
return != 0) BOOL
QueryFullProcessImageNameW(_In_ HANDLE hProcess, _In_ DWORD dwFlags, _Inout_ std::basic_string<
wchar_t, _Traits, _Ax>& sExeName)
1316 DWORD dwSize = _countof(szStackBuffer);
1321 sExeName.assign(szStackBuffer, dwSize);
1324 for (DWORD dwCapacity = 2 *
WINSTD_STACK_BUFFER_BYTES /
sizeof(
wchar_t); GetLastError() == ERROR_INSUFFICIENT_BUFFER; dwCapacity *= 2) {
1326 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[dwCapacity]);
1327 dwSize = dwCapacity;
1329 sExeName.assign(szBuffer.get(), dwSize);
1348 template<HANDLE INVALID>
1467 if (!UnmapViewOfFile(_Ptr))
1489 if (!UnmapViewOfFile(_Ptr))
1496 template<
class _Other>
1499 if (!UnmapViewOfFile(_Ptr))
1529 InitializeCriticalSection(&
m_data);
1530 } __except(EXCEPTION_EXECUTE_HANDLER) {
1531 throw std::runtime_error(
"InitializeCriticalSection failed");
1542 DeleteCriticalSection(&
m_data);
1550 operator LPCRITICAL_SECTION() noexcept
1629 PROCESS_HEAP_ENTRY e;
1631 while (HeapWalk(
m_h, &e) != FALSE) {
1632 if ((e.wFlags & PROCESS_HEAP_ENTRY_BUSY) != 0) {
1634 _T(
"Allocated block%s%s\n")
1635 _T(
" Data portion begins at: %#p\n Size: %d bytes\n")
1636 _T(
" Overhead: %d bytes\n Region index: %d\n"),
1637 (e.wFlags & PROCESS_HEAP_ENTRY_MOVEABLE) != 0 ?
tstring_printf(_T(
", movable with HANDLE %#p"), e.Block.hMem).c_str() : _T(
""),
1638 (e.wFlags & PROCESS_HEAP_ENTRY_DDESHARE) != 0 ? _T(
", DDESHARE") : _T(
""),
1648 const DWORD dwResult = GetLastError();
1649 if (dwResult != ERROR_NO_MORE_ITEMS)
1674 template <
class _Ty>
1691 template <
class _Other>
1712 template <
class _Other>
1738 UNREFERENCED_PARAMETER(size);
1740 HeapFree(
m_heap, 0, ptr);
1751 ::new ((
void*)ptr) _Ty(val);
1762 ::new ((
void*)ptr) _Ty(std::forward<_Ty>(val));
1805 if (!ActivateActCtx(hActCtx, &
m_cookie))
1842 m_cookie = hToken && ImpersonateLoggedOnUser(hToken);
1889 SetConsoleCtrlHandler(
m_handler, FALSE);
1930 m_proc(std::move(h.m_proc)),
1943 VirtualFreeEx(
m_proc,
m_h, 0, MEM_RELEASE);
1953 if (
this != std::addressof(other)) {
1955 m_proc = std::move(other.m_proc);
1986 _In_ HANDLE hProcess,
1987 _In_opt_ LPVOID lpAddress,
1989 _In_ DWORD flAllocationType,
1990 _In_ DWORD flProtect)
noexcept
1992 handle_type h = VirtualAllocEx(hProcess, lpAddress, dwSize, flAllocationType, flProtect);
2008 VirtualFreeEx(
m_proc,
m_h, 0, MEM_RELEASE);
2050 s = RegDeleteKey(
m_h, szSubkey);
2051 if (s == ERROR_SUCCESS || s == ERROR_FILE_NOT_FOUND)
2057 s = RegOpenKeyEx(
m_h, szSubkey, 0, KEY_ENUMERATE_SUB_KEYS, &h);
2058 if (s == ERROR_SUCCESS)
2065 TCHAR szName[MAX_PATH];
2066 DWORD dwSize = _countof(szName);
2067 s = RegEnumKeyEx(k, 0, szName, &dwSize, NULL, NULL, NULL, NULL);
2068 if (s == ERROR_SUCCESS)
2070 else if (s == ERROR_NO_MORE_ITEMS)
2079 s = RegDeleteKey(
m_h, szSubkey);
2080 if (s == ERROR_SUCCESS)
2145 hProcess = INVALID_HANDLE_VALUE;
2146 hThread = INVALID_HANDLE_VALUE;
2156 #pragma warning(push)
2157 #pragma warning(disable: 6001)
2159 if (hProcess != INVALID_HANDLE_VALUE)
2160 CloseHandle(hProcess);
2162 if (hThread != INVALID_HANDLE_VALUE)
2163 CloseHandle(hThread);
2165 #pragma warning(pop)
2198 DeregisterEventSource(
m_h);
2208#pragma warning(push)
2209#pragma warning(disable: 4505)
2214 _In_ LPCSTR lpSubKey,
2215 _Reserved_ DWORD Reserved,
2216 _In_opt_ LPSTR lpClass,
2217 _In_ DWORD dwOptions,
2218 _In_ REGSAM samDesired,
2219 _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
2221 _Out_opt_ LPDWORD lpdwDisposition)
2224 LSTATUS s =
RegCreateKeyExA(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, &h, lpdwDisposition);
2225 if (s == ERROR_SUCCESS)
2237 _In_ LPCWSTR lpSubKey,
2238 _Reserved_ DWORD Reserved,
2239 _In_opt_ LPWSTR lpClass,
2240 _In_ DWORD dwOptions,
2241 _In_ REGSAM samDesired,
2242 _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
2244 _Out_opt_ LPDWORD lpdwDisposition)
2247 LSTATUS s =
RegCreateKeyExW(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, &h, lpdwDisposition);
2248 if (s == ERROR_SUCCESS)
2256 _In_opt_ LPCSTR lpSubKey,
2257 _In_opt_ DWORD ulOptions,
2258 _In_ REGSAM samDesired,
2262 LSTATUS s =
RegOpenKeyExA(hKey, lpSubKey, ulOptions, samDesired, &h);
2263 if (s == ERROR_SUCCESS)
2279 _In_opt_ LPCWSTR lpSubKey,
2280 _In_opt_ DWORD ulOptions,
2281 _In_ REGSAM samDesired,
2285 LSTATUS s =
RegOpenKeyExW(hKey, lpSubKey, ulOptions, samDesired, &h);
2286 if (s == ERROR_SUCCESS)
Activates given activation context in constructor and deactivates it in destructor.
Definition: Win.h:1791
actctx_activator(HANDLE hActCtx) noexcept
Construct the activator and activates the given activation context.
Definition: Win.h:1803
virtual ~actctx_activator()
Deactivates activation context and destructs the activator.
Definition: Win.h:1814
ULONG_PTR m_cookie
Cookie for context deactivation.
Definition: Win.h:1821
Base template class to support string formatting using printf() style templates.
Definition: Common.h:1123
Console control handler stack management.
Definition: Win.h:1864
console_ctrl_handler(PHANDLER_ROUTINE HandlerRoutine) noexcept
Construct the console control handler object and pushes the given handler to the console control hand...
Definition: Win.h:1876
virtual ~console_ctrl_handler()
Pops console control handler from the console control handler stack.
Definition: Win.h:1886
PHANDLER_ROUTINE m_handler
Pointer to console control handler.
Definition: Win.h:1894
BOOL m_cookie
Did pushing the console control handler succeed?
Definition: Win.h:1893
Critical section wrapper.
Definition: Win.h:1516
CRITICAL_SECTION m_data
Critical section struct.
Definition: Win.h:1556
virtual ~critical_section()
Releases all resources used by an unowned critical section object.
Definition: Win.h:1540
critical_section()
Construct the object and initializes a critical section object.
Definition: Win.h:1526
Event log handle wrapper.
Definition: Win.h:2175
void free_internal() noexcept override
Closes an event log handle.
Definition: Win.h:2196
virtual ~event_log()
Closes an event log handle.
Definition: Win.h:2184
Find-file handle wrapper.
Definition: Win.h:1565
virtual ~find_file()
Closes a file search handle.
Definition: Win.h:1574
void free_internal() noexcept override
Closes a file search handle.
Definition: Win.h:1586
Base abstract template class to support generic object handle keeping.
Definition: Common.h:615
LPVOID handle_type
Datatype of the object handle this template class handles.
Definition: Common.h:620
handle_type m_h
Object handle.
Definition: Common.h:866
void attach(handle_type h) noexcept
Sets a new object handle for the class.
Definition: Common.h:829
HeapAlloc allocator.
Definition: Win.h:1676
SIZE_T size_type
An unsigned integral type that can represent the length of any sequence that an object of template cl...
Definition: Win.h:1685
_Ty value_type
A type that is managed by the allocator.
Definition: Win.h:1678
heap_allocator(const heap_allocator< _Other > &other)
Constructs allocator from another type.
Definition: Win.h:1713
HANDLE m_heap
Heap handle.
Definition: Win.h:1784
pointer allocate(size_type count)
Allocates a new memory block.
Definition: Win.h:1724
ptrdiff_t difference_type
A signed integral type that can represent the difference between values of pointers to the type of ob...
Definition: Win.h:1686
heap_allocator(HANDLE heap)
Constructs allocator.
Definition: Win.h:1703
_Ty & reference
A type that provides a reference to the type of object managed by the allocator.
Definition: Win.h:1681
void construct(pointer ptr, _Ty &&val)
Calls moving constructor for the element.
Definition: Win.h:1760
void deallocate(pointer ptr, size_type size)
Frees memory block.
Definition: Win.h:1736
size_type max_size() const
Returns maximum memory block size.
Definition: Win.h:1778
void construct(pointer ptr, const _Ty &val)
Calls copying constructor for the element.
Definition: Win.h:1749
const _Ty & const_reference
A type that provides a constant reference to type of object managed by the allocator.
Definition: Win.h:1683
const _Ty * const_pointer
A type that provides a constant pointer to the type of object managed by the allocator.
Definition: Win.h:1682
_Ty * pointer
A type that provides a pointer to the type of object managed by the allocator.
Definition: Win.h:1680
void destroy(pointer ptr)
Calls destructor for the element.
Definition: Win.h:1770
Heap handle wrapper.
Definition: Win.h:1598
bool enumerate() noexcept
Enumerates allocated heap blocks using OutputDebugString()
Definition: Win.h:1620
void free_internal() noexcept override
Destroys the heap.
Definition: Win.h:1664
virtual ~heap()
Destroys the heap.
Definition: Win.h:1607
Module handle wrapper.
Definition: Win.h:1383
void free_internal() noexcept override
Frees the module.
Definition: Win.h:1404
virtual ~library()
Frees the module.
Definition: Win.h:1392
Registry key wrapper class.
Definition: Win.h:2022
void free_internal() noexcept override
Closes a handle to the registry key.
Definition: Win.h:2094
bool delete_subkey(LPCTSTR szSubkey)
Deletes the specified registry subkey.
Definition: Win.h:2046
virtual ~reg_key()
Closes a handle to the registry key.
Definition: Win.h:2031
SID wrapper class.
Definition: Win.h:2104
void free_internal() noexcept override
Closes a handle to the SID.
Definition: Win.h:2125
virtual ~security_id()
Closes a handle to the SID.
Definition: Win.h:2113
Lets the calling thread impersonate the security context of a logged-on user.
Definition: Win.h:1828
BOOL m_cookie
Did impersonation succeed?
Definition: Win.h:1857
user_impersonator(HANDLE hToken) noexcept
Construct the impersonator and impersonates the given user.
Definition: Win.h:1840
virtual ~user_impersonator()
Reverts to current user and destructs the impersonator.
Definition: Win.h:1850
Memory in virtual address space of a process handle wrapper.
Definition: Win.h:1901
vmemory & operator=(vmemory &&other) noexcept
Move assignment.
Definition: Win.h:1951
bool alloc(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) noexcept
Reserves, commits, or changes the state of a region of memory within the virtual address space of a s...
Definition: Win.h:1985
void free_internal() noexcept override
Frees the memory.
Definition: Win.h:2006
void attach(HANDLE proc, handle_type h) noexcept
Sets a new memory handle for the class.
Definition: Win.h:1968
virtual ~vmemory()
Frees the memory.
Definition: Win.h:1940
vmemory(handle_type h, HANDLE proc) noexcept
Initializes a new class instance with an already available object handle.
Definition: Win.h:1918
vmemory() noexcept
Initializes a new class instance with the memory handle set to INVAL.
Definition: Win.h:1908
vmemory(vmemory &&h) noexcept
Move constructor.
Definition: Win.h:1929
HANDLE m_proc
Handle of memory's process.
Definition: Win.h:2012
Windows HANDLE wrapper class.
Definition: Win.h:1350
void free_internal() noexcept override
Closes an open object handle.
Definition: Win.h:1371
virtual ~win_handle()
Closes an open object handle.
Definition: Win.h:1359
Windows runtime error.
Definition: Common.h:1056
#define WINSTD_NONCOPYABLE(C)
Declares a class as non-copyable.
Definition: Common.h:74
#define WINSTD_STACK_BUFFER_BYTES
Size of the stack buffer in bytes used for initial system function call.
Definition: Common.h:101
#define WINSTD_NONMOVABLE(C)
Declares a class as non-movable.
Definition: Common.h:82
#define WINSTD_HANDLE_IMPL(C, INVAL)
Implements default constructors and operators to prevent their auto-generation by compiler.
Definition: Common.h:171
static const HANDLE invalid
Invalid handle value.
Definition: Common.h:625
static int NormalizeString(NORM_FORM NormForm, LPCWSTR lpSrcString, int cwSrcLength, std::basic_string< wchar_t, _Traits, _Ax > &sDstString) noexcept
Normalizes characters of a text string according to Unicode 4.0 TR#15.
Definition: Win.h:974
static int SecureWideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, std::basic_string< char, _Traits, _Ax > &sMultiByteStr, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar) noexcept
Maps a UTF-16 (wide character) string to a std::string. The new character string is not necessarily f...
Definition: Win.h:717
static DWORD ExpandEnvironmentStringsA(LPCSTR lpSrc, std::basic_string< char, _Traits, _Ax > &sValue) noexcept
Expands environment-variable strings, replaces them with the values defined for the current user,...
Definition: Win.h:181
static BOOL StringToGuidA(LPCSTR lpszGuid, LPGUID lpGuid, LPCSTR *lpszGuidEnd=NULL) noexcept
Parses string with GUID and stores it to GUID.
Definition: Win.h:270
static int GetWindowTextA(HWND hWnd, std::basic_string< char, _Traits, _Ax > &sValue) noexcept
Copies the text of the specified window's title bar (if it has one) into a std::wstring string.
Definition: Win.h:83
static LSTATUS RegCreateKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD Reserved, LPWSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, winstd::reg_key &result, LPDWORD lpdwDisposition)
Creates the specified registry key. If the key already exists, the function opens it.
Definition: Win.h:2235
static int WINAPI LoadStringA(HINSTANCE hInstance, UINT uID, std::basic_string< char, _Traits, _Ax > &sBuffer) noexcept
Loads a string resource from the executable file associated with a specified module.
Definition: Win.h:1056
win_handle< INVALID_HANDLE_VALUE > file
File handle wrapper.
Definition: Win.h:1436
static BOOL GetFileVersionInfoA(LPCSTR lptstrFilename, __reserved DWORD dwHandle, std::vector< _Ty, _Ax > &aValue) noexcept
Retrieves version information for the specified file and stores it in a std::vector buffer.
Definition: Win.h:145
static int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, std::basic_string< wchar_t, _Traits, _Ax > &sWideCharStr) noexcept
Maps a character string to a UTF-16 (wide character) std::wstring. The character string is not necess...
Definition: Win.h:806
static LSTATUS RegCreateKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, winstd::reg_key &result, LPDWORD lpdwDisposition)
Creates the specified registry key. If the key already exists, the function opens it.
Definition: Win.h:2212
static LSTATUS RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, winstd::reg_key &result)
Opens the specified registry key.
Definition: Win.h:2254
static LSTATUS RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, winstd::reg_key &result)
Opens the specified registry key.
Definition: Win.h:2277
static VOID GuidToStringA(LPCGUID lpGuid, std::basic_string< char, _Traits, _Ax > &str) noexcept
Formats GUID and stores it in a std::wstring string.
Definition: Win.h:231
static BOOL StringToGuidW(LPCWSTR lpszGuid, LPGUID lpGuid, LPCWSTR *lpszGuidEnd=NULL) noexcept
Parses string with GUID and stores it to GUID.
Definition: Win.h:343
static LSTATUS RegLoadMUIStringW(HKEY hKey, LPCWSTR pszValue, std::basic_string< wchar_t, _Traits, _Ax > &sOut, DWORD Flags, LPCWSTR pszDirectory) noexcept
Loads the specified string from the specified key and subkey, and stores it in a std::wstring string.
Definition: Win.h:608
static BOOL LookupAccountSidA(LPCSTR lpSystemName, PSID lpSid, std::basic_string< char, _Traits, _Ax > *sName, std::basic_string< char, _Traits, _Ax > *sReferencedDomainName, PSID_NAME_USE peUse) noexcept
Retrieves the name of the account for this SID and the name of the first domain on which this SID is ...
Definition: Win.h:1174
static DWORD GetModuleFileNameW(HMODULE hModule, std::basic_string< wchar_t, _Traits, _Ax > &sValue) noexcept
Retrieves the fully qualified path for the file that contains the specified module and stores it in a...
Definition: Win.h:58
static BOOL LookupAccountSidW(LPCWSTR lpSystemName, PSID lpSid, std::basic_string< wchar_t, _Traits, _Ax > *sName, std::basic_string< wchar_t, _Traits, _Ax > *sReferencedDomainName, PSID_NAME_USE peUse) noexcept
Retrieves the name of the account for this SID and the name of the first domain on which this SID is ...
Definition: Win.h:1213
win_handle< INVALID_HANDLE_VALUE > process_snapshot
Process snapshot handle wrapper.
Definition: Win.h:1429
static DWORD GetModuleFileNameA(HMODULE hModule, std::basic_string< char, _Traits, _Ax > &sValue) noexcept
Retrieves the fully qualified path for the file that contains the specified module and stores it in a...
Definition: Win.h:27
static int GetDateFormatW(LCID Locale, DWORD dwFlags, const SYSTEMTIME *lpDate, LPCWSTR lpFormat, std::basic_string< wchar_t, _Traits, _Ax > &sDate) noexcept
Formats a date as a date string for a locale specified by the locale identifier. The function formats...
Definition: Win.h:1158
static int WINAPI LoadStringW(HINSTANCE hInstance, UINT uID, std::basic_string< wchar_t, _Traits, _Ax > &sBuffer) noexcept
Loads a string resource from the executable file associated with a specified module.
Definition: Win.h:1074
static BOOL GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, std::unique_ptr< _Ty > &TokenInformation) noexcept
Retrieves a specified type of information about an access token. The calling process must have approp...
Definition: Win.h:1252
static LSTATUS RegQueryValueExW(HKEY hKey, LPCWSTR lpValueName, __reserved LPDWORD lpReserved, LPDWORD lpType, std::vector< _Ty, _Ax > &aData) noexcept
Retrieves the type and data for the specified value name associated with an open registry key and sto...
Definition: Win.h:569
static BOOL GetFileVersionInfoW(LPCWSTR lptstrFilename, __reserved DWORD dwHandle, std::vector< _Ty, _Ax > &aValue) noexcept
Retrieves version information for the specified file and stores it in a std::vector buffer.
Definition: Win.h:165
win_handle< NULL > event
Event handle wrapper.
Definition: Win.h:1510
static LSTATUS RegLoadMUIStringA(HKEY hKey, LPCSTR pszValue, std::basic_string< char, _Traits, _Ax > &sOut, DWORD Flags, LPCSTR pszDirectory) noexcept
Loads the specified string from the specified key and subkey, and stores it in a std::wstring string.
Definition: Win.h:594
static VOID OutputDebugStr(LPCSTR lpOutputString,...) noexcept
Formats and sends a string to the debugger for display.
Definition: Win.h:1115
static BOOL QueryFullProcessImageNameA(HANDLE hProcess, DWORD dwFlags, std::basic_string< char, _Traits, _Ax > &sExeName)
Retrieves the full name of the executable image for the specified process.
Definition: Win.h:1284
win_handle< NULL > file_mapping
File mapping.
Definition: Win.h:1443
static int SecureMultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, std::basic_string< wchar_t, _Traits, _Ax > &sWideCharStr) noexcept
Maps a character string to a UTF-16 (wide character) std::wstring. The character string is not necess...
Definition: Win.h:885
static int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, std::basic_string< char, _Traits, _Ax > &sMultiByteStr, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar) noexcept
Maps a UTF-16 (wide character) string to a std::string. The new character string is not necessarily f...
Definition: Win.h:638
static BOOL QueryFullProcessImageNameW(HANDLE hProcess, DWORD dwFlags, std::basic_string< wchar_t, _Traits, _Ax > &sExeName)
Retrieves the full name of the executable image for the specified process.
Definition: Win.h:1313
win_handle< NULL > process
Process handle wrapper.
Definition: Win.h:1415
static LSTATUS RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, __reserved LPDWORD lpReserved, LPDWORD lpType, std::vector< _Ty, _Ax > &aData) noexcept
Retrieves the type and data for the specified value name associated with an open registry key and sto...
Definition: Win.h:542
static LSTATUS RegQueryStringValue(HKEY hReg, LPCSTR pszName, std::basic_string< char, _Traits, _Ax > &sValue) noexcept
Queries for a string value in the registry and stores it in a std::string string.
Definition: Win.h:431
static int GetWindowTextW(HWND hWnd, std::basic_string< wchar_t, _Traits, _Ax > &sValue) noexcept
Copies the text of the specified window's title bar (if it has one) into a std::wstring string.
Definition: Win.h:116
static int GetDateFormatA(LCID Locale, DWORD dwFlags, const SYSTEMTIME *lpDate, LPCSTR lpFormat, std::basic_string< char, _Traits, _Ax > &sDate) noexcept
Formats a date as a date string for a locale specified by the locale identifier. The function formats...
Definition: Win.h:1138
static DWORD ExpandEnvironmentStringsW(LPCWSTR lpSrc, std::basic_string< wchar_t, _Traits, _Ax > &sValue) noexcept
Expands environment-variable strings, replaces them with the values defined for the current user,...
Definition: Win.h:209
static VOID GuidToStringW(LPCGUID lpGuid, std::basic_string< wchar_t, _Traits, _Ax > &str) noexcept
Formats GUID and stores it in a std::wstring string.
Definition: Win.h:250
static VOID OutputDebugStrV(LPCSTR lpOutputString, va_list arg) noexcept
Formats and sends a string to the debugger for display.
Definition: Win.h:1091
win_handle< NULL > thread
Thread handle wrapper.
Definition: Win.h:1422
UnmapViewOfFile_delete()
Default construct.
Definition: Win.h:1482
void operator()(_Other *) const
Delete a pointer of another type.
Definition: Win.h:1497
void operator()(_Ty *_Ptr) const
Delete a pointer.
Definition: Win.h:1487
UnmapViewOfFile_delete< _Ty > _Myt
This type.
Definition: Win.h:1477
Deleter for unique_ptr using UnmapViewOfFile.
Definition: Win.h:1449
UnmapViewOfFile_delete(const UnmapViewOfFile_delete< _Ty2 > &)
Construct from another UnmapViewOfFile_delete.
Definition: Win.h:1460
void operator()(_Ty *_Ptr) const
Delete a pointer.
Definition: Win.h:1465
UnmapViewOfFile_delete< _Ty > _Myt
This type.
Definition: Win.h:1450
UnmapViewOfFile_delete()
Default construct.
Definition: Win.h:1455
A structure that enables an allocator for objects of one type to allocate storage for objects of anot...
Definition: Win.h:1693
heap_allocator< _Other > other
Other allocator type.
Definition: Win.h:1694