17#pragma warning(disable: 4505)
23template<
class _Traits,
class _Ax>
24static DWORD
GetModuleFileNameA(_In_opt_ HMODULE hModule, _Out_ std::basic_string<char, _Traits, _Ax> &sValue)
noexcept
32 if (dwResult < _countof(szStackBuffer)) {
34 sValue.assign(szStackBuffer, dwResult);
39 std::unique_ptr<char[]> szBuffer(
new char[dwCapacity]);
41 if (dwResult < dwCapacity) {
42 sValue.assign(szBuffer.get(), dwResult);
54template<
class _Traits,
class _Ax>
55static DWORD
GetModuleFileNameW(_In_opt_ HMODULE hModule, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &sValue)
noexcept
61 if (dwResult < _countof(szStackBuffer)) {
63 sValue.assign(szStackBuffer, dwResult);
68 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[dwCapacity]);
70 if (dwResult < dwCapacity) {
71 sValue.assign(szBuffer.get(), dwResult);
79template<
class _Traits,
class _Ax>
80static _Success_(
return != 0) int
GetWindowTextA(_In_ HWND hWnd, _Out_ std::basic_string<
char, _Traits, _Ax> &sValue) noexcept
87 iResult = ::GetWindowTextLengthA(hWnd);
93 sValue.assign(szBuffer, iResult);
96 std::unique_ptr<char[]> szBuffer(
new char[++iResult]);
98 sValue.assign(szBuffer.get(), iResult);
112template<
class _Traits,
class _Ax>
113static _Success_(
return != 0) int
GetWindowTextW(_In_ HWND hWnd, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sValue) noexcept
120 iResult = ::GetWindowTextLengthW(hWnd);
126 sValue.assign(szBuffer, iResult);
129 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[++iResult]);
131 sValue.assign(szBuffer.get(), iResult);
141template<
class _Ty,
class _Ax>
142static _Success_(
return != 0) BOOL
GetFileVersionInfoA(_In_z_ LPCSTR lptstrFilename, __reserved DWORD dwHandle, _Out_ std::vector<_Ty, _Ax> &aValue) noexcept
147 DWORD dwVerInfoSize = ::GetFileVersionInfoSizeA(lptstrFilename, &dwHandle);
148 if (dwVerInfoSize != 0) {
150 aValue.resize((dwVerInfoSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
151 return ::GetFileVersionInfoA(lptstrFilename, dwHandle, dwVerInfoSize, aValue.data());
161template<
class _Ty,
class _Ax>
162static _Success_(
return != 0) BOOL
GetFileVersionInfoW(_In_z_ LPCWSTR lptstrFilename, __reserved DWORD dwHandle, _Out_ std::vector<_Ty, _Ax> &aValue) noexcept
167 DWORD dwVerInfoSize = ::GetFileVersionInfoSizeW(lptstrFilename, &dwHandle);
168 if (dwVerInfoSize != 0) {
170 aValue.resize((dwVerInfoSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
171 return ::GetFileVersionInfoW(lptstrFilename, dwHandle, dwVerInfoSize, aValue.data());
177template<
class _Traits,
class _Ax>
178static _Success_(
return != 0) DWORD
ExpandEnvironmentStringsA(_In_z_ LPCSTR lpSrc, _Out_ std::basic_string<
char, _Traits, _Ax> &sValue) noexcept
182 for (DWORD dwSizeOut = (DWORD)strlen(lpSrc) + 0x100;;) {
183 DWORD dwSizeIn = dwSizeOut;
184 std::unique_ptr<char[]> szBuffer(
new char[(
size_t)dwSizeIn + 2]);
186 if (dwSizeOut == 0) {
189 }
else if (dwSizeOut <= dwSizeIn) {
191 sValue.assign(szBuffer.get(), dwSizeOut - 1);
205template<
class _Traits,
class _Ax>
206static _Success_(
return != 0) DWORD
ExpandEnvironmentStringsW(_In_z_ LPCWSTR lpSrc, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sValue) noexcept
208 for (DWORD dwSizeOut = (DWORD)wcslen(lpSrc) + 0x100;;) {
209 DWORD dwSizeIn = dwSizeOut;
210 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[(
size_t)dwSizeIn + 1]);
212 if (dwSizeOut == 0) {
215 }
else if (dwSizeOut <= dwSizeIn) {
217 sValue.assign(szBuffer.get(), dwSizeOut - 1);
227template<
class _Traits,
class _Ax>
228static VOID
GuidToStringA(_In_ LPCGUID lpGuid, _Out_ std::basic_string<char, _Traits, _Ax> &str)
noexcept
232 sprintf(str,
"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
236 lpGuid->Data4[0], lpGuid->Data4[1],
237 lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]);
246template<
class _Traits,
class _Ax>
247static VOID
GuidToStringW(_In_ LPCGUID lpGuid, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &str)
noexcept
251 sprintf(str, L
"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
255 lpGuid->Data4[0], lpGuid->Data4[1],
256 lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]);
261#define GuidToString GuidToStringW
263#define GuidToString GuidToStringA
267static _Success_(
return) BOOL
StringToGuidA(_In_z_ LPCSTR lpszGuid, _Out_ LPGUID lpGuid, _Out_opt_ LPCSTR *lpszGuidEnd = NULL)
noexcept
272 unsigned long long ullTmp;
274 if (!lpszGuid || !lpGuid || *lpszGuid !=
'{')
return FALSE;
277 g.Data1 = strtoul(lpszGuid, &lpszEnd, 16);
278 if (errno == ERANGE)
return FALSE;
281 if (*lpszGuid !=
'-')
return FALSE;
284 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
285 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
286 g.Data2 =
static_cast<unsigned short>(ulTmp);
289 if (*lpszGuid !=
'-')
return FALSE;
292 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
293 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
294 g.Data3 =
static_cast<unsigned short>(ulTmp);
297 if (*lpszGuid !=
'-')
return FALSE;
300 ulTmp = strtoul(lpszGuid, &lpszEnd, 16);
301 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
302 g.Data4[0] =
static_cast<unsigned char>((ulTmp >> 8) & 0xff);
303 g.Data4[1] =
static_cast<unsigned char>( ulTmp & 0xff);
306 if (*lpszGuid !=
'-')
return FALSE;
309 ullTmp = _strtoui64(lpszGuid, &lpszEnd, 16);
310 if (errno == ERANGE || ullTmp > 0xFFFFFFFFFFFF)
return FALSE;
311 g.Data4[2] =
static_cast<unsigned char>((ullTmp >> 40) & 0xff);
312 g.Data4[3] =
static_cast<unsigned char>((ullTmp >> 32) & 0xff);
313 g.Data4[4] =
static_cast<unsigned char>((ullTmp >> 24) & 0xff);
314 g.Data4[5] =
static_cast<unsigned char>((ullTmp >> 16) & 0xff);
315 g.Data4[6] =
static_cast<unsigned char>((ullTmp >> 8) & 0xff);
316 g.Data4[7] =
static_cast<unsigned char>( ullTmp & 0xff);
319 if (*lpszGuid !=
'}')
return FALSE;
323 *lpszGuidEnd = lpszGuid;
340static _Success_(
return) BOOL
StringToGuidW(_In_z_ LPCWSTR lpszGuid, _Out_ LPGUID lpGuid, _Out_opt_ LPCWSTR *lpszGuidEnd = NULL)
noexcept
345 unsigned long long ullTmp;
347 if (!lpszGuid || !lpGuid || *lpszGuid !=
'{')
return FALSE;
350 g.Data1 = wcstoul(lpszGuid, &lpszEnd, 16);
351 if (errno == ERANGE)
return FALSE;
354 if (*lpszGuid !=
'-')
return FALSE;
357 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
358 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
359 g.Data2 =
static_cast<unsigned short>(ulTmp);
362 if (*lpszGuid !=
'-')
return FALSE;
365 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
366 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
367 g.Data3 =
static_cast<unsigned short>(ulTmp);
370 if (*lpszGuid !=
'-')
return FALSE;
373 ulTmp = wcstoul(lpszGuid, &lpszEnd, 16);
374 if (errno == ERANGE || ulTmp > 0xFFFF)
return FALSE;
375 g.Data4[0] =
static_cast<unsigned char>((ulTmp >> 8) & 0xff);
376 g.Data4[1] =
static_cast<unsigned char>( ulTmp & 0xff);
379 if (*lpszGuid !=
'-')
return FALSE;
382 ullTmp = _wcstoui64(lpszGuid, &lpszEnd, 16);
383 if (errno == ERANGE || ullTmp > 0xFFFFFFFFFFFF)
return FALSE;
384 g.Data4[2] =
static_cast<unsigned char>((ullTmp >> 40) & 0xff);
385 g.Data4[3] =
static_cast<unsigned char>((ullTmp >> 32) & 0xff);
386 g.Data4[4] =
static_cast<unsigned char>((ullTmp >> 24) & 0xff);
387 g.Data4[5] =
static_cast<unsigned char>((ullTmp >> 16) & 0xff);
388 g.Data4[6] =
static_cast<unsigned char>((ullTmp >> 8) & 0xff);
389 g.Data4[7] =
static_cast<unsigned char>( ullTmp & 0xff);
392 if (*lpszGuid !=
'}')
return FALSE;
396 *lpszGuidEnd = lpszGuid;
404#define StringToGuid StringToGuidW
406#define StringToGuid StringToGuidA
427template<
class _Traits,
class _Ax>
428static LSTATUS
RegQueryStringValue(_In_ HKEY hReg, _In_z_ LPCSTR pszName, _Out_ std::basic_string<char, _Traits, _Ax> &sValue)
noexcept
432 DWORD dwSize =
sizeof(aStackBuffer), dwType;
436 if (lResult == ERROR_SUCCESS) {
437 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
439 dwSize /=
sizeof(CHAR);
440 sValue.assign(
reinterpret_cast<LPCSTR
>(aStackBuffer), dwSize &&
reinterpret_cast<LPCSTR
>(aStackBuffer)[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
441 }
else if (dwType == REG_EXPAND_SZ) {
444 lResult = ::GetLastError();
447 lResult = ERROR_INVALID_DATA;
449 }
else if (lResult == ERROR_MORE_DATA) {
450 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
452 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[dwSize /
sizeof(CHAR)]);
453 if ((lResult =
::RegQueryValueExA(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
454 dwSize /=
sizeof(CHAR);
455 sValue.assign(szBuffer.get(), dwSize && szBuffer[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
457 }
else if (dwType == REG_EXPAND_SZ) {
459 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[dwSize /
sizeof(CHAR)]);
460 if ((lResult =
::RegQueryValueExA(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
462 lResult = ::GetLastError();
466 lResult = ERROR_INVALID_DATA;
491template<
class _Traits,
class _Ax>
492static LSTATUS
RegQueryStringValue(_In_ HKEY hReg, _In_z_ LPCWSTR pszName, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &sValue)
noexcept
496 DWORD dwSize =
sizeof(aStackBuffer), dwType;
500 if (lResult == ERROR_SUCCESS) {
501 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
503 dwSize /=
sizeof(WCHAR);
504 sValue.assign(
reinterpret_cast<LPCWSTR
>(aStackBuffer), dwSize &&
reinterpret_cast<LPCWSTR
>(aStackBuffer)[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
505 }
else if (dwType == REG_EXPAND_SZ) {
508 lResult = ::GetLastError();
511 lResult = ERROR_INVALID_DATA;
513 }
else if (lResult == ERROR_MORE_DATA) {
514 if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
516 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[dwSize /
sizeof(WCHAR)]);
517 if ((lResult =
::RegQueryValueExW(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
518 dwSize /=
sizeof(WCHAR);
519 sValue.assign(szBuffer.get(), dwSize && szBuffer[dwSize - 1] == 0 ? dwSize - 1 : dwSize);
521 }
else if (dwType == REG_EXPAND_SZ) {
523 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[dwSize /
sizeof(WCHAR)]);
524 if ((lResult =
::RegQueryValueExW(hReg, pszName, NULL, NULL,
reinterpret_cast<LPBYTE
>(szBuffer.get()), &dwSize)) == ERROR_SUCCESS) {
526 lResult = ::GetLastError();
530 lResult = ERROR_INVALID_DATA;
538template<
class _Ty,
class _Ax>
539static LSTATUS
RegQueryValueExA(_In_ HKEY hKey, _In_opt_z_ LPCSTR lpValueName, __reserved LPDWORD lpReserved, _Out_opt_ LPDWORD lpType, _Out_ std::vector<_Ty, _Ax> &aData)
noexcept
543 DWORD dwSize =
sizeof(aStackBuffer);
546 lResult =
RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, aStackBuffer, &dwSize);
547 if (lResult == ERROR_SUCCESS) {
549 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
550 memcpy(aData.data(), aStackBuffer, dwSize);
551 }
else if (lResult == ERROR_MORE_DATA) {
553 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
554 lResult =
RegQueryValueExA(hKey, lpValueName, lpReserved, NULL,
reinterpret_cast<LPBYTE
>(aData.data()), &dwSize);
565template<
class _Ty,
class _Ax>
566static LSTATUS
RegQueryValueExW(_In_ HKEY hKey, _In_opt_z_ LPCWSTR lpValueName, __reserved LPDWORD lpReserved, _Out_opt_ LPDWORD lpType, _Out_ std::vector<_Ty, _Ax> &aData)
noexcept
570 DWORD dwSize =
sizeof(aStackBuffer);
573 lResult =
RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, aStackBuffer, &dwSize);
574 if (lResult == ERROR_SUCCESS) {
576 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
577 memcpy(aData.data(), aStackBuffer, dwSize);
578 }
else if (lResult == ERROR_MORE_DATA) {
580 aData.resize((dwSize +
sizeof(_Ty) - 1) /
sizeof(_Ty));
581 lResult =
RegQueryValueExW(hKey, lpValueName, lpReserved, NULL,
reinterpret_cast<LPBYTE
>(aData.data()), &dwSize);
587#if _WIN32_WINNT >= _WIN32_WINNT_VISTA
590template<
class _Traits,
class _Ax>
591static 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
596 return ERROR_CALL_NOT_IMPLEMENTED;
604template<
class _Traits,
class _Ax>
605static 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
611 Flags &= ~REG_MUI_STRING_TRUNCATE;
614 lResult =
RegLoadMUIStringW(hKey, pszValue, szStackBuffer,
sizeof(szStackBuffer), &dwSize, Flags, pszDirectory);
615 if (lResult == ERROR_SUCCESS) {
617 sOut.assign(szStackBuffer, wcsnlen(szStackBuffer, dwSize/
sizeof(
wchar_t)));
618 }
else if (lResult == ERROR_MORE_DATA) {
620 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[(dwSize +
sizeof(
wchar_t) - 1)/
sizeof(
wchar_t)]);
621 sOut.assign(szBuffer.get(), (lResult =
RegLoadMUIStringW(hKey, pszValue, szBuffer.get(), dwSize, &dwSize, Flags, pszDirectory)) == ERROR_SUCCESS ? wcsnlen(szBuffer.get(), dwSize/
sizeof(
wchar_t)) : 0);
634template<
class _Traits,
class _Ax>
635static _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
640 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
643 sMultiByteStr.assign(szStackBuffer, cchWideChar != -1 ? strnlen(szStackBuffer, cch) : (
size_t)cch - 1);
644 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
646 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
647 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
648 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
649 sMultiByteStr.assign(szBuffer.get(), cchWideChar != -1 ? strnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
661static _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
666 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
669 sMultiByteStr.assign(szStackBuffer, szStackBuffer + cch);
670 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
672 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
673 sMultiByteStr.resize(cch);
674 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, sMultiByteStr.data(), cch, lpDefaultChar, lpUsedDefaultChar);
685template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
686static _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
691 int cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
694 sMultiByteStr.assign(szStackBuffer, cch);
695 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
697 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), NULL, 0, lpDefaultChar, lpUsedDefaultChar);
698 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
699 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
700 sMultiByteStr.assign(szBuffer.get(), cch);
713template<
class _Traits,
class _Ax>
714static _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
719 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
722 sMultiByteStr.assign(szStackBuffer, cchWideChar != -1 ? strnlen(szStackBuffer, cch) : (
size_t)cch - 1);
723 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
725 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
726 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
727 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
728 sMultiByteStr.assign(szBuffer.get(), cchWideChar != -1 ? strnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
729 SecureZeroMemory(szBuffer.get(),
sizeof(CHAR)*cch);
732 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
745static _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
750 int cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
753 sMultiByteStr.assign(szStackBuffer, szStackBuffer + cch);
754 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
756 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
757 sMultiByteStr.resize(cch);
758 cch =
::WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, sMultiByteStr.data(), cch, lpDefaultChar, lpUsedDefaultChar);
761 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
773template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
774static _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
779 int cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szStackBuffer, _countof(szStackBuffer), lpDefaultChar, lpUsedDefaultChar);
782 sMultiByteStr.assign(szStackBuffer, cch);
783 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
785 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), NULL, 0, lpDefaultChar, lpUsedDefaultChar);
786 std::unique_ptr<CHAR[]> szBuffer(
new CHAR[cch]);
787 cch =
::WideCharToMultiByte(CodePage, dwFlags, sWideCharStr.c_str(), (
int)sWideCharStr.length(), szBuffer.get(), cch, lpDefaultChar, lpUsedDefaultChar);
788 sMultiByteStr.assign(szBuffer.get(), cch);
789 SecureZeroMemory(szBuffer.get(),
sizeof(CHAR)*cch);
792 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
802template<
class _Traits,
class _Ax>
803static _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
808 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
811 sWideCharStr.assign(szStackBuffer, cbMultiByte != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
812 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
815 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
817 sWideCharStr.assign(szBuffer.get(), cbMultiByte != -1 ? wcsnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
829static _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
834 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
837 sWideCharStr.assign(szStackBuffer, szStackBuffer + cch);
838 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
841 sWideCharStr.resize(cch);
842 cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, sWideCharStr.data(), cch);
853template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
854static _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
859 int cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szStackBuffer, _countof(szStackBuffer));
862 sWideCharStr.assign(szStackBuffer, cch);
863 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
865 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), NULL, 0);
866 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
867 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szBuffer.get(), cch);
868 sWideCharStr.assign(szBuffer.get(), cch);
881template<
class _Traits,
class _Ax>
882static _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
887 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
890 sWideCharStr.assign(szStackBuffer, cbMultiByte != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
891 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
894 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
896 sWideCharStr.assign(szBuffer.get(), cbMultiByte != -1 ? wcsnlen(szBuffer.get(), cch) : (
size_t)cch - 1);
897 SecureZeroMemory(szBuffer.get(),
sizeof(WCHAR)*cch);
900 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
913static _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
918 int cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, szStackBuffer, _countof(szStackBuffer));
921 sWideCharStr.assign(szStackBuffer, szStackBuffer + cch);
922 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
925 sWideCharStr.resize(cch);
926 cch =
::MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, sWideCharStr.data(), cch);
929 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
941template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
942static _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
947 int cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szStackBuffer, _countof(szStackBuffer));
950 sWideCharStr.assign(szStackBuffer, cch);
951 }
else if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
953 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), NULL, 0);
954 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
955 cch =
::MultiByteToWideChar(CodePage, dwFlags, sMultiByteStr.c_str(), (
int)sMultiByteStr.length(), szBuffer.get(), cch);
956 sWideCharStr.assign(szBuffer.get(), cch);
957 SecureZeroMemory(szBuffer.get(),
sizeof(WCHAR)*cch);
960 SecureZeroMemory(szStackBuffer,
sizeof(szStackBuffer));
970template<
class _Traits,
class _Ax>
971static _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
976 int cch =
::NormalizeString(NormForm, lpSrcString, cwSrcLength, szStackBuffer, _countof(szStackBuffer));
979 sDstString.assign(szStackBuffer, cwSrcLength != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
981 switch (::GetLastError()) {
982 case ERROR_INSUFFICIENT_BUFFER:
983 for (
int i = 10; i--;) {
986 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
987 cch =
::NormalizeString(NormForm, lpSrcString, cwSrcLength, szBuffer.get(), cch);
989 sDstString.assign(szBuffer.get(), cwSrcLength != -1 ? wcsnlen(szStackBuffer, cch) : (
size_t)cch - 1);
992 if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
1013template<
class _Traits1,
class _Ax1,
class _Traits2,
class _Ax2>
1014static _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
1019 int cch =
::NormalizeString(NormForm, sSrcString.c_str(), (
int)sSrcString.length(), szStackBuffer, _countof(szStackBuffer));
1022 sDstString.assign(szStackBuffer, cch);
1024 switch (::GetLastError()) {
1025 case ERROR_INSUFFICIENT_BUFFER:
1026 for (
int i = 10; i--;) {
1029 std::unique_ptr<WCHAR[]> szBuffer(
new WCHAR[cch]);
1030 cch =
::NormalizeString(NormForm, sSrcString.c_str(), (
int)sSrcString.length(), szBuffer.get(), cch);
1032 sDstString.assign(szBuffer.get(), cch);
1035 if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
1052template<
class _Traits,
class _Ax>
1053static _Success_(
return != 0) int WINAPI
LoadStringA(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_ std::basic_string<
char, _Traits, _Ax> &sBuffer) noexcept
1057 int i =
LoadStringA(hInstance, uID,
reinterpret_cast<LPSTR
>(&pszStr), 0);
1059 sBuffer.assign(pszStr, i);
1070template<
class _Traits,
class _Ax>
1071static _Success_(
return != 0) int WINAPI
LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_ std::basic_string<
wchar_t, _Traits, _Ax> &sBuffer) noexcept
1075 int i =
LoadStringW(hInstance, uID,
reinterpret_cast<LPWSTR
>(&pszStr), 0);
1077 sBuffer.assign(pszStr, i);
1091 try {
vsprintf(str, lpOutputString, arg); }
catch (...) {
return; }
1092 OutputDebugStringA(str.c_str());
1103 try {
vsprintf(str, lpOutputString, arg); }
catch (...) {
return; }
1104 OutputDebugStringW(str.c_str());
1115 va_start(arg, lpOutputString);
1128 va_start(arg, lpOutputString);
1134template<
class _Traits,
class _Ax>
1135static _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
1137 int iResult =
GetDateFormatA(Locale, dwFlags, lpDate, lpFormat, NULL, 0);
1140 std::unique_ptr<char[]> szBuffer(
new char[iResult]);
1141 iResult =
GetDateFormatA(Locale, dwFlags, lpDate, lpFormat, szBuffer.get(), iResult);
1142 sDate.assign(szBuffer.get(), iResult ? iResult - 1 : 0);
1154template<
class _Traits,
class _Ax>
1155static _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
1157 int iResult =
GetDateFormatW(Locale, dwFlags, lpDate, lpFormat, NULL, 0);
1160 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[iResult]);
1161 iResult =
GetDateFormatW(Locale, dwFlags, lpDate, lpFormat, szBuffer.get(), iResult);
1162 sDate.assign(szBuffer.get(), iResult ? iResult - 1 : 0);
1170template<
class _Traits,
class _Ax>
1171static _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
1175 DWORD dwNameLen = 0, dwRefDomainLen = 0;
1179 NULL, &dwRefDomainLen,
1183 if (sName ) sName ->clear();
1184 if (sReferencedDomainName) sReferencedDomainName->clear();
1186 }
else if (GetLastError() == ERROR_MORE_DATA) {
1188 std::unique_ptr<char[]> bufName (
new char[dwNameLen ]);
1189 std::unique_ptr<char[]> bufRefDomain(
new char[dwRefDomainLen]);
1191 bufName .get(), &dwNameLen ,
1192 bufRefDomain.get(), &dwRefDomainLen,
1195 if (sName ) sName ->assign(bufName .get(), dwNameLen - 1);
1196 if (sReferencedDomainName) sReferencedDomainName->assign(bufRefDomain.get(), dwRefDomainLen - 1);
1209template<
class _Traits,
class _Ax>
1210static _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
1214 DWORD dwNameLen = 0, dwRefDomainLen = 0;
1218 NULL, &dwRefDomainLen,
1222 if (sName ) sName ->clear();
1223 if (sReferencedDomainName) sReferencedDomainName->clear();
1225 }
else if (GetLastError() == ERROR_MORE_DATA) {
1227 std::unique_ptr<wchar_t[]> bufName (
new wchar_t[dwNameLen ]);
1228 std::unique_ptr<wchar_t[]> bufRefDomain(
new wchar_t[dwRefDomainLen]);
1230 bufName .get(), &dwNameLen ,
1231 bufRefDomain.get(), &dwRefDomainLen,
1234 if (sName ) sName ->assign(bufName .get(), dwNameLen - 1);
1235 if (sReferencedDomainName) sReferencedDomainName->assign(bufRefDomain.get(), dwRefDomainLen - 1);
1248static _Success_(
return != FALSE) BOOL
CreateWellKnownSid(_In_ WELL_KNOWN_SID_TYPE WellKnownSidType, _In_opt_ PSID DomainSid, _Inout_ std::unique_ptr<SID> &Sid)
1251 DWORD dwSize =
sizeof(szStackBuffer);
1255 Sid.reset((SID*)
new BYTE[dwSize]);
1256 memcpy(Sid.get(), szStackBuffer, dwSize);
1258 }
else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
1260 Sid.reset((SID*)
new BYTE[dwSize]);
1272static _Success_(
return != 0) BOOL
GetTokenInformation(_In_ HANDLE TokenHandle, _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, _Out_ std::unique_ptr<_Ty> &TokenInformation) noexcept
1277 if (
GetTokenInformation(TokenHandle, TokenInformationClass, szStackBuffer,
sizeof(szStackBuffer), &dwSize)) {
1279 TokenInformation.reset((_Ty*)(
new BYTE[dwSize]));
1280 memcpy(TokenInformation.get(), szStackBuffer, dwSize);
1282 }
else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
1284 TokenInformation.reset((_Ty*)(
new BYTE[dwSize]));
1285 return GetTokenInformation(TokenHandle, TokenInformationClass, TokenInformation.get(), dwSize, &dwSize);
1295template<
class _Traits,
class _Ax>
1296static _Success_(
return != 0) BOOL
QueryFullProcessImageNameA(_In_ HANDLE hProcess, _In_ DWORD dwFlags, _Inout_ std::basic_string<
char, _Traits, _Ax>& sExeName)
1299 DWORD dwSize = _countof(szStackBuffer);
1304 sExeName.assign(szStackBuffer, dwSize);
1307 for (DWORD dwCapacity = 2 *
WINSTD_STACK_BUFFER_BYTES /
sizeof(
char); GetLastError() == ERROR_INSUFFICIENT_BUFFER; dwCapacity *= 2) {
1309 std::unique_ptr<char[]> szBuffer(
new char[dwCapacity]);
1310 dwSize = dwCapacity;
1312 sExeName.assign(szBuffer.get(), dwSize);
1324template<
class _Traits,
class _Ax>
1325static _Success_(
return != 0) BOOL
QueryFullProcessImageNameW(_In_ HANDLE hProcess, _In_ DWORD dwFlags, _Inout_ std::basic_string<
wchar_t, _Traits, _Ax>& sExeName)
1328 DWORD dwSize = _countof(szStackBuffer);
1333 sExeName.assign(szStackBuffer, dwSize);
1336 for (DWORD dwCapacity = 2 *
WINSTD_STACK_BUFFER_BYTES /
sizeof(
wchar_t); GetLastError() == ERROR_INSUFFICIENT_BUFFER; dwCapacity *= 2) {
1338 std::unique_ptr<wchar_t[]> szBuffer(
new wchar_t[dwCapacity]);
1339 dwSize = dwCapacity;
1341 sExeName.assign(szBuffer.get(), dwSize);
1360 template<HANDLE INVALID>
1480 if (!UnmapViewOfFile(_Ptr))
1502 if (!UnmapViewOfFile(_Ptr))
1509 template<
class _Other>
1512 if (!UnmapViewOfFile(_Ptr))
1541 InitializeCriticalSection(&
m_data);
1551 DeleteCriticalSection(&
m_data);
1559 operator LPCRITICAL_SECTION() noexcept
1638 PROCESS_HEAP_ENTRY e;
1640 while (HeapWalk(
m_h, &e) != FALSE) {
1641 if ((e.wFlags & PROCESS_HEAP_ENTRY_BUSY) != 0) {
1643 _T(
"Allocated block%s%s\n")
1644 _T(
" Data portion begins at: %#p\n Size: %d bytes\n")
1645 _T(
" Overhead: %d bytes\n Region index: %d\n"),
1646 (e.wFlags & PROCESS_HEAP_ENTRY_MOVEABLE) != 0 ?
tstring_printf(_T(
", movable with HANDLE %#p"), e.Block.hMem).c_str() : _T(
""),
1647 (e.wFlags & PROCESS_HEAP_ENTRY_DDESHARE) != 0 ? _T(
", DDESHARE") : _T(
""),
1657 const DWORD dwResult = GetLastError();
1658 if (dwResult != ERROR_NO_MORE_ITEMS)
1683 template <
class _Ty>
1700 template <
class _Other>
1721 template <
class _Other>
1747 UNREFERENCED_PARAMETER(size);
1749 HeapFree(
m_heap, 0, ptr);
1760 ::new ((
void*)ptr) _Ty(val);
1771 ::new ((
void*)ptr) _Ty(std::forward<_Ty>(val));
1814 if (!ActivateActCtx(hActCtx, &
m_cookie))
1882 m_cookie = hToken && ImpersonateLoggedOnUser(hToken);
1900 TOKEN_PRIVILEGES privileges = { 1, {{{ 0, 0 }, SE_PRIVILEGE_ENABLED }} };
1901 if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &privileges.Privileges[0].Luid) ||
1902 !ImpersonateSelf(SecurityImpersonation))
1907 if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES, FALSE, &h))
1910 if (!AdjustTokenPrivileges(thread_token, FALSE, &privileges,
sizeof(privileges), NULL, NULL))
1915 PROCESSENTRY32 entry = {
sizeof(PROCESSENTRY32) };
1918 while (_tcsicmp(entry.szExeFile, TEXT(
"winlogon.exe")) != 0)
1921 process winlogon_process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, entry.th32ProcessID);
1922 if (!winlogon_process)
1924 if (!
OpenProcessToken(winlogon_process, TOKEN_IMPERSONATE | TOKEN_DUPLICATE, &h))
1927 if (!DuplicateToken(winlogon_token, SecurityImpersonation, &h))
1930 if (!SetThreadToken(NULL, duplicated_token))
1938 DWORD dwResult = GetLastError();
1940 SetLastError(dwResult);
1973 SetConsoleCtrlHandler(
m_handler, FALSE);
2014 m_proc(std::move(h.m_proc)),
2027 VirtualFreeEx(
m_proc,
m_h, 0, MEM_RELEASE);
2037 if (
this != std::addressof(other)) {
2039 m_proc = std::move(other.m_proc);
2070 _In_ HANDLE hProcess,
2071 _In_opt_ LPVOID lpAddress,
2073 _In_ DWORD flAllocationType,
2074 _In_ DWORD flProtect)
noexcept
2076 handle_type h = VirtualAllocEx(hProcess, lpAddress, dwSize, flAllocationType, flProtect);
2092 VirtualFreeEx(
m_proc,
m_h, 0, MEM_RELEASE);
2134 s = RegDeleteKey(
m_h, szSubkey);
2135 if (s == ERROR_SUCCESS || s == ERROR_FILE_NOT_FOUND)
2141 s = RegOpenKeyEx(
m_h, szSubkey, 0, KEY_ENUMERATE_SUB_KEYS, &h);
2142 if (s == ERROR_SUCCESS)
2149 TCHAR szName[MAX_PATH];
2150 DWORD dwSize = _countof(szName);
2151 s = RegEnumKeyEx(k, 0, szName, &dwSize, NULL, NULL, NULL, NULL);
2152 if (s == ERROR_SUCCESS)
2154 else if (s == ERROR_NO_MORE_ITEMS)
2163 s = RegDeleteKey(
m_h, szSubkey);
2164 if (s == ERROR_SUCCESS)
2229 hProcess = INVALID_HANDLE_VALUE;
2230 hThread = INVALID_HANDLE_VALUE;
2240 #pragma warning(push)
2241 #pragma warning(disable: 6001)
2243 if (hProcess != INVALID_HANDLE_VALUE)
2244 CloseHandle(hProcess);
2246 if (hThread != INVALID_HANDLE_VALUE)
2247 CloseHandle(hThread);
2249 #pragma warning(pop)
2282 DeregisterEventSource(
m_h);
2313 CloseServiceHandle(
m_h);
2323#pragma warning(push)
2324#pragma warning(disable: 4505)
2329 _In_ LPCSTR lpSubKey,
2330 _Reserved_ DWORD Reserved,
2331 _In_opt_ LPSTR lpClass,
2332 _In_ DWORD dwOptions,
2333 _In_ REGSAM samDesired,
2334 _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
2336 _Out_opt_ LPDWORD lpdwDisposition)
2339 LSTATUS s =
RegCreateKeyExA(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, &h, lpdwDisposition);
2340 if (s == ERROR_SUCCESS)
2352 _In_ LPCWSTR lpSubKey,
2353 _Reserved_ DWORD Reserved,
2354 _In_opt_ LPWSTR lpClass,
2355 _In_ DWORD dwOptions,
2356 _In_ REGSAM samDesired,
2357 _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
2359 _Out_opt_ LPDWORD lpdwDisposition)
2362 LSTATUS s =
RegCreateKeyExW(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, &h, lpdwDisposition);
2363 if (s == ERROR_SUCCESS)
2371 _In_opt_ LPCSTR lpSubKey,
2372 _In_opt_ DWORD ulOptions,
2373 _In_ REGSAM samDesired,
2377 LSTATUS s =
RegOpenKeyExA(hKey, lpSubKey, ulOptions, samDesired, &h);
2378 if (s == ERROR_SUCCESS)
2390 _In_opt_ LPCWSTR lpSubKey,
2391 _In_opt_ DWORD ulOptions,
2392 _In_ REGSAM samDesired,
2396 LSTATUS s =
RegOpenKeyExW(hKey, lpSubKey, ulOptions, samDesired, &h);
2397 if (s == ERROR_SUCCESS)
2411 TokenHandle.attach(h);
2422static BOOL
DuplicateTokenEx(_In_ HANDLE hExistingToken, _In_ DWORD dwDesiredAccess, _In_opt_ LPSECURITY_ATTRIBUTES lpTokenAttributes, _In_ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, _In_ TOKEN_TYPE TokenType, _Inout_
winstd::win_handle<NULL> &NewToken)
2425 if (
DuplicateTokenEx(hExistingToken, dwDesiredAccess, lpTokenAttributes, ImpersonationLevel, TokenType, &h)) {
Activates given activation context in constructor and deactivates it in destructor.
Definition: Win.h:1800
actctx_activator(HANDLE hActCtx) noexcept
Construct the activator and activates the given activation context.
Definition: Win.h:1812
virtual ~actctx_activator()
Deactivates activation context and destructs the activator.
Definition: Win.h:1823
ULONG_PTR m_cookie
Cookie for context deactivation.
Definition: Win.h:1830
Base template class to support string formatting using printf() style templates.
Definition: Common.h:1080
Console control handler stack management.
Definition: Win.h:1948
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:1960
virtual ~console_ctrl_handler()
Pops console control handler from the console control handler stack.
Definition: Win.h:1970
PHANDLER_ROUTINE m_handler
Pointer to console control handler.
Definition: Win.h:1978
BOOL m_cookie
Did pushing the console control handler succeed?
Definition: Win.h:1977
Critical section wrapper.
Definition: Win.h:1529
critical_section() noexcept
Construct the object and initializes a critical section object.
Definition: Win.h:1539
CRITICAL_SECTION m_data
Critical section struct.
Definition: Win.h:1565
virtual ~critical_section()
Releases all resources used by an unowned critical section object.
Definition: Win.h:1549
Event log handle wrapper.
Definition: Win.h:2259
void free_internal() noexcept override
Closes an event log handle.
Definition: Win.h:2280
virtual ~event_log()
Closes an event log handle.
Definition: Win.h:2268
Find-file handle wrapper.
Definition: Win.h:1574
virtual ~find_file()
Closes a file search handle.
Definition: Win.h:1583
void free_internal() noexcept override
Closes a file search handle.
Definition: Win.h:1595
Base abstract template class to support generic object handle keeping.
Definition: Common.h:569
LPVOID handle_type
Datatype of the object handle this template class handles.
Definition: Common.h:574
handle_type m_h
Object handle.
Definition: Common.h:823
void attach(handle_type h) noexcept
Sets a new object handle for the class.
Definition: Common.h:786
HeapAlloc allocator.
Definition: Win.h:1685
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:1694
_Ty value_type
A type that is managed by the allocator.
Definition: Win.h:1687
heap_allocator(const heap_allocator< _Other > &other)
Constructs allocator from another type.
Definition: Win.h:1722
HANDLE m_heap
Heap handle.
Definition: Win.h:1793
pointer allocate(size_type count)
Allocates a new memory block.
Definition: Win.h:1733
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:1695
heap_allocator(HANDLE heap)
Constructs allocator.
Definition: Win.h:1712
_Ty & reference
A type that provides a reference to the type of object managed by the allocator.
Definition: Win.h:1690
void construct(pointer ptr, _Ty &&val)
Calls moving constructor for the element.
Definition: Win.h:1769
void deallocate(pointer ptr, size_type size)
Frees memory block.
Definition: Win.h:1745
size_type max_size() const
Returns maximum memory block size.
Definition: Win.h:1787
void construct(pointer ptr, const _Ty &val)
Calls copying constructor for the element.
Definition: Win.h:1758
const _Ty & const_reference
A type that provides a constant reference to type of object managed by the allocator.
Definition: Win.h:1692
const _Ty * const_pointer
A type that provides a constant pointer to the type of object managed by the allocator.
Definition: Win.h:1691
_Ty * pointer
A type that provides a pointer to the type of object managed by the allocator.
Definition: Win.h:1689
void destroy(pointer ptr)
Calls destructor for the element.
Definition: Win.h:1779
Heap handle wrapper.
Definition: Win.h:1607
bool enumerate() noexcept
Enumerates allocated heap blocks using OutputDebugString()
Definition: Win.h:1629
void free_internal() noexcept override
Destroys the heap.
Definition: Win.h:1673
virtual ~heap()
Destroys the heap.
Definition: Win.h:1616
Base class for thread impersonation of another security context.
Definition: Win.h:1837
virtual ~impersonator()
Reverts to current user and destructs the impersonator.
Definition: Win.h:1849
impersonator() noexcept
Construct the impersonator.
Definition: Win.h:1842
BOOL m_cookie
Did impersonation succeed?
Definition: Win.h:1861
Module handle wrapper.
Definition: Win.h:1395
void free_internal() noexcept override
Frees the module.
Definition: Win.h:1416
virtual ~library()
Frees the module.
Definition: Win.h:1404
Registry key wrapper class.
Definition: Win.h:2106
void free_internal() noexcept override
Closes a handle to the registry key.
Definition: Win.h:2178
bool delete_subkey(LPCTSTR szSubkey)
Deletes the specified registry subkey.
Definition: Win.h:2130
virtual ~reg_key()
Closes a handle to the registry key.
Definition: Win.h:2115
SC_HANDLE wrapper class.
Definition: Win.h:2290
void free_internal() noexcept override
Closes an open object handle.
Definition: Win.h:2311
virtual ~sc_handle()
Closes an open object handle.
Definition: Win.h:2299
SID wrapper class.
Definition: Win.h:2188
void free_internal() noexcept override
Closes a handle to the SID.
Definition: Win.h:2209
virtual ~security_id()
Closes a handle to the SID.
Definition: Win.h:2197
Lets the calling thread impersonate the security context of the SYSTEM user.
Definition: Win.h:1890
system_impersonator() noexcept
Construct the impersonator and impersonates the SYSTEM user.
Definition: Win.h:1898
Lets the calling thread impersonate the security context of a logged-on user.
Definition: Win.h:1868
user_impersonator(HANDLE hToken) noexcept
Construct the impersonator and impersonates the given user.
Definition: Win.h:1880
Memory in virtual address space of a process handle wrapper.
Definition: Win.h:1985
vmemory & operator=(vmemory &&other) noexcept
Move assignment.
Definition: Win.h:2035
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:2069
void free_internal() noexcept override
Frees the memory.
Definition: Win.h:2090
void attach(HANDLE proc, handle_type h) noexcept
Sets a new memory handle for the class.
Definition: Win.h:2052
virtual ~vmemory()
Frees the memory.
Definition: Win.h:2024
vmemory(handle_type h, HANDLE proc) noexcept
Initializes a new class instance with an already available object handle.
Definition: Win.h:2002
vmemory() noexcept
Initializes a new class instance with the memory handle set to INVAL.
Definition: Win.h:1992
vmemory(vmemory &&h) noexcept
Move constructor.
Definition: Win.h:2013
HANDLE m_proc
Handle of memory's process.
Definition: Win.h:2096
Windows HANDLE wrapper class.
Definition: Win.h:1362
void free_internal() noexcept override
Closes an open object handle.
Definition: Win.h:1383
virtual ~win_handle()
Closes an open object handle.
Definition: Win.h:1371
Windows runtime error.
Definition: Common.h:1013
#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:579
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:971
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:714
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:178
static BOOL StringToGuidA(LPCSTR lpszGuid, LPGUID lpGuid, LPCSTR *lpszGuidEnd=NULL) noexcept
Parses string with GUID and stores it to GUID.
Definition: Win.h:267
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:80
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:2350
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:1053
win_handle< INVALID_HANDLE_VALUE > file
File handle wrapper.
Definition: Win.h:1449
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:142
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:803
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:2327
static LSTATUS RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, winstd::reg_key &result)
Opens the specified registry key.
Definition: Win.h:2369
static LSTATUS RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, winstd::reg_key &result)
Opens the specified registry key.
Definition: Win.h:2388
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:228
static BOOL StringToGuidW(LPCWSTR lpszGuid, LPGUID lpGuid, LPCWSTR *lpszGuidEnd=NULL) noexcept
Parses string with GUID and stores it to GUID.
Definition: Win.h:340
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:605
static BOOL OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, winstd::win_handle< NULL > &TokenHandle)
Opens the access token associated with a process.
Definition: Win.h:2407
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:1171
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:55
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:1210
win_handle< INVALID_HANDLE_VALUE > process_snapshot
Process snapshot handle wrapper.
Definition: Win.h:1441
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:24
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:1155
static BOOL CreateWellKnownSid(WELL_KNOWN_SID_TYPE WellKnownSidType, PSID DomainSid, std::unique_ptr< SID > &Sid)
Creates a SID for predefined aliases.
Definition: Win.h:1248
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:1071
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:1272
static BOOL DuplicateTokenEx(HANDLE hExistingToken, DWORD dwDesiredAccess, LPSECURITY_ATTRIBUTES lpTokenAttributes, SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, TOKEN_TYPE TokenType, winstd::win_handle< NULL > &NewToken)
Creates a new access token that duplicates an existing token. This function can create either a prima...
Definition: Win.h:2422
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:566
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:162
win_handle< NULL > event
Event handle wrapper.
Definition: Win.h:1523
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:591
static VOID OutputDebugStr(LPCSTR lpOutputString,...) noexcept
Formats and sends a string to the debugger for display.
Definition: Win.h:1112
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:1296
win_handle< NULL > file_mapping
File mapping.
Definition: Win.h:1456
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:882
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:635
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:1325
win_handle< NULL > process
Process handle wrapper.
Definition: Win.h:1427
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:539
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:428
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:113
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:1135
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:206
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:247
static VOID OutputDebugStrV(LPCSTR lpOutputString, va_list arg) noexcept
Formats and sends a string to the debugger for display.
Definition: Win.h:1088
win_handle< NULL > thread
Thread handle wrapper.
Definition: Win.h:1434
UnmapViewOfFile_delete()
Default construct.
Definition: Win.h:1495
void operator()(_Other *) const
Delete a pointer of another type.
Definition: Win.h:1510
void operator()(_Ty *_Ptr) const
Delete a pointer.
Definition: Win.h:1500
UnmapViewOfFile_delete< _Ty > _Myt
This type.
Definition: Win.h:1490
Deleter for unique_ptr using UnmapViewOfFile.
Definition: Win.h:1462
UnmapViewOfFile_delete(const UnmapViewOfFile_delete< _Ty2 > &)
Construct from another UnmapViewOfFile_delete.
Definition: Win.h:1473
void operator()(_Ty *_Ptr) const
Delete a pointer.
Definition: Win.h:1478
UnmapViewOfFile_delete< _Ty > _Myt
This type.
Definition: Win.h:1463
UnmapViewOfFile_delete()
Default construct.
Definition: Win.h:1468
A structure that enables an allocator for objects of one type to allocate storage for objects of anot...
Definition: Win.h:1702
heap_allocator< _Other > other
Other allocator type.
Definition: Win.h:1703