NtOpenThreadTokenEx
NTSTATUS __stdcall NtOpenThreadTokenEx(
PVOID ThreadHandle,
UINT64 DesiredAccess,
UINT8 OpenAsSelf,
UINT64 HandleAttributes,
PVOID *TokenHandle){
KPROCESSOR_MODE v5;
int v6;
ULONG v7;
PVOID *v8;
__int64 v9;
KPROCESSOR_MODE v10;
NTSTATUS result;
_DWORD *v12;
_ETHREAD *CurrentThread;
INT64 *v14;
_DWORD *v15;
struct _DMA_ADAPTER *v16;
int v17;
_SECURITY_IMPERSONATION_LEVEL v18;
char v19;
NTSTATUS inserted;
PVOID v21;
NTSTATUS ImpersonationTokenDacl;
__int64 v23;
struct DMA_ADAPTER *v24;
__int64 v25;
PVOID *Object;
bool v27;
char v28;
bool v29;
BOOLEAN v30;
KPROCESSOR_MODE v31;
PVOID v32;
_SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
PVOID DuplicateToken;
ULONG HandleAttributesa;
PVOID P;
VOID *TrustLevelSid;
PVOID Handle;
struct _SE_IMPERSONATION_STATE ImpersonationState;
_OBJECT_ATTRIBUTES ObjectAttributes;
__int16 v41[16];
PVOID v42;
ACCESS_MASK DesiredAccessa;
DesiredAccessa = DesiredAccess;
DuplicateToken = 0i64;
v28 = 0;
v29 = 0;
ImpersonationLevel = SecurityAnonymous;
ImpersonationState = 0i64;
v30 = 0;
Handle = 0i64;
memset(v41, 0, sizeof(v41));
v42 = 0i64;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
P = 0i64;
TrustLevelSid = 0i64;
v27 = 0;
v5 = *((_BYTE *)KeGetCurrentThread() + 562);
v31 = v5;
v6 = 73714;
if( v5 )
v6 = 7666;
v7 = HandleAttributes & v6;
HandleAttributesa = v7;
if( v5 )
{
v8 = TokenHandle;
v9 = (__int64)TokenHandle;
if( (unsigned __int64)TokenHandle >= 0x7FFFFFFF0000i64 )
v9 = 0x7FFFFFFF0000i64;
*(_QWORD *)v9 = *(_QWORD *)v9;
}
else
{
v8 = TokenHandle;
}
v10 = *((_BYTE *)KeGetCurrentThread() + 562);
v32 = 0i64;
result = ObReferenceObjectByHandle(ThreadHandle, 0x800u, (POBJECT_TYPE)PsThreadType, v10, &v32, 0i64);
if( result >= 0 )
{
v12 = v32;
if( (*((_DWORD *)v32 + 324) & 8) == 0 )
goto LABEL_9;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v14 = (INT64 *)((char *)v32 + 1280);
ExAcquirePushLockSharedEx((UINT64)v32 + 1280, 0i64);
if( (v12[324] & 8) != 0 )
{
v15 = v32;
v16 = (struct _DMA_ADAPTER *)(*((_QWORD *)v32 + 149) & 0xFFFFFFFFFFFFFFF8ui64);
v17 = v12[324];
ObfReferenceObject(v16);
ImpersonationLevel = v15[298] & 3;
v29 = (v15[298] & 4) != 0;
v28 = BYTE1(v17) & 1;
v7 = HandleAttributesa;
}
else
{
v16 = 0i64;
}
if( _InterlockedCompareExchange64(v14, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v14);
KeAbPostRelease(v14);
KeLeaveCriticalRegionThread((__int64)CurrentThread);
if( !v16 )
{
LABEL_9:
HalPutDmaAdapter((PADAPTER_OBJECT)v32);
return -1073741700;
}
v18 = ImpersonationLevel;
if( ImpersonationLevel == SecurityAnonymous )
{
HalPutDmaAdapter(v16);
HalPutDmaAdapter((PADAPTER_OBJECT)v32);
return -1073741658;
}
if( OpenAsSelf )
{
v30 = PsDisableImpersonation(KeGetCurrentThread(), &ImpersonationState);
v18 = ImpersonationLevel;
}
v19 = v28;
if( v28 )
{
if( OpenAsSelf )
{
if( ImpersonationState.Token )
{
TrustLevelSid = (VOID *)*((_QWORD *)ImpersonationState.Token + 138);
v27 = 1;
}
}
else
{
v25 = *((_QWORD *)v32 + 183);
if( v25 )
TrustLevelSid = *(VOID **)(v25 + 1104);
v27 = v25 != 0;
}
v23 = *((_QWORD *)v32 + 68);
v24 = (struct DMA_ADAPTER *)PsReferencePrimaryToken((PEPROCESS)v23);
ImpersonationTokenDacl = SepCreateImpersonationTokenDacl((_TOKEN *)v16, v24, (_ACL **)&P);
ObFastDereferenceObject((INT64 *)(v23 + 1208), v24);
v21 = P;
if( ImpersonationTokenDacl < 0 )
goto LABEL_22;
if( P )
{
LOBYTE(v41[0]) = 1;
if( v41[1] >= 0 )
{
v42 = P;
v41[1] = v41[1] & 0xFFF3 | 4;
}
}
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = HandleAttributesa;
ObjectAttributes.ObjectName = 0i64;
ObjectAttributes.SecurityDescriptor = P ? v41 : 0i64;
ObjectAttributes.SecurityQualityOfService = 0i64;
ImpersonationTokenDacl = SepDuplicateToken(
(_TOKEN *)v16,
&ObjectAttributes,
v29,
TokenImpersonation,
v18,
0,
0,
(_TOKEN **)&DuplicateToken);
if( ImpersonationTokenDacl < 0 )
goto LABEL_22;
if( v27 )
ImpersonationTokenDacl = SepSetTokenTrust((_TOKEN *)DuplicateToken, TrustLevelSid);
if( ImpersonationTokenDacl < 0 )
goto LABEL_22;
ObfReferenceObject(DuplicateToken);
LODWORD(Object) = 0;
inserted = ObInsertObjectEx(DuplicateToken, 0i64, DesiredAccessa, 0i64, (UINT64)Object, 0i64, &Handle);
}
else
{
inserted = ObOpenObjectByPointer(v16, v7, 0i64, DesiredAccessa, (POBJECT_TYPE)SeTokenObjectType, v31, &Handle);
v21 = P;
}
ImpersonationTokenDacl = inserted;
LABEL_22:
if( v21 )
ExFreePoolWithTag(v21, 0);
if( v30 )
{
PsRestoreImpersonation(KeGetCurrentThread(), &ImpersonationState);
v19 = v28;
}
if( ImpersonationTokenDacl >= 0 && v19 )
PsSwapImpersonationToken((__int64)v32, v16, (struct _DMA_ADAPTER *)DuplicateToken);
HalPutDmaAdapter(v16);
if( DuplicateToken )
HalPutDmaAdapter((PADAPTER_OBJECT)DuplicateToken);
HalPutDmaAdapter((PADAPTER_OBJECT)v32);
if( ImpersonationTokenDacl >= 0 )
*v8 = Handle;
return ImpersonationTokenDacl;
}
return result;
}Referenced by:
NtOpenThreadToken