GetTokenInformation<>() template introduced
This commit is contained in:
parent
7fac8e286f
commit
750f40fada
@ -278,6 +278,13 @@ template<class _Elem, class _Traits, class _Ax> inline BOOL LookupAccountSidA(_I
|
|||||||
///
|
///
|
||||||
template<class _Elem, class _Traits, class _Ax> inline BOOL LookupAccountSidW(_In_opt_ LPCWSTR lpSystemName, _In_ PSID lpSid, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sName, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sReferencedDomainName, _Out_ PSID_NAME_USE peUse);
|
template<class _Elem, class _Traits, class _Ax> inline BOOL LookupAccountSidW(_In_opt_ LPCWSTR lpSystemName, _In_ PSID lpSid, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sName, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sReferencedDomainName, _Out_ PSID_NAME_USE peUse);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Retrieves a specified type of information about an access token. The calling process must have appropriate access rights to obtain the information.
|
||||||
|
///
|
||||||
|
/// \sa [GetTokenInformation function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671.aspx)
|
||||||
|
///
|
||||||
|
template<class _Ty> inline BOOL GetTokenInformation(_In_ HANDLE TokenHandle, _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, _Out_ std::unique_ptr<_Ty> &TokenInformation);
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@ -1504,3 +1511,31 @@ inline BOOL LookupAccountSidW(_In_opt_ LPCWSTR lpSystemName, _In_ PSID lpSid, _O
|
|||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class _Ty>
|
||||||
|
inline BOOL GetTokenInformation(_In_ HANDLE TokenHandle, _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, _Out_ std::unique_ptr<_Ty> &TokenInformation)
|
||||||
|
{
|
||||||
|
BYTE szStackBuffer[WINSTD_STACK_BUFFER_BYTES/sizeof(BYTE)];
|
||||||
|
DWORD dwSize;
|
||||||
|
|
||||||
|
if (GetTokenInformation(TokenHandle, TokenInformationClass, szStackBuffer, sizeof(szStackBuffer), &dwSize)) {
|
||||||
|
// The stack buffer was big enough to retrieve complete data. Alloc and copy.
|
||||||
|
TokenInformation.reset((_Ty*)(new BYTE[dwSize / sizeof(BYTE)]));
|
||||||
|
if (!TokenInformation) {
|
||||||
|
SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
memcpy(TokenInformation.get(), szStackBuffer, dwSize);
|
||||||
|
return TRUE;
|
||||||
|
} else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
|
||||||
|
// The stack buffer was too small to retrieve complete data. Alloc and retry.
|
||||||
|
TokenInformation.reset((_Ty*)(new BYTE[dwSize / sizeof(BYTE)]));
|
||||||
|
if (!TokenInformation) {
|
||||||
|
SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return GetTokenInformation(TokenHandle, TokenInformationClass, TokenInformation.get(), dwSize, &dwSize);
|
||||||
|
} else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user