RtlMakeSelfRelativeSD

NTSTATUS __stdcall RtlMakeSelfRelativeSD(
        VOID *SecurityDescriptor,
        VOID *SelfRelativeSecurityDescriptor,
        UINT64 *BufferLength){
  size_t v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  size_t v10; 
  int v11; 
  char *v12; 
  int v13; 
  int v14; 
  int v15; 
  _ACL *Sacl; 
  _ACL *Dacl; 
  VOID *Owner; 
  VOID *PrimaryGroup; 
  UINT64 PrimaryGroupSize; 
  UINT64 OwnerSize; 
  UINT64 SaclSize; 
  UINT64 DaclSize; 

  LODWORD(DaclSize) = 0;
  LODWORD(SaclSize) = 0;
  LODWORD(OwnerSize) = 0;
  LODWORD(PrimaryGroupSize) = 0;
  Owner = 0i64;
  PrimaryGroup = 0i64;
  Dacl = 0i64;
  Sacl = 0i64;
  RtlpQuerySecurityDescriptor(
    (_SECURITY_DESCRIPTOR *)SecurityDescriptor,
    &Owner,
    &OwnerSize,
    &PrimaryGroup,
    &PrimaryGroupSize,
    &Dacl,
    &DaclSize,
    &Sacl,
    &SaclSize);
  v6 = PrimaryGroupSize;
  v7 = (unsigned int)OwnerSize;
  v8 = (unsigned int)DaclSize;
  v9 = (unsigned int)SaclSize;
  v10 = SaclSize + PrimaryGroupSize + OwnerSize + DaclSize + 20;
  if( v10 > *(_DWORD *)BufferLength )
  {
    *(_DWORD *)BufferLength = v10;
    return -1073741789;
  }
  else if( SelfRelativeSecurityDescriptor )
  {
    memset(SelfRelativeSecurityDescriptor, 0i64, v10);
    v11 = *(_DWORD *)SecurityDescriptor;
    v12 = (char *)SelfRelativeSecurityDescriptor + 20;
    *(_DWORD *)SelfRelativeSecurityDescriptor = v11;
    if( (_DWORD)v9 )
    {
      memmove((char *)SelfRelativeSecurityDescriptor + 20, Sacl, v9);
      v12 += v9;
      v13 = 20;
    }
    else
    {
      v13 = 0;
    }
    *((_DWORD *)SelfRelativeSecurityDescriptor + 3) = v13;
    if( (_DWORD)v8 )
    {
      memmove(v12, Dacl, v8);
      v14 = (int)v12;
      v12 += v8;
      v15 = v14 - (_DWORD)SelfRelativeSecurityDescriptor;
    }
    else
    {
      v15 = 0;
    }
    *((_DWORD *)SelfRelativeSecurityDescriptor + 4) = v15;
    if( (_DWORD)v7 )
    {
      memmove(v12, Owner, v7);
      *((_DWORD *)SelfRelativeSecurityDescriptor + 1) = (_DWORD)v12 - (_DWORD)SelfRelativeSecurityDescriptor;
      v12 += v7;
    }
    if( v6 )
    {
      memmove(v12, PrimaryGroup, v6);
      *((_DWORD *)SelfRelativeSecurityDescriptor + 2) = (_DWORD)v12 - (_DWORD)SelfRelativeSecurityDescriptor;
    }
    *((_WORD *)SelfRelativeSecurityDescriptor + 1) |= 0x8000u;
    return 0;
  }
  else
  {
    return -1073741811;
  }
}

Referenced by:

RtlAbsoluteToSelfRelativeSD
RtlpSysVolCheckOwnerAndSecurity