ObCheckCreateObjectAccess

UINT8 __stdcall ObCheckCreateObjectAccess(
        PVOID DirectoryObject,
        UINT64 CreateAccess,
        _ACCESS_STATE *AccessState,
        _UNICODE_STRING *ComponentName,
        UINT8 TypeMutexLocked,
        CHAR PreviousMode,
        INT64 *AccessStatus){
  CHAR AccessMode; 
  unsigned int v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  NTSTATUS ObjectSecurity; 
  UINT8 v13; 
  UINT64 v15; 
  UINT64 GrantedAccess; 
  PSECURITY_DESCRIPTOR SecurityDescriptor; 
  PPRIVILEGE_SET Privileges; 
  BOOLEAN MemoryAllocated; 
  AccessMode = PreviousMode;
  LODWORD(GrantedAccess) = 0;
  Privileges = 0i64;
  SecurityDescriptor = 0i64;
  v9 = CreateAccess;
  v10 = (unsigned __int8)*((char *)DirectoryObject - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)DirectoryObject - 48) >> 8);
  MemoryAllocated = 0;
  v11 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ v10];
  ObjectSecurity = ObpGetObjectSecurity(DirectoryObject, &SecurityDescriptor, &MemoryAllocated, PreviousMode);
  if( ObjectSecurity < 0 )
  {
    *(_DWORD *)AccessStatus = ObjectSecurity;
    return 0;
  }
  else
  {
    SeLockSubjectContext((_SECURITY_SUBJECT_CONTEXT *)AccessState + 1);
    if( SecurityDescriptor )
    {
      LODWORD(v15) = 0;
      v13 = SeAccessCheck(
              SecurityDescriptor,
              (SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
              1u,
              v9,
              v15,
              &Privileges,
              (GENERIC_MAPPING *)(v11 + 76),
              AccessMode,
              &GrantedAccess,
              AccessStatus);
      if( Privileges )
      {
        SeAppendPrivileges(AccessState, Privileges);
        CmSiFreeMemory(Privileges);
      }
    }
    else
    {
      v13 = 1;
    }
    SeUnlockSubjectContext((SECURITY_SUBJECT_CONTEXT *)AccessState + 1);
    ObReleaseObjectSecurity(SecurityDescriptor, MemoryAllocated);
    return v13;
  }
}

Referenced by:

ObpLookupObjectName