ObCheckObjectAccess

UINT8 __stdcall ObCheckObjectAccess(
        VOID *Object,
        _ACCESS_STATE *AccessState,
        UINT8 TypeMutexLocked,
        CHAR AccessMode,
        INT64 *AccessStatus){
  UINT8 v5; 
  unsigned __int64 v7; 
  _UNICODE_STRING *v10; 
  NTSTATUS ObjectSecurity; 
  UINT8 v12; 
  unsigned int v13; 
  UINT8 result; 
  _KPROCESSOR_MODE AccessModea; 
  unsigned int GrantedAccess; 
  PVOID SecurityDescriptor; 
  PPRIVILEGE_SET Privileges; 
  _UNICODE_STRING *v19; 
  UINT8 MemoryAllocated; 

  v5 = 0;
  v7 = (unsigned __int8)*((char *)Object - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Object - 48) >> 8);
  GrantedAccess = 0;
  MemoryAllocated = 0;
  Privileges = 0i64;
  SecurityDescriptor = 0i64;
  v10 = (_UNICODE_STRING *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ v7];
  v19 = v10;
  ObjectSecurity = ObpGetObjectSecurity(Object, &SecurityDescriptor, &MemoryAllocated, AccessMode);
  if( ObjectSecurity < 0 )
    goto LABEL_9;
  if( !SecurityDescriptor )
  {
    *((_DWORD *)AccessState + 5) |= *((_DWORD *)AccessState + 4);
    *((_DWORD *)AccessState + 4) = 0;
    v5 = 1;
LABEL_9:
    result = v5;
    *(_DWORD *)AccessStatus = ObjectSecurity;
    return result;
  }
  SeLockSubjectContext((PSECURITY_SUBJECT_CONTEXT)AccessState + 1);
  LOBYTE(AccessModea) = AccessMode;
  v12 = (unsigned __int8)SeAccessCheck(
                           SecurityDescriptor,
                           (PSECURITY_SUBJECT_CONTEXT)AccessState + 1,
                           1u,
                           *((_DWORD *)AccessState + 4),
                           *((_DWORD *)AccessState + 5),
                           &Privileges,
                           (PGENERIC_MAPPING)((char *)&v10[4].Buffer + 4),
                           AccessModea,
                           &GrantedAccess,
                           (PNTSTATUS)AccessStatus);
  if( Privileges )
  {
    SeAppendPrivileges(AccessState, Privileges);
    CmSiFreeMemory(Privileges);
  }
  if( v12 )
  {
    v13 = GrantedAccess;
    *((_DWORD *)AccessState + 5) |= GrantedAccess;
    *((_DWORD *)AccessState + 4) &= ~(v13 | 0x2000000);
  }
  SeOpenObjectAuditAlarm(
    v19 + 1,
    Object,
    0i64,
    SecurityDescriptor,
    AccessState,
    0,
    v12,
    AccessMode,
    (UINT8 *)AccessState + 10);
  SeUnlockSubjectContext((PSECURITY_SUBJECT_CONTEXT)AccessState + 1);
  ObReleaseObjectSecurity(SecurityDescriptor, MemoryAllocated);
  return v12;
}

Referenced by:

ObpGrantAccess