PsReferenceImpersonationTokenEx
VOID *__fastcall PsReferenceImpersonationTokenEx(INT64 a1, CHAR a2, BYTE *a3, BOOL *a4, INT64 *a5, BYTE *a6){
_ETHREAD *CurrentThread;
__int64 v12;
void *v13;
BYTE v14;
if( (*(_DWORD *)(a1 + 1296) & 8) == 0 )
return 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v12 = *(_QWORD *)(a1 + 544);
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx(a1 + 1280, 0i64);
if( (*(_DWORD *)(a1 + 1296) & 8) != 0 )
{
if( (a2 & 1) != 0 && (v13 = *(void **)(a1 + 1464)) != 0i64 )
{
v14 = 0;
}
else
{
v13 = (void *)(*(_QWORD *)(a1 + 1192) & 0xFFFFFFFFFFFFFFF8ui64);
v14 = BYTE1(*(_DWORD *)(a1 + 1296)) & 1;
}
*a3 = v14;
ObfReferenceObject(v13);
*(_DWORD *)a5 = *(_DWORD *)(a1 + 1192) & 3;
*(_BYTE *)a4 = (*(_BYTE *)(a1 + 1192) & 4) != 0;
if( a6 )
*a6 = *(_BYTE *)(v12 + 2170);
}
else
{
v13 = 0i64;
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 1280), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 1280));
KeAbPostRelease((PVOID)(a1 + 1280));
KeLeaveCriticalRegionThread((__int64)CurrentThread);
return v13;
}Referenced by:
CmpCmdHiveOpen
CmpOpenHiveFile
ObpLookupObjectName
ObpReferenceDeviceMap
PsReferenceImpersonationToken
SeCaptureSubjectContext
SeCreateClientSecurity
SeCreateClientSecurityEx
SepReferenceTokenUsingPseudoHandle