ObpAdjustCreatorAccessState

NTSTATUS __stdcall ObpAdjustCreatorAccessState(
        PACCESS_STATE AccessState,
        _KPROCESSOR_MODE AccessMode,
        _OBJECT_TYPE *ObjectType,
        VOID *Object){
  unsigned int *v4; 
  unsigned int v5; 
  INT8 v8; 
  VOID *v10; 
  PRIVILEGE_SET RequiredPrivileges; 

  v4 = (unsigned int *)((char *)AccessState + 16);
  v5 = *((_DWORD *)AccessState + 4);
  v8 = AccessMode;
  memset(&RequiredPrivileges, 0, sizeof(RequiredPrivileges));
  if( (v5 & 0x2000000) != 0 )
  {
    v5 = v5 & 0xEDFFFFFF | 0x10000000;
    *v4 = v5;
  }
  if( (v5 & 0xF0000000) != 0 )
  {
    RtlMapGenericMask((UINT64 *)AccessState + 2, &ObjectType->TypeInfo.GenericMapping);
    v5 = *((_DWORD *)AccessState + 4);
  }
  if( (v5 & 0x1000000) != 0 )
  {
    RequiredPrivileges.Privilege[0].Attributes = 0;
    RequiredPrivileges.Privilege[0].Luid = SeSecurityPrivilege;
    RequiredPrivileges.PrivilegeCount = 1;
    RequiredPrivileges.Control = 1;
    if( !SePrivilegeCheck((UINT64 *)&RequiredPrivileges.PrivilegeCount, (INT64)AccessState + 32, v8) )
    {
      SePrivilegedServiceAuditAlarm(0i64, (_SECURITY_SUBJECT_CONTEXT *)AccessState + 1, &RequiredPrivileges, 0);
      return -1073741727;
    }
    *v4 &= ~0x1000000u;
    *((_DWORD *)AccessState + 5) |= 0x1000000u;
    SeAppendPrivileges(AccessState, &RequiredPrivileges);
    v5 = *((_DWORD *)AccessState + 4);
  }
  *((_DWORD *)AccessState + 5) |= v5;
  *v4 = 0;
  *((_DWORD *)AccessState + 5) &= ObjectType->TypeInfo.ValidAccessMask | 0x1000000;
  v10 = ObpReferenceSecurityDescriptor((_OBJECT_HEADER *)((char *)Object - 48));
  *((_DWORD *)AccessState + 5) &= ~(unsigned int)SeComputeCreatorDeniedRights(
                                                   (_SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
                                                   AccessState,
                                                   *((unsigned int *)AccessState + 5),
                                                   v10);
  if( v10 )
    ObDereferenceSecurityDescriptor(v10, 1ui64);
  return 0;
}

Referenced by:

ObInsertObjectEx
ObpGrantAccess