NtPrivilegeCheck
NTSTATUS __stdcall NtPrivilegeCheck(PVOID ClientToken, PRIVILEGE_SET *RequiredPrivileges, UINT8 *Result){
KPROCESSOR_MODE v5;
NTSTATUS result;
struct _DMA_ADAPTER *v7;
__int64 v8;
__int64 v9;
LUID_AND_ATTRIBUTES **v10;
unsigned int Control;
int v12;
UINT8 *v13;
CHAR v14;
PVOID *Object;
unsigned int ArrayCount;
NTSTATUS ArrayCount_4;
PVOID v18;
void *Src;
Src = 0i64;
v5 = *((_BYTE *)KeGetCurrentThread() + 562);
v18 = 0i64;
result = ObReferenceObjectByHandle(ClientToken, 8u, (POBJECT_TYPE)SeTokenObjectType, v5, &v18, 0i64);
ArrayCount_4 = result;
if( result >= 0 )
{
v7 = (struct _DMA_ADAPTER *)v18;
if( *((_DWORD *)v18 + 48) == 2 && *((int *)v18 + 49) < 1 )
{
v12 = -1073741659;
}
else
{
if( ((unsigned __int8)RequiredPrivileges & 3) != 0 )
ExRaiseDatatypeMisalignment();
v8 = 0x7FFFFFFF0000i64;
v9 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)RequiredPrivileges < 0x7FFFFFFF0000i64 )
v9 = (__int64)RequiredPrivileges;
*(_BYTE *)v9 = *(_BYTE *)v9;
*(_BYTE *)(v9 + 19) = *(_BYTE *)(v9 + 19);
ArrayCount = RequiredPrivileges->PrivilegeCount;
ProbeForWrite(RequiredPrivileges, 12 * (RequiredPrivileges->PrivilegeCount - 1) + 20, 4ui64);
if( (unsigned __int64)Result < 0x7FFFFFFF0000i64 )
v8 = (__int64)Result;
*(_BYTE *)v8 = *(_BYTE *)v8;
Control = RequiredPrivileges->Control;
v12 = ArrayCount_4;
if( ArrayCount_4 >= 0 )
{
v12 = SeCaptureLuidAndAttributesArray(RequiredPrivileges->Privilege, ArrayCount, 1, v10, (UINT64 *)Object);
if( v12 >= 0 )
{
v13 = (UINT8 *)Src;
v14 = SepPrivilegeCheck((INT64)v18, (INT64)Src, ArrayCount, Control, v5);
HalPutDmaAdapter((PADAPTER_OBJECT)v18);
memmove((UINT8 *)RequiredPrivileges->Privilege, v13, 0i64);
*Result = v14;
SeReleaseLuidAndAttributesArray((LUID_AND_ATTRIBUTES *)v13, v5);
return 0;
}
}
v7 = (struct _DMA_ADAPTER *)v18;
}
HalPutDmaAdapter(v7);
return v12;
}
return result;
}Referenced by:
No references.