NtOpenProcessTokenEx
NTSTATUS __fastcall NtOpenProcessTokenEx(UINT64 a1, INT64 a2, INT64 a3, UINT64 a4){
_ACCESS_MASK v5;
char PreviousMode;
int v7;
unsigned int v8;
UINT64 v9;
NTSTATUS result;
VOID *v11;
_EX_FAST_REF *v12;
_ADAPTER_OBJECT *v13;
int v14;
_EX_PUSH_LOCK *v15;
UINT64 Tag;
_KPROCESSOR_MODE Object;
PVOID v18;
VOID *Handle;
_KTHREAD *Thread;
v5 = a2;
Handle = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
v7 = 73714;
if( PreviousMode )
v7 = 7666;
v8 = a3 & v7;
if( PreviousMode )
{
v9 = a4;
if( a4 >= 0x7FFFFFFF0000i64 )
v9 = 0x7FFFFFFF0000i64;
*(_QWORD *)v9 = *(_QWORD *)v9;
}
v18 = 0i64;
LODWORD(Tag) = 1699967824;
result = ObpReferenceObjectByHandleWithTag(
(VOID *)a1,
0x1000ui64,
(_OBJECT_TYPE *)PsProcessType,
KeGetCurrentThread()->PreviousMode,
Tag,
&v18,
0i64,
0i64);
if( result >= 0 )
{
v11 = v18;
v12 = (_EX_FAST_REF *)((char *)v18 + 1208);
v13 = (_ADAPTER_OBJECT *)ObFastReferenceObject((_EX_FAST_REF *)v18 + 151);
if( !v13 )
{
Thread = (_ETHREAD *)KeGetCurrentThread();
--Thread->Tcb.KernelApcDisable;
v15 = (_EX_PUSH_LOCK *)((char *)v18 + 1080);
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)v18 + 135, 0i64);
v13 = (_ADAPTER_OBJECT *)ObFastReferenceObjectLocked(v12);
if( _InterlockedCompareExchange64(&v15->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v15);
KeAbPostRelease(v15);
KeLeaveCriticalRegionThread(&Thread->Tcb);
v11 = v18;
}
ObfDereferenceObjectWithTag(v11, 0x65537350ui64);
LOBYTE(Object) = PreviousMode;
v14 = ObOpenObjectByPointer(v13, v8, 0i64, v5, (POBJECT_TYPE)SeTokenObjectType, Object, &Handle);
HalPutDmaAdapter(v13);
if( v14 >= 0 )
*(_QWORD *)a4 = Handle;
return v14;
}
return result;
}Referenced by:
NtOpenProcessToken
RtlpSysVolTakeOwnership