PiAuCreateStandardSecurityObject

NTSTATUS __stdcall PiAuCreateStandardSecurityObject(_PI_AU_USER_SIDS *UserSids){
  _ACL *v2; 
  VOID **v3; 
  unsigned int v4; 
  _QWORD *v5; 
  __int64 *v6; 
  int Acl; 
  __int64 v8; 
  __int64 v9; 
  _BYTE *v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned int v13; 
  __int64 *v14; 
  __int64 v15; 
  VOID **PoolWithTag; 
  UINT64 v17; 
  unsigned int v18; 
  VOID **v19; 
  unsigned int v20; 
  size_t v21; 
  VOID **v22; 
  PVOID *v23; 
  unsigned int BufferLength[2]; 
  _BYTE SecurityDescriptor[40]; 
  __int64 v27; 
  _QWORD v28[22]; 

  LOWORD(BufferLength[1]) = 1280;
  BufferLength[0] = 0;
  v27 = 0i64;
  v2 = 0i64;
  v3 = 0i64;
  memset(v28, 0i64, 0xA8u);
  v4 = 0;
  memset(SecurityDescriptor, 0, sizeof(SecurityDescriptor));
  v5 = v28;
  v6 = PiAuSwDeviceCreateSidSubAuthorities;
  do
  {
    Acl = PiAuAllocateAndInitializeSid(
            (VOID **)&v28[v4],
            (_SID_IDENTIFIER_AUTHORITY *)BufferLength,
            *(unsigned int *)v6);
    if( Acl < 0 )
      goto LABEL_42;
    v8 = *(_QWORD *)SecurityDescriptor;
    v9 = 0i64;
    if( *(_DWORD *)v6 )
    {
      v10 = (_BYTE *)*v5;
      do
      {
        *(_DWORD *)&v10[4 * v9 + 8] = *((_DWORD *)PiAuSwDeviceCreateSidSubAuthorities + v8 + v9 + 1);
        v9 = (unsigned int)(v9 + 1);
      }
      while( (unsigned int)v9 < *(_DWORD *)v6 );
    }
    if( !RtlValidSid((_BYTE *)*v5) )
    {
      Acl = -1073741595;
LABEL_42:
      v11 = 21i64;
      goto LABEL_30;
    }
    ++v4;
    v6 = (__int64 *)((char *)v6 + 28);
    *(_QWORD *)SecurityDescriptor = v8 + 7;
    ++v5;
  }
  while( v4 < 0x15 );
  v11 = 21i64;
  v12 = 21i64;
  v13 = 4
      * (*(unsigned __int8 *)(*((_QWORD *)UserSids + 6) + 1i64)
       + *(unsigned __int8 *)(*(_QWORD *)UserSids + 1i64)
       + *(unsigned __int8 *)(*((_QWORD *)UserSids + 4) + 1i64)
       + *(unsigned __int8 *)(*((_QWORD *)UserSids + 5) + 1i64)
       + *(unsigned __int8 *)(*((_QWORD *)UserSids + 3) + 1i64)
       + *(unsigned __int8 *)(*((_QWORD *)UserSids + 2) + 1i64))
      + 104;
  v14 = v28;
  do
  {
    v15 = *v14++;
    v13 += 4 * *(unsigned __int8 *)(v15 + 1) + 16;
    --v12;
  }
  while( v12 );
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v13, 538996816i64);
  v2 = (_ACL *)PoolWithTag;
  if( PoolWithTag )
  {
    Acl = RtlCreateAcl((PACL)PoolWithTag, (_ACL)v13, 2ui64, v17);
    if( Acl >= 0 )
    {
      Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 131559, *((VOID **)UserSids + 2));
      if( Acl >= 0 )
      {
        Acl = RtlAddAccessDeniedAceEx(v2, 2ui64, 0i64, 0xF01FFui64, *((VOID **)UserSids + 3));
        if( Acl >= 0 )
        {
          Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 983551, *(VOID **)UserSids);
          if( Acl >= 0 )
          {
            Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 131365, *((VOID **)UserSids + 4));
            if( Acl >= 0 )
            {
              Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 64, *((VOID **)UserSids + 5));
              if( Acl >= 0 )
              {
                Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 64, *((VOID **)UserSids + 6));
                if( Acl >= 0 )
                {
                  v18 = 0;
                  v19 = (VOID **)v28;
                  while( 1 )
                  {
                    Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 128, *v19);
                    if( Acl < 0 )
                      break;
                    ++v18;
                    ++v19;
                    if( v18 >= 0x15 )
                    {
                      Acl = RtlCreateSecurityDescriptor(&SecurityDescriptor[8], 1ui64);
                      if( Acl >= 0 )
                      {
                        Acl = RtlSetDaclSecurityDescriptor(&SecurityDescriptor[8], 1u, v2, 0);
                        if( Acl >= 0 )
                        {
                          Acl = RtlSetOwnerSecurityDescriptor(&SecurityDescriptor[8], *(VOID **)UserSids, 0);
                          if( Acl >= 0 )
                          {
                            Acl = RtlSetGroupSecurityDescriptor(&SecurityDescriptor[8], *(VOID **)UserSids, 0);
                            if( Acl >= 0 )
                            {
                              if( RtlValidSecurityDescriptor(&SecurityDescriptor[8])
                                && (v20 = RtlLengthSecurityDescriptor((INT64)&SecurityDescriptor[8]),
                                    BufferLength[0] = v20,
                                    v20 >= 0x28) )
                              {
                                v21 = v20;
                                v22 = ExAllocatePoolWithTag(1ui64, v20, 538996816i64);
                                v3 = v22;
                                if( !v22 )
                                  goto LABEL_39;
                                memset(v22, 0i64, v21);
                                Acl = RtlAbsoluteToSelfRelativeSD(&SecurityDescriptor[8], v3, (UINT64 *)BufferLength);
                                if( Acl >= 0 )
                                {
                                  qword_140C50A68 = v3;
                                  v3 = 0i64;
                                }
                              }
                              else
                              {
                                Acl = -1073741595;
                              }
                            }
                          }
                        }
                      }
                      break;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else
  {
LABEL_39:
    Acl = -1073741670;
  }
LABEL_30:
  v23 = (PVOID *)v28;
  do
  {
    if( *v23 )
      ExFreePoolWithTag(*v23, 0);
    ++v23;
    --v11;
  }
  while( v11 );
  if( v2 )
    ExFreePoolWithTag(v2, 0);
  if( v3 )
    ExFreePoolWithTag(v3, 0);
  return Acl;
}

Referenced by:

PiAuCreateSecurityObjects