NtOpenProcessTokenEx
INT64 __fastcall NtOpenProcessTokenEx(
VOID *ProcessHandle,
UINT64 DesiredAccess,
UINT64 HandleAttributes,
VOID **TokenHandle){
ACCESS_MASK v5;
KPROCESSOR_MODE AccessMode;
int v7;
ULONG v8;
__int64 v9;
INT64 result;
PVOID v11;
_EX_FAST_REF *v12;
struct _DMA_ADAPTER *v13;
NTSTATUS v14;
INT64 *v15;
PVOID Object;
void *Handle;
_ETHREAD *CurrentThread;
v5 = DesiredAccess;
Handle = 0i64;
AccessMode = *((_BYTE *)KeGetCurrentThread() + 562);
v7 = 73714;
if( AccessMode )
v7 = 7666;
v8 = HandleAttributes & v7;
if( AccessMode )
{
v9 = (__int64)TokenHandle;
if( (unsigned __int64)TokenHandle >= 0x7FFFFFFF0000i64 )
v9 = 0x7FFFFFFF0000i64;
*(_QWORD *)v9 = *(_QWORD *)v9;
}
Object = 0i64;
result = ObpReferenceObjectByHandleWithTag(
(ULONG_PTR)ProcessHandle,
4096,
(__int64)PsProcessType,
*((_BYTE *)KeGetCurrentThread() + 562),
0x65537350u,
(__int64)&Object,
0i64,
0i64);
if( (int)result >= 0 )
{
v11 = Object;
v12 = (_EX_FAST_REF *)((char *)Object + 1208);
v13 = (struct _DMA_ADAPTER *)ObFastReferenceObject((INT64 *)Object + 151);
if( !v13 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v15 = (INT64 *)((char *)Object + 1080);
ExAcquirePushLockSharedEx((UINT64)Object + 1080, 0i64);
v13 = (struct _DMA_ADAPTER *)ObFastReferenceObjectLocked(v12);
if( _InterlockedCompareExchange64(v15, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v15);
KeAbPostRelease(v15);
KeLeaveCriticalRegionThread((__int64)CurrentThread);
v11 = Object;
}
ObfDereferenceObjectWithTag(v11, 0x65537350ui64);
v14 = ObOpenObjectByPointer(v13, v8, 0i64, v5, (POBJECT_TYPE)SeTokenObjectType, AccessMode, &Handle);
HalPutDmaAdapter(v13);
if( v14 >= 0 )
*TokenHandle = Handle;
return(unsigned int)v14;
}
return result;
}Referenced by:
NtOpenProcessToken
RtlpSysVolTakeOwnership