16#pragma warning(disable: 4505)
22template<
class _Traits,
class _Ax>
23static DWORD
GetModuleFileNameA(_In_opt_ HMODULE hModule, _Out_ std::basic_string<char, _Traits, _Ax> &sValue)
noexcept
31 if (dwResult < _countof(szStackBuffer)) {
33 sValue.assign(szStackBuffer, dwResult);
38 std::unique_ptr<char[]> szBuffer(
new char[dwCapacity]);
40 if (dwResult < dwCapacity) {
41 sValue.assign(szBuffer.get(), dwResult);
53template<
class _Traits,
class _Ax>
54static DWORD
GetModuleFileNameW(_In_opt_ HMODULE hModule, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &sValue)
noexcept
60 if (dwResult < _countof(szStackBuffer)) {
62 sValue.assign(szStackBuffer, dwResult);
67 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[dwCapacity]);
69 if (dwResult < dwCapacity) {
70 sValue.assign(szBuffer.get(), dwResult);
78template<
class _Traits,
class _Ax>
79static _Success_(
return != 0) int
GetWindowTextA(_In_ HWND hWnd, _Out_ std::basic_string<
char, _Traits, _Ax> &sValue) noexcept
86 iResult = ::GetWindowTextLengthA(hWnd);
92 sValue.assign(szBuffer, iResult);
95 std::unique_ptr<char[]> szBuffer(
new char[++iResult]);
97 sValue.assign(szBuffer.get(), iResult);
111template<
class _Traits,
class _Ax>
112static _Success_(
return != 0) int
GetWindowTextW(_In_ HWND hWnd, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sValue) noexcept
119 iResult = ::GetWindowTextLengthW(hWnd);
125 sValue.assign(szBuffer, iResult);
128 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[++iResult]);
130 sValue.assign(szBuffer.get(), iResult);
140template<
class _Ty,
class _Ax>
141static _Success_(
return != 0) BOOL
GetFileVersionInfoA(_In_z_ LPCSTR lptstrFilename, __reserved DWORD dwHandle, _Out_ std::vector<_Ty, _Ax> &aValue) noexcept
146 DWORD dwVerInfoSize = ::GetFileVersionInfoSizeA(lptstrFilename, &dwHandle);
147 if (dwVerInfoSize != 0) {
149 aValue.resize((dwVerInfoSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
160template<
class _Ty,
class _Ax>
161static _Success_(
return != 0) BOOL
GetFileVersionInfoW(_In_z_ LPCWSTR lptstrFilename, __reserved DWORD dwHandle, _Out_ std::vector<_Ty, _Ax> &aValue) noexcept
166 DWORD dwVerInfoSize = ::GetFileVersionInfoSizeW(lptstrFilename, &dwHandle);
167 if (dwVerInfoSize != 0) {
169 aValue.resize((dwVerInfoSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
176template<
class _Traits,
class _Ax>
177static _Success_(
return != 0) DWORD
ExpandEnvironmentStringsA(_In_z_ LPCSTR lpSrc, _Out_ std::basic_string<
char, _Traits, _Ax> &sValue) noexcept
181 for (DWORD dwSizeOut = (DWORD)strlen(lpSrc) + 0x100;;) {
182 DWORD dwSizeIn = dwSizeOut;
183 std::unique_ptr<char[]> szBuffer(
new char[(
size_t)dwSizeIn + 2]);
185 if (dwSizeOut == 0) {
188 }
else if (dwSizeOut <= dwSizeIn) {
190 sValue.assign(szBuffer.get(), dwSizeOut - 1);
204template<
class _Traits,
class _Ax>
205static _Success_(
return != 0) DWORD
ExpandEnvironmentStringsW(_In_z_ LPCWSTR lpSrc, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sValue) noexcept
207 for (DWORD dwSizeOut = (DWORD)wcslen(lpSrc) + 0x100;;) {
208 DWORD dwSizeIn = dwSizeOut;
209 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[(
size_t)dwSizeIn + 1]);
211 if (dwSizeOut == 0) {
214 }
else if (dwSizeOut <= dwSizeIn) {
216 sValue.assign(szBuffer.get(), dwSizeOut - 1);
226template<
class _Traits,
class _Ax>
227static VOID
GuidToStringA(_In_ LPCGUID lpGuid, _Out_ std::basic_string<char, _Traits, _Ax> &str)
noexcept
231 sprintf(str,
"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
235 lpGuid->Data4[0], lpGuid->Data4[1],
236 lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]);
245template<
class _Traits,
class _Ax>
246static VOID
GuidToStringW(_In_ LPCGUID lpGuid, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &str)
noexcept
250 sprintf(str, L
"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
254 lpGuid->Data4[0], lpGuid->Data4[1],
255 lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]);
260#define GuidToString GuidToStringW
262#define GuidToString GuidToStringA
266static _Success_(
return) BOOL
StringToGuidA(_In_z_ LPCSTR lpszGuid, _Out_ LPGUID lpGuid, _Out_opt_ LPCSTR *lpszGuidEnd = NULL)
noexcept
271 unsigned long long ullTmp;
273 if (!lpszGuid || !lpGuid || *lpszGuid !=
'{')
return FALSE;
276 g.Data1 = strtoul(lpszGuid, &lpszEnd, 16);
277 if (errno == ERANGE)
return FALSE;
280 if (*lpszGuid !=
'-')
return FALSE;
283 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
284 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
285 g.Data2 =
static_cast<unsigned short>(ulTmp);
288 if (*lpszGuid !=
'-')
return FALSE;
291 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
292 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
293 g.Data3 =
static_cast<unsigned short>(ulTmp);
296 if (*lpszGuid !=
'-')
return FALSE;
299 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
300 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
301 g.Data4[0] =
static_cast<unsigned char>((ulTmp >> 8) & 0xff);
302 g.Data4[1] =
static_cast<unsigned char>( ulTmp & 0xff);
305 if (*lpszGuid !=
'-')
return FALSE;
308 ullTmp = _strtoui64(lpszGuid, &lpszEnd, 16);
309 if (errno == ERANGE || ullTmp > 0xFFFFFFFFFFFF)
return FALSE;
310 g.Data4[2] =
static_cast<unsigned char>((ullTmp >> 40) & 0xff);
311 g.Data4[3] =
static_cast<unsigned char>((ullTmp >> 32) & 0xff);
312 g.Data4[4] =
static_cast<unsigned char>((ullTmp >> 24) & 0xff);
313 g.Data4[5] =
static_cast<unsigned char>((ullTmp >> 16) & 0xff);
314 g.Data4[6] =
static_cast<unsigned char>((ullTmp >> 8) & 0xff);
315 g.Data4[7] =
static_cast<unsigned char>( ullTmp & 0xff);
318 if (*lpszGuid !=
'}')
return FALSE;
322 *lpszGuidEnd = lpszGuid;
339static _Success_(
return) BOOL
StringToGuidW(_In_z_ LPCWSTR lpszGuid, _Out_ LPGUID lpGuid, _Out_opt_ LPCWSTR *lpszGuidEnd = NULL)
noexcept
344 unsigned long long ullTmp;
346 if (!lpszGuid || !lpGuid || *lpszGuid !=
'{')
return FALSE;
349 g.Data1 = wcstoul(lpszGuid, &lpszEnd, 16);
350 if (errno == ERANGE)
return FALSE;
353 if (*lpszGuid !=
'-')
return FALSE;
356 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
357 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
358 g.Data2 =
static_cast<unsigned short>(ulTmp);
361 if (*lpszGuid !=
'-')
return FALSE;
364 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
365 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
366 g.Data3 =
static_cast<unsigned short>(ulTmp);
369 if (*lpszGuid !=
'-')
return FALSE;
372 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
373 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
374 g.Data4[0] =
static_cast<unsigned char>((ulTmp >> 8) & 0xff);
375 g.Data4[1] =
static_cast<unsigned char>( ulTmp & 0xff);
378 if (*lpszGuid !=
'-')
return FALSE;
381 ullTmp = _wcstoui64(lpszGuid, &lpszEnd, 16);
382 if (errno == ERANGE || ullTmp > 0xFFFFFFFFFFFF)
return FALSE;
383 g.Data4[2] =
static_cast<unsigned char>((ullTmp >> 40) & 0xff);
384 g.Data4[3] =
static_cast<unsigned char>((ullTmp >> 32) & 0xff);
385 g.Data4[4] =
static_cast<unsigned char>((ullTmp >> 24) & 0xff);
386 g.Data4[5] =
static_cast<unsigned char>((ullTmp >> 16) & 0xff);
387 g.Data4[6] =
static_cast<unsigned char>((ullTmp >> 8) & 0xff);
388 g.Data4[7] =
static_cast<unsigned char>( ullTmp & 0xff);
391 if (*lpszGuid !=
'}')
return FALSE;
395 *lpszGuidEnd = lpszGuid;
403#define StringToGuid StringToGuidW
405#define StringToGuid StringToGuidA
426template<
class _Traits,
class _Ax>
427static LSTATUS
RegQueryStringValue(_In_ HKEY hReg, _In_z_ LPCSTR pszName, _Out_ std::basic_string<char, _Traits, _Ax> &sValue)
noexcept
431 DWORD dwSize =
sizeof(aStackBuffer), dwType;
435 if (lResult == ERROR_SUCCESS) {
436 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
438 dwSize /=
sizeof(CHAR);
439 sValue.assign(
reinterpret_cast<LPCSTR
>(aStackBuffer), dwSize &&
reinterpret_cast<LPCSTR
>(aStackBuffer)[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
440 }
else if (dwType == REG_EXPAND_SZ) {
443 lResult = ::GetLastError();
446 lResult = ERROR_INVALID_DATA;
448 }
else if (lResult == ERROR_MORE_DATA) {
449 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
451 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[dwSize /
sizeof(CHAR)]);
452 if ((lResult =
::RegQueryValueExA(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
453 dwSize /=
sizeof(CHAR);
454 sValue.assign(szBuffer.get(), dwSize && szBuffer[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
456 }
else if (dwType == REG_EXPAND_SZ) {
458 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[dwSize /
sizeof(CHAR)]);
459 if ((lResult =
::RegQueryValueExA(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
461 lResult = ::GetLastError();
465 lResult = ERROR_INVALID_DATA;
490template<
class _Traits,
class _Ax>
491static LSTATUS
RegQueryStringValue(_In_ HKEY hReg, _In_z_ LPCWSTR pszName, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &sValue)
noexcept
495 DWORD dwSize =
sizeof(aStackBuffer), dwType;
499 if (lResult == ERROR_SUCCESS) {
500 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
502 dwSize /=
sizeof(WCHAR);
503 sValue.assign(
reinterpret_cast<LPCWSTR
>(aStackBuffer), dwSize &&
reinterpret_cast<LPCWSTR
>(aStackBuffer)[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
504 }
else if (dwType == REG_EXPAND_SZ) {
507 lResult = ::GetLastError();
510 lResult = ERROR_INVALID_DATA;
512 }
else if (lResult == ERROR_MORE_DATA) {
513 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
515 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[dwSize /
sizeof(WCHAR)]);
516 if ((lResult =
::RegQueryValueExW(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
517 dwSize /=
sizeof(WCHAR);
518 sValue.assign(szBuffer.get(), dwSize && szBuffer[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
520 }
else if (dwType == REG_EXPAND_SZ) {
522 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[dwSize /
sizeof(WCHAR)]);
523 if ((lResult =
::RegQueryValueExW(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
525 lResult = ::GetLastError();
529 lResult = ERROR_INVALID_DATA;
537template<
class _Ty,
class _Ax>
538static LSTATUS
RegQueryValueExA(_In_ HKEY hKey, _In_opt_z_ LPCSTR lpValueName, __reserved LPDWORD lpReserved, _Out_opt_ LPDWORD lpType, _Out_ std::vector<_Ty, _Ax> &aData)
noexcept
542 DWORD dwSize =
sizeof(aStackBuffer);
545 lResult =
RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, aStackBuffer, &dwSize);
546 if (lResult == ERROR_SUCCESS) {
548 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
549 memcpy(aData.data(), aStackBuffer, dwSize);
550 }
else if (lResult == ERROR_MORE_DATA) {
552 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
553 lResult =
RegQueryValueExA(hKey, lpValueName, lpReserved, NULL,
reinterpret_cast<LPBYTE
>(aData.data()), &dwSize);
564template<
class _Ty,
class _Ax>
565static LSTATUS
RegQueryValueExW(_In_ HKEY hKey, _In_opt_z_ LPCWSTR lpValueName, __reserved LPDWORD lpReserved, _Out_opt_ LPDWORD lpType, _Out_ std::vector<_Ty, _Ax> &aData)
noexcept
569 DWORD dwSize =
sizeof(aStackBuffer);
572 lResult =
RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, aStackBuffer, &dwSize);
573 if (lResult == ERROR_SUCCESS) {
575 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
576 memcpy(aData.data(), aStackBuffer, dwSize);
577 }
else if (lResult == ERROR_MORE_DATA) {
579 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
580 lResult =
RegQueryValueExW(hKey, lpValueName, lpReserved, NULL,
reinterpret_cast<LPBYTE
>(aData.data()), &dwSize);
586#if _WIN32_WINNT >= _WIN32_WINNT_VISTA
589template<
class _Traits,
class _Ax>
590static 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
595 return ERROR_CALL_NOT_IMPLEMENTED;
603template<
class _Traits,
class _Ax>
604static 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
610 Flags &= ~REG_MUI_STRING_TRUNCATE;
613 lResult =
RegLoadMUIStringW(hKey, pszValue, szStackBuffer,
sizeof(szStackBuffer), &dwSize, Flags, pszDirectory);
614 if (lResult == ERROR_SUCCESS) {
616 sOut.assign(szStackBuffer, wcsnlen(szStackBuffer, dwSize/
sizeof(
wchar_t)));
617 }
else if (lResult == ERROR_MORE_DATA) {
619 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[(dwSize +
sizeof(
wchar_t) - 1)/
sizeof(
wchar_t)]);
620 sOut.assign(szBuffer.get(), (lResult =
RegLoadMUIStringW(hKey, pszValue, szBuffer.get(), dwSize, &dwSize, Flags, pszDirectory)) == ERROR_SUCCESS ? wcsnlen(szBuffer.get(), dwSize/
sizeof(
wchar_t)) : 0);
633template<
class _Traits,
class _Ax>
634static _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
639 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
642 sMultiByteStr.assign(szStackBuffer, cchWideChar != -1 ? strnlen(szStackBuffer, cch) : (
size_t)cch - 1);
643 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
645 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
646 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
647 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
648 sMultiByteStr.assign(szBuffer.get(), cchWideChar != -1 ? strnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
660static _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
665 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
668 sMultiByteStr.assign(szStackBuffer, szStackBuffer + cch);
669 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
671 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
672 sMultiByteStr.resize(cch);
673 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, sMultiByteStr.data(), cch, lpDefaultChar, lpUsedDefaultChar);
684template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
685static _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
690 int cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
693 sMultiByteStr.assign(szStackBuffer, cch);
694 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
696 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), NULL, 0, lpDefaultChar, lpUsedDefaultChar);
697 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
698 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
699 sMultiByteStr.assign(szBuffer.get(), cch);
712template<
class _Traits,
class _Ax>
713static _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
718 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
721 sMultiByteStr.assign(szStackBuffer, cchWideChar != -1 ? strnlen(szStackBuffer, cch) : (
size_t)cch - 1);
722 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
724 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
725 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
726 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
727 sMultiByteStr.assign(szBuffer.get(), cchWideChar != -1 ? strnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
728 SecureZeroMemory(szBuffer.get(),
sizeof(CHAR)*cch);
731 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
744static _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
749 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
752 sMultiByteStr.assign(szStackBuffer, szStackBuffer + cch);
753 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
755 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
756 sMultiByteStr.resize(cch);
757 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, sMultiByteStr.data(), cch, lpDefaultChar, lpUsedDefaultChar);
760 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
772template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
773static _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
778 int cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
781 sMultiByteStr.assign(szStackBuffer, cch);
782 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
784 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), NULL, 0, lpDefaultChar, lpUsedDefaultChar);
785 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
786 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
787 sMultiByteStr.assign(szBuffer.get(), cch);
788 SecureZeroMemory(szBuffer.get(),
sizeof(CHAR)*cch);
791 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
801template<
class _Traits,
class _Ax>
802static _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
807 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
810 sWideCharStr.assign(szStackBuffer, cbMultiByte != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
811 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
814 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
816 sWideCharStr.assign(szBuffer.get(), cbMultiByte != -1 ? wcsnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
828static _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
833 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
836 sWideCharStr.assign(szStackBuffer, szStackBuffer + cch);
837 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
840 sWideCharStr.resize(cch);
841 cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, sWideCharStr.data(), cch);
852template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
853static _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
858 int cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szStackBuffer, _countof(szStackBuffer));
861 sWideCharStr.assign(szStackBuffer, cch);
862 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
864 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), NULL, 0);
865 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
866 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szBuffer.get(), cch);
867 sWideCharStr.assign(szBuffer.get(), cch);
880template<
class _Traits,
class _Ax>
881static _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
886 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
889 sWideCharStr.assign(szStackBuffer, cbMultiByte != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
890 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
893 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
895 sWideCharStr.assign(szBuffer.get(), cbMultiByte != -1 ? wcsnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
896 SecureZeroMemory(szBuffer.get(),
sizeof(WCHAR)*cch);
899 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
912static _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
917 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
920 sWideCharStr.assign(szStackBuffer, szStackBuffer + cch);
921 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
924 sWideCharStr.resize(cch);
925 cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, sWideCharStr.data(), cch);
928 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
940template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
941static _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
946 int cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szStackBuffer, _countof(szStackBuffer));
949 sWideCharStr.assign(szStackBuffer, cch);
950 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
952 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), NULL, 0);
953 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
954 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szBuffer.get(), cch);
955 sWideCharStr.assign(szBuffer.get(), cch);
956 SecureZeroMemory(szBuffer.get(),
sizeof(WCHAR)*cch);
959 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
969template<
class _Traits,
class _Ax>
970static _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
975 int cch =
::NormalizeString(NormForm, lpSrcString, cwSrcLength, szStackBuffer, _countof(szStackBuffer));
978 sDstString.assign(szStackBuffer, cwSrcLength != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
980 switch (::GetLastError()) {
981 case ERROR_INSUFFICIENT_BUFFER:
982 for (
int i = 10; i--;) {
985 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
986 cch =
::NormalizeString(NormForm, lpSrcString, cwSrcLength, szBuffer.get(), cch);
988 sDstString.assign(szBuffer.get(), cwSrcLength != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
991 if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
1012template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
1013static _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
1018 int cch =
::NormalizeString(NormForm, sSrcString.c_str(), (
int)sSrcString.length(), szStackBuffer, _countof(szStackBuffer));
1021 sDstString.assign(szStackBuffer, cch);
1023 switch (::GetLastError()) {
1024 case ERROR_INSUFFICIENT_BUFFER:
1025 for (
int i = 10; i--;) {
1028 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
1029 cch =
::NormalizeString(NormForm, sSrcString.c_str(), (
int)sSrcString.length(), szBuffer.get(), cch);
1031 sDstString.assign(szBuffer.get(), cch);
1034 if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
1051template<
class _Traits,
class _Ax>
1052static _Success_(
return != 0) int WINAPI
LoadStringA(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_ std::basic_string<
char, _Traits, _Ax> &sBuffer) noexcept
1056 int i =
LoadStringA(hInstance, uID,
reinterpret_cast<LPSTR
>(&pszStr), 0);
1058 sBuffer.assign(pszStr, i);
1069template<
class _Traits,
class _Ax>
1070static _Success_(
return != 0) int WINAPI
LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sBuffer) noexcept
1074 int i =
LoadStringW(hInstance, uID,
reinterpret_cast<LPWSTR
>(&pszStr), 0);
1076 sBuffer.assign(pszStr, i);
1090 try {
vsprintf(str, lpOutputString, arg); }
catch (...) {
return; }
1091 OutputDebugStringA(str.c_str());
1102 try {
vsprintf(str, lpOutputString, arg); }
catch (...) {
return; }
1103 OutputDebugStringW(str.c_str());
1114 va_start(arg, lpOutputString);
1127 va_start(arg, lpOutputString);
1133template<
class _Traits,
class _Ax>
1134static _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
1136 int iResult =
GetDateFormatA(Locale, dwFlags, lpDate, lpFormat, NULL, 0);
1139 std::unique_ptr<char[]> szBuffer(
new char[iResult]);
1140 iResult =
GetDateFormatA(Locale, dwFlags, lpDate, lpFormat, szBuffer.get(), iResult);
1141 sDate.assign(szBuffer.get(), iResult ? iResult - 1 : 0);
1153template<
class _Traits,
class _Ax>
1154static _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
1156 int iResult =
GetDateFormatW(Locale, dwFlags, lpDate, lpFormat, NULL, 0);
1159 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[iResult]);
1160 iResult =
GetDateFormatW(Locale, dwFlags, lpDate, lpFormat, szBuffer.get(), iResult);
1161 sDate.assign(szBuffer.get(), iResult ? iResult - 1 : 0);
1169template<
class _Traits,
class _Ax>
1170static _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
1174 DWORD dwNameLen = 0, dwRefDomainLen = 0;
1178 NULL, &dwRefDomainLen,
1182 if (sName ) sName ->clear();
1183 if (sReferencedDomainName) sReferencedDomainName->clear();
1185 }
else if (GetLastError() == ERROR_MORE_DATA) {
1187 std::unique_ptr<char[]> bufName (
new char[dwNameLen ]);
1188 std::unique_ptr<char[]> bufRefDomain(
new char[dwRefDomainLen]);
1190 bufName .get(), &dwNameLen ,
1191 bufRefDomain.get(), &dwRefDomainLen,
1194 if (sName ) sName ->assign(bufName .get(), dwNameLen - 1);
1195 if (sReferencedDomainName) sReferencedDomainName->assign(bufRefDomain.get(), dwRefDomainLen - 1);
1208template<
class _Traits,
class _Ax>
1209static _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
1213 DWORD dwNameLen = 0, dwRefDomainLen = 0;
1217 NULL, &dwRefDomainLen,
1221 if (sName ) sName ->clear();
1222 if (sReferencedDomainName) sReferencedDomainName->clear();
1224 }
else if (GetLastError() == ERROR_MORE_DATA) {
1226 std::unique_ptr<wchar_t[]> bufName (
new wchar_t[dwNameLen ]);
1227 std::unique_ptr<wchar_t[]> bufRefDomain(
new wchar_t[dwRefDomainLen]);
1229 bufName .get(), &dwNameLen ,
1230 bufRefDomain.get(), &dwRefDomainLen,
1233 if (sName ) sName ->assign(bufName .get(), dwNameLen - 1);
1234 if (sReferencedDomainName) sReferencedDomainName->assign(bufRefDomain.get(), dwRefDomainLen - 1);
1248static _Success_(
return != 0) BOOL
GetTokenInformation(_In_ HANDLE TokenHandle, _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, _Out_ std::unique_ptr<_Ty> &TokenInformation) noexcept
1253 if (
GetTokenInformation(TokenHandle, TokenInformationClass, szStackBuffer,
sizeof(szStackBuffer), &dwSize)) {
1255 TokenInformation.reset((_Ty*)(
new BYTE[dwSize /
sizeof(BYTE)]));
1256 if (!TokenInformation) {
1257 SetLastError(ERROR_OUTOFMEMORY);
1260 memcpy(TokenInformation.get(), szStackBuffer, dwSize);
1262 }
else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
1264 TokenInformation.reset((_Ty*)(
new BYTE[dwSize /
sizeof(BYTE)]));
1265 if (!TokenInformation) {
1266 SetLastError(ERROR_OUTOFMEMORY);
1269 return GetTokenInformation(TokenHandle, TokenInformationClass, TokenInformation.get(), dwSize, &dwSize);
1279template<
class _Traits,
class _Ax>
1280static _Success_(
return != 0) BOOL
QueryFullProcessImageNameA(_In_ HANDLE hProcess, _In_ DWORD dwFlags, _Inout_ std::basic_string<
char, _Traits, _Ax>& sExeName)
1283 DWORD dwSize = _countof(szStackBuffer);
1288 sExeName.assign(szStackBuffer, dwSize);
1291 for (DWORD dwCapacity = 2 *
WINSTD_STACK_BUFFER_BYTES /
sizeof(
char); GetLastError() == ERROR_INSUFFICIENT_BUFFER; dwCapacity *= 2) {
1293 std::unique_ptr<char[]> szBuffer(
new char[dwCapacity]);
1294 dwSize = dwCapacity;
1296 sExeName.assign(szBuffer.get(), dwSize);
1308template<
class _Traits,
class _Ax>
1309static _Success_(
return != 0) BOOL
QueryFullProcessImageNameW(_In_ HANDLE hProcess, _In_ DWORD dwFlags, _Inout_ std::basic_string<
wchar_t, _Traits, _Ax>& sExeName)
1312 DWORD dwSize = _countof(szStackBuffer);
1317 sExeName.assign(szStackBuffer, dwSize);
1320 for (DWORD dwCapacity = 2 *
WINSTD_STACK_BUFFER_BYTES /
sizeof(
wchar_t); GetLastError() == ERROR_INSUFFICIENT_BUFFER; dwCapacity *= 2) {
1322 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[dwCapacity]);
1323 dwSize = dwCapacity;
1325 sExeName.assign(szBuffer.get(), dwSize);
1344 template<HANDLE INVALID>
1464 if (!UnmapViewOfFile(_Ptr))
1486 if (!UnmapViewOfFile(_Ptr))
1493 template<
class _Other>
1496 if (!UnmapViewOfFile(_Ptr))
1525 InitializeCriticalSection(&
m_data);
1535 DeleteCriticalSection(&
m_data);
1543 operator LPCRITICAL_SECTION() noexcept
1622 PROCESS_HEAP_ENTRY e;
1624 while (HeapWalk(
m_h, &e) != FALSE) {
1625 if ((e.wFlags & PROCESS_HEAP_ENTRY_BUSY) != 0) {
1627 _T(
"Allocated block%s%s\n")
1628 _T(
" Data portion begins at: %#p\n Size: %d bytes\n")
1629 _T(
" Overhead: %d bytes\n Region index: %d\n"),
1630 (e.wFlags & PROCESS_HEAP_ENTRY_MOVEABLE) != 0 ?
tstring_printf(_T(
", movable with HANDLE %#p"), e.Block.hMem).c_str() : _T(
""),
1631 (e.wFlags & PROCESS_HEAP_ENTRY_DDESHARE) != 0 ? _T(
", DDESHARE") : _T(
""),
1641 const DWORD dwResult = GetLastError();
1642 if (dwResult != ERROR_NO_MORE_ITEMS)
1667 template <
class _Ty>
1684 template <
class _Other>
1705 template <
class _Other>
1731 UNREFERENCED_PARAMETER(size);
1733 HeapFree(
m_heap, 0, ptr);
1744 ::new ((
void*)ptr) _Ty(val);
1755 ::new ((
void*)ptr) _Ty(std::forward<_Ty>(val));
1798 if (!ActivateActCtx(hActCtx, &
m_cookie))
1835 m_cookie = hToken && ImpersonateLoggedOnUser(hToken);
1882 SetConsoleCtrlHandler(
m_handler, FALSE);
1923 m_proc(std::move(h.m_proc)),
1936 VirtualFreeEx(
m_proc,
m_h, 0, MEM_RELEASE);
1946 if (
this != std::addressof(other)) {
1948 m_proc = std::move(other.m_proc);
1979 _In_ HANDLE hProcess,
1980 _In_opt_ LPVOID lpAddress,
1982 _In_ DWORD flAllocationType,
1983 _In_ DWORD flProtect)
noexcept
1985 handle_type h = VirtualAllocEx(hProcess, lpAddress, dwSize, flAllocationType, flProtect);
2001 VirtualFreeEx(
m_proc,
m_h, 0, MEM_RELEASE);
2043 s = RegDeleteKey(
m_h, szSubkey);
2044 if (s == ERROR_SUCCESS || s == ERROR_FILE_NOT_FOUND)
2050 s = RegOpenKeyEx(
m_h, szSubkey, 0, KEY_ENUMERATE_SUB_KEYS, &h);
2051 if (s == ERROR_SUCCESS)
2058 TCHAR szName[MAX_PATH];
2059 DWORD dwSize = _countof(szName);
2060 s = RegEnumKeyEx(k, 0, szName, &dwSize, NULL, NULL, NULL, NULL);
2061 if (s == ERROR_SUCCESS)
2063 else if (s == ERROR_NO_MORE_ITEMS)
2072 s = RegDeleteKey(
m_h, szSubkey);
2073 if (s == ERROR_SUCCESS)
2138 hProcess = INVALID_HANDLE_VALUE;
2139 hThread = INVALID_HANDLE_VALUE;
2149 #pragma warning(push)
2150 #pragma warning(disable: 6001)
2152 if (hProcess != INVALID_HANDLE_VALUE)
2153 CloseHandle(hProcess);
2155 if (hThread != INVALID_HANDLE_VALUE)
2156 CloseHandle(hThread);
2158 #pragma warning(pop)
2191 DeregisterEventSource(
m_h);
2222 CloseServiceHandle(
m_h);
2232#pragma warning(push)
2233#pragma warning(disable: 4505)
2238 _In_ LPCSTR lpSubKey,
2239 _Reserved_ DWORD Reserved,
2240 _In_opt_ LPSTR lpClass,
2241 _In_ DWORD dwOptions,
2242 _In_ REGSAM samDesired,
2243 _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
2245 _Out_opt_ LPDWORD lpdwDisposition)
2248 LSTATUS s =
RegCreateKeyExA(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, &h, lpdwDisposition);
2249 if (s == ERROR_SUCCESS)
2261 _In_ LPCWSTR lpSubKey,
2262 _Reserved_ DWORD Reserved,
2263 _In_opt_ LPWSTR lpClass,
2264 _In_ DWORD dwOptions,
2265 _In_ REGSAM samDesired,
2266 _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
2268 _Out_opt_ LPDWORD lpdwDisposition)
2271 LSTATUS s =
RegCreateKeyExW(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, &h, lpdwDisposition);
2272 if (s == ERROR_SUCCESS)
2280 _In_opt_ LPCSTR lpSubKey,
2281 _In_opt_ DWORD ulOptions,
2282 _In_ REGSAM samDesired,
2286 LSTATUS s =
RegOpenKeyExA(hKey, lpSubKey, ulOptions, samDesired, &h);
2287 if (s == ERROR_SUCCESS)
2299 _In_opt_ LPCWSTR lpSubKey,
2300 _In_opt_ DWORD ulOptions,
2301 _In_ REGSAM samDesired,
2305 LSTATUS s =
RegOpenKeyExW(hKey, lpSubKey, ulOptions, samDesired, &h);
2306 if (s == ERROR_SUCCESS)
Activates given activation context in constructor and deactivates it in destructor.
Definition: Win.h:1784
actctx_activator(HANDLE hActCtx) noexcept
Construct the activator and activates the given activation context.
Definition: Win.h:1796
virtual ~actctx_activator()
Deactivates activation context and destructs the activator.
Definition: Win.h:1807
ULONG_PTR m_cookie
Cookie for context deactivation.
Definition: Win.h:1814
Base template class to support string formatting using printf() style templates.
Definition: Common.h:1115
Console control handler stack management.
Definition: Win.h:1857
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:1869
virtual ~console_ctrl_handler()
Pops console control handler from the console control handler stack.
Definition: Win.h:1879
PHANDLER_ROUTINE m_handler
Pointer to console control handler.
Definition: Win.h:1887
BOOL m_cookie
Did pushing the console control handler succeed?
Definition: Win.h:1886
Critical section wrapper.
Definition: Win.h:1513
critical_section() noexcept
Construct the object and initializes a critical section object.
Definition: Win.h:1523
CRITICAL_SECTION m_data
Critical section struct.
Definition: Win.h:1549
virtual ~critical_section()
Releases all resources used by an unowned critical section object.
Definition: Win.h:1533
Event log handle wrapper.
Definition: Win.h:2168
void free_internal() noexcept override
Closes an event log handle.
Definition: Win.h:2189
virtual ~event_log()
Closes an event log handle.
Definition: Win.h:2177
Find-file handle wrapper.
Definition: Win.h:1558
virtual ~find_file()
Closes a file search handle.
Definition: Win.h:1567
void free_internal() noexcept override
Closes a file search handle.
Definition: Win.h:1579
Base abstract template class to support generic object handle keeping.
Definition: Common.h:607
LPVOID handle_type
Datatype of the object handle this template class handles.
Definition: Common.h:612
handle_type m_h
Object handle.
Definition: Common.h:858
void attach(handle_type h) noexcept
Sets a new object handle for the class.
Definition: Common.h:821
HeapAlloc allocator.
Definition: Win.h:1669
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:1678
_Ty value_type
A type that is managed by the allocator.
Definition: Win.h:1671
heap_allocator(const heap_allocator< _Other > &other)
Constructs allocator from another type.
Definition: Win.h:1706
HANDLE m_heap
Heap handle.
Definition: Win.h:1777
pointer allocate(size_type count)
Allocates a new memory block.
Definition: Win.h:1717
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:1679
heap_allocator(HANDLE heap)
Constructs allocator.
Definition: Win.h:1696
_Ty & reference
A type that provides a reference to the type of object managed by the allocator.
Definition: Win.h:1674
void construct(pointer ptr, _Ty &&val)
Calls moving constructor for the element.
Definition: Win.h:1753
void deallocate(pointer ptr, size_type size)
Frees memory block.
Definition: Win.h:1729
size_type max_size() const
Returns maximum memory block size.
Definition: Win.h:1771
void construct(pointer ptr, const _Ty &val)
Calls copying constructor for the element.
Definition: Win.h:1742
const _Ty & const_reference
A type that provides a constant reference to type of object managed by the allocator.
Definition: Win.h:1676
const _Ty * const_pointer
A type that provides a constant pointer to the type of object managed by the allocator.
Definition: Win.h:1675
_Ty * pointer
A type that provides a pointer to the type of object managed by the allocator.
Definition: Win.h:1673
void destroy(pointer ptr)
Calls destructor for the element.
Definition: Win.h:1763
Heap handle wrapper.
Definition: Win.h:1591
bool enumerate() noexcept
Enumerates allocated heap blocks using OutputDebugString()
Definition: Win.h:1613
void free_internal() noexcept override
Destroys the heap.
Definition: Win.h:1657
virtual ~heap()
Destroys the heap.
Definition: Win.h:1600
Module handle wrapper.
Definition: Win.h:1379
void free_internal() noexcept override
Frees the module.
Definition: Win.h:1400
virtual ~library()
Frees the module.
Definition: Win.h:1388
Registry key wrapper class.
Definition: Win.h:2015
void free_internal() noexcept override
Closes a handle to the registry key.
Definition: Win.h:2087
bool delete_subkey(LPCTSTR szSubkey)
Deletes the specified registry subkey.
Definition: Win.h:2039
virtual ~reg_key()
Closes a handle to the registry key.
Definition: Win.h:2024
SC_HANDLE wrapper class.
Definition: Win.h:2199
void free_internal() noexcept override
Closes an open object handle.
Definition: Win.h:2220
virtual ~sc_handle()
Closes an open object handle.
Definition: Win.h:2208
SID wrapper class.
Definition: Win.h:2097
void free_internal() noexcept override
Closes a handle to the SID.
Definition: Win.h:2118
virtual ~security_id()
Closes a handle to the SID.
Definition: Win.h:2106
Lets the calling thread impersonate the security context of a logged-on user.
Definition: Win.h:1821
BOOL m_cookie
Did impersonation succeed?
Definition: Win.h:1850
user_impersonator(HANDLE hToken) noexcept
Construct the impersonator and impersonates the given user.
Definition: Win.h:1833
virtual ~user_impersonator()
Reverts to current user and destructs the impersonator.
Definition: Win.h:1843
Memory in virtual address space of a process handle wrapper.
Definition: Win.h:1894
vmemory & operator=(vmemory &&other) noexcept
Move assignment.
Definition: Win.h:1944
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:1978
void free_internal() noexcept override
Frees the memory.
Definition: Win.h:1999
void attach(HANDLE proc, handle_type h) noexcept
Sets a new memory handle for the class.
Definition: Win.h:1961
virtual ~vmemory()
Frees the memory.
Definition: Win.h:1933
vmemory(handle_type h, HANDLE proc) noexcept
Initializes a new class instance with an already available object handle.
Definition: Win.h:1911
vmemory() noexcept
Initializes a new class instance with the memory handle set to INVAL.
Definition: Win.h:1901
vmemory(vmemory &&h) noexcept
Move constructor.
Definition: Win.h:1922
HANDLE m_proc
Handle of memory's process.
Definition: Win.h:2005
Windows HANDLE wrapper class.
Definition: Win.h:1346
void free_internal() noexcept override
Closes an open object handle.
Definition: Win.h:1367
virtual ~win_handle()
Closes an open object handle.
Definition: Win.h:1355
Windows runtime error.
Definition: Common.h:1048
#define WINSTD_NONCOPYABLE(C)
Declares a class as non-copyable.
Definition: Common.h:66
#define WINSTD_STACK_BUFFER_BYTES
Size of the stack buffer in bytes used for initial system function call.
Definition: Common.h:93
#define WINSTD_NONMOVABLE(C)
Declares a class as non-movable.
Definition: Common.h:74
#define WINSTD_HANDLE_IMPL(C, INVAL)
Implements default constructors and operators to prevent their auto-generation by compiler.
Definition: Common.h:163
static const HANDLE invalid
Invalid handle value.
Definition: Common.h:617
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:970
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:713
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:177
static BOOL StringToGuidA(LPCSTR lpszGuid, LPGUID lpGuid, LPCSTR *lpszGuidEnd=NULL) noexcept
Parses string with GUID and stores it to GUID.
Definition: Win.h:266
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:79
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:2259
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:1052
win_handle< INVALID_HANDLE_VALUE > file
File handle wrapper.
Definition: Win.h:1433
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:141
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:802
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:2236
static LSTATUS RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, winstd::reg_key &result)
Opens the specified registry key.
Definition: Win.h:2278
static LSTATUS RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, winstd::reg_key &result)
Opens the specified registry key.
Definition: Win.h:2297
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:227
static BOOL StringToGuidW(LPCWSTR lpszGuid, LPGUID lpGuid, LPCWSTR *lpszGuidEnd=NULL) noexcept
Parses string with GUID and stores it to GUID.
Definition: Win.h:339
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:604
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:1170
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:54
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:1209
win_handle< INVALID_HANDLE_VALUE > process_snapshot
Process snapshot handle wrapper.
Definition: Win.h:1425
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:23
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:1154
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:1070
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:1248
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:565
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:161
win_handle< NULL > event
Event handle wrapper.
Definition: Win.h:1507
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:590
static VOID OutputDebugStr(LPCSTR lpOutputString,...) noexcept
Formats and sends a string to the debugger for display.
Definition: Win.h:1111
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:1280
win_handle< NULL > file_mapping
File mapping.
Definition: Win.h:1440
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:881
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:634
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:1309
win_handle< NULL > process
Process handle wrapper.
Definition: Win.h:1411
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:538
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:427
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:112
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:1134
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:205
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:246
static VOID OutputDebugStrV(LPCSTR lpOutputString, va_list arg) noexcept
Formats and sends a string to the debugger for display.
Definition: Win.h:1087
win_handle< NULL > thread
Thread handle wrapper.
Definition: Win.h:1418
UnmapViewOfFile_delete()
Default construct.
Definition: Win.h:1479
void operator()(_Other *) const
Delete a pointer of another type.
Definition: Win.h:1494
void operator()(_Ty *_Ptr) const
Delete a pointer.
Definition: Win.h:1484
UnmapViewOfFile_delete< _Ty > _Myt
This type.
Definition: Win.h:1474
Deleter for unique_ptr using UnmapViewOfFile.
Definition: Win.h:1446
UnmapViewOfFile_delete(const UnmapViewOfFile_delete< _Ty2 > &)
Construct from another UnmapViewOfFile_delete.
Definition: Win.h:1457
void operator()(_Ty *_Ptr) const
Delete a pointer.
Definition: Win.h:1462
UnmapViewOfFile_delete< _Ty > _Myt
This type.
Definition: Win.h:1447
UnmapViewOfFile_delete()
Default construct.
Definition: Win.h:1452
A structure that enables an allocator for objects of one type to allocate storage for objects of anot...
Definition: Win.h:1686
heap_allocator< _Other > other
Other allocator type.
Definition: Win.h:1687