SeFastTraverseCheck
NTSTATUS __fastcall SeFastTraverseCheck(
VOID *SecurityDescriptor,
_ACCESS_STATE *AccessState,
UINT64 TraverseAccess,
INT8 AccessMode){
unsigned __int64 v4;
int v5;
char *v6;
unsigned int v7;
char *v8;
unsigned int v9;
void *retaddr;
v4 = (unsigned __int64)&retaddr;
v5 = TraverseAccess;
if( !SecurityDescriptor )
{
LABEL_19:
LOBYTE(v4) = 0;
return v4;
}
LODWORD(v4) = *((unsigned __int16 *)SecurityDescriptor + 1);
if( (v4 & 4) != 0 )
{
if( (v4 & 0x8000u) == 0i64 )
{
v6 = (char *)*((_QWORD *)SecurityDescriptor + 4);
}
else
{
v4 = *((unsigned int *)SecurityDescriptor + 4);
if( !(_DWORD)v4 )
goto LABEL_15;
v6 = (char *)SecurityDescriptor + v4;
}
if( v6 )
{
v7 = *((unsigned __int16 *)v6 + 2);
if( *((_WORD *)v6 + 2) )
{
if( (*((_DWORD *)AccessState + 3) & 0x810) == 0 )
{
v8 = v6 + 8;
v9 = 0;
if( v7 )
{
while( 1 )
{
if( (v8[1] & 8) == 0 )
{
if( *v8 )
{
if( *v8 == 1 && (v5 & *((_DWORD *)v8 + 1)) != 0 )
goto LABEL_19;
}
else if( (v5 & *((_DWORD *)v8 + 1)) != 0 && RtlEqualSid(SeWorldSid, v8 + 8) )
{
goto LABEL_15;
}
}
v4 = *((unsigned __int16 *)v8 + 1);
++v9;
v8 += v4;
if( v9 >= v7 )
goto LABEL_19;
}
}
}
}
goto LABEL_19;
}
}
LABEL_15:
LOBYTE(v4) = 1;
return v4;
}Referenced by:
IopParseDevice
ObpCheckTraverseAccess