NtPrivilegeCheck
NTSTATUS __stdcall NtPrivilegeCheck(_HANDLE ClientToken, PPRIVILEGE_SET RequiredPrivileges, PBOOLEAN Result){
char PreviousMode;
NTSTATUS result;
_ADAPTER_OBJECT *v7;
__int64 v8;
__int64 v9;
_LUID_AND_ATTRIBUTES **v10;
unsigned int Control;
int v12;
_LUID_AND_ATTRIBUTES *v13;
unsigned __int8 v14;
UINT64 *Object;
unsigned int ArrayCount;
NTSTATUS ArrayCount_4;
PVOID v18;
_LUID_AND_ATTRIBUTES *RequiredPrivilegesa;
RequiredPrivilegesa = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
v18 = 0i64;
result = ObReferenceObjectByHandle(
*(VOID **)&ClientToken,
8ui64,
(_OBJECT_TYPE *)SeTokenObjectType,
PreviousMode,
&v18,
0i64);
ArrayCount_4 = result;
if( result >= 0 )
{
v7 = (_ADAPTER_OBJECT *)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((UINT64)RequiredPrivileges, 12 * (RequiredPrivileges->PrivilegeCount - 1) + 20, 4i64);
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, Object);
if( v12 >= 0 )
{
v13 = RequiredPrivilegesa;
v14 = SepPrivilegeCheck((_TOKEN *)v18, RequiredPrivilegesa, ArrayCount, Control, PreviousMode);
HalPutDmaAdapter((PADAPTER_OBJECT)v18);
memmove(RequiredPrivileges->Privilege, v13, 0);
*Result = v14;
SeReleaseLuidAndAttributesArray(v13, PreviousMode);
return 0;
}
}
v7 = (_ADAPTER_OBJECT *)v18;
}
HalPutDmaAdapter(v7);
return v12;
}
return result;
}Referenced by:
No references.