ObpCheckTraverseAccess

UINT8 __stdcall ObpCheckTraverseAccess(
        PVOID DirectoryObject,
        ACCESS_STATE *AccessState,
        INT8 PreviousMode,
        INT64 *AccessStatus){
  CHAR AccessMode; 
  __int64 v5; 
  unsigned __int64 v6; 
  __int64 v7; 
  int ObjectSecurity; 
  UINT8 v10; 
  UINT64 v11; 
  PPRIVILEGE_SET Privileges; 
  PSECURITY_DESCRIPTOR SecurityDescriptor; 
  UINT64 GrantedAccess; 
  BOOLEAN MemoryAllocated; 
  KPROCESSOR_MODE v16; 
  PNTSTATUS v17; 
  MemoryAllocated = (unsigned __int8)AccessStatus;
  AccessMode = v16;
  LODWORD(GrantedAccess) = 0;
  Privileges = 0i64;
  SecurityDescriptor = 0i64;
  v5 = PreviousMode;
  v6 = (unsigned __int8)*((char *)DirectoryObject - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)DirectoryObject - 48) >> 8);
  MemoryAllocated = 0;
  v7 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ v6];
  ObjectSecurity = ObpGetObjectSecurity(DirectoryObject, &SecurityDescriptor, &MemoryAllocated, v16);
  if( ObjectSecurity >= 0 )
  {
    if( SeFastTraverseCheck(SecurityDescriptor, (ACCESS_STATE *)v5, 2ui64) )
    {
      v10 = 1;
    }
    else
    {
      SeLockSubjectContext((_SECURITY_SUBJECT_CONTEXT *)(v5 + 32));
      LODWORD(v11) = 0;
      v10 = SeAccessCheck(
              SecurityDescriptor,
              (SECURITY_SUBJECT_CONTEXT *)(v5 + 32),
              1u,
              2ui64,
              v11,
              &Privileges,
              (GENERIC_MAPPING *)(v7 + 76),
              AccessMode,
              &GrantedAccess,
              (INT64 *)v17);
      if( Privileges )
      {
        SeAppendPrivileges((PACCESS_STATE)v5, Privileges);
        CmSiFreeMemory(Privileges);
      }
      SeUnlockSubjectContext((SECURITY_SUBJECT_CONTEXT *)(v5 + 32));
    }
    ObReleaseObjectSecurity(SecurityDescriptor, MemoryAllocated);
    return v10;
  }
  else
  {
    *v17 = ObjectSecurity;
    return 0;
  }
}

Referenced by:

ObpLookupObjectName