ObpGetSilosRootDirectory

INT64 __fastcall ObpGetSilosRootDirectory(VOID **RootHandle){
  INT64 result; 
  int v3; 
  UINT32 v4; 
  struct _ACL *PoolWithTag; 
  ACL *v6; 
  int Acl; 
  __int128 SecurityDescriptor[2]; 
  __int64 v9; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  v9 = 0i64;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  memset(SecurityDescriptor, 0, sizeof(SecurityDescriptor));
  LODWORD(result) = RtlCreateSecurityDescriptor(SecurityDescriptor, 1ui64);
  if( (int)result >= 0 )
  {
    v3 = RtlLengthSid(SeWorldSid);
    v4 = RtlLengthSid(SeLocalSystemSid) + 32 + v3;
    PoolWithTag = (struct _ACL *)ExAllocatePoolWithTag(PagedPool, v4, 0x6C636144ui64);
    v6 = PoolWithTag;
    if( PoolWithTag )
    {
      Acl = RtlCreateAcl(PoolWithTag, v4, 2u);
      if( Acl >= 0 )
      {
        Acl = RtlpAddKnownAce(v6, 2ui64, 0i64, 0x20003ui64, SeWorldSid, 0);
        if( Acl >= 0 )
        {
          Acl = RtlpAddKnownAce(v6, 2ui64, 0i64, 0xF000Fui64, SeLocalSystemSid, 0);
          if( Acl >= 0 )
          {
            Acl = RtlSetDaclSecurityDescriptor(SecurityDescriptor, 1u, v6, 0);
            if( Acl >= 0 )
            {
              ObjectAttributes.Length = 48;
              ObjectAttributes.ObjectName = (_UNICODE_STRING *)&ObpSilosDirectoryName;
              ObjectAttributes.RootDirectory = 0i64;
              ObjectAttributes.SecurityDescriptor = SecurityDescriptor;
              ObjectAttributes.Attributes = 208;
              ObjectAttributes.SecurityQualityOfService = 0i64;
              Acl = ZwCreateDirectoryObject(RootHandle, 0xF000Fui64, &ObjectAttributes);
              if( Acl == 0x40000000 )
                Acl = 0;
            }
          }
        }
      }
      ExFreePoolWithTag(v6, 0x6C636144u);
      return(unsigned int)Acl;
    }
    else
    {
      return 3221225626i64;
    }
  }
  return result;
}

Referenced by:

ObCreateSiloRootDirectory