RtlSelfRelativeToAbsoluteSD2

NTSTATUS __stdcall RtlSelfRelativeToAbsoluteSD2(VOID *pSelfRelativeSecurityDescriptor, UINT64 *pBufferSize){
  unsigned __int16 *v2; 
  __int16 v6; 
  char *v7; 
  char *v8; 
  char *v9; 
  _ACL *v10; 
  _ACL *v11; 
  unsigned int v12; 
  char *v13; 
  char *v14; 
  unsigned __int16 *p_AceCount; 
  UINT64 SaclSize; 
  VOID *Owner; 
  VOID *PrimaryGroup; 
  _ACL *Dacl; 
  _ACL *Sacl; 
  UINT64 OwnerSize; 
  UINT64 PrimaryGroupSize; 
  UINT64 DaclSize; 

  v2 = 0i64;
  Owner = 0i64;
  PrimaryGroup = 0i64;
  Dacl = 0i64;
  Sacl = 0i64;
  LODWORD(DaclSize) = 0;
  LODWORD(SaclSize) = 0;
  LODWORD(OwnerSize) = 0;
  LODWORD(PrimaryGroupSize) = 0;
  if( !pSelfRelativeSecurityDescriptor )
    return -1073741585;
  if( !pBufferSize )
    return -1073741584;
  HIDWORD(SaclSize) = *(_DWORD *)pBufferSize;
  if( HIDWORD(SaclSize) < 0x14 )
    return -1073741811;
  v6 = *((_WORD *)pSelfRelativeSecurityDescriptor + 1);
  if( v6 >= 0 )
    return -1073741593;
  RtlpQuerySecurityDescriptor(
    (_SECURITY_DESCRIPTOR *)pSelfRelativeSecurityDescriptor,
    &Owner,
    &OwnerSize,
    &PrimaryGroup,
    &PrimaryGroupSize,
    &Dacl,
    &DaclSize,
    &Sacl,
    &SaclSize);
  v7 = (char *)Owner;
  v8 = (char *)PrimaryGroup;
  if( Owner <= PrimaryGroup )
    v9 = (char *)PrimaryGroup + (unsigned int)PrimaryGroupSize;
  else
    v9 = (char *)Owner + (unsigned int)OwnerSize;
  v10 = Dacl;
  if( v9 <= (char *)Dacl )
    v9 = (char *)Dacl + (unsigned int)DaclSize;
  v11 = Sacl;
  if( v9 <= (char *)Sacl )
    v9 = (char *)Sacl + (unsigned int)SaclSize;
  v12 = 40;
  if( v9 )
    v12 = (((_DWORD)v9 - (_DWORD)pSelfRelativeSecurityDescriptor - 13) & 0xFFFFFFF8) + 40;
  if( v12 <= HIDWORD(SaclSize) )
  {
    if( v9 )
    {
      memmove((char *)pSelfRelativeSecurityDescriptor + 40, (char *)pSelfRelativeSecurityDescriptor + 20, v12 - 40);
      v7 = (char *)Owner;
      v6 = *((_WORD *)pSelfRelativeSecurityDescriptor + 1);
    }
    v13 = v7 + 20;
    *((_WORD *)pSelfRelativeSecurityDescriptor + 1) = v6 & 0x7FFF;
    if( !v7 )
      v13 = 0i64;
    *((_QWORD *)pSelfRelativeSecurityDescriptor + 1) = v13;
    v14 = v8 + 20;
    if( !v8 )
      v14 = 0i64;
    *((_QWORD *)pSelfRelativeSecurityDescriptor + 2) = v14;
    p_AceCount = &v11[2].AceCount;
    if( !v11 )
      p_AceCount = 0i64;
    *((_QWORD *)pSelfRelativeSecurityDescriptor + 3) = p_AceCount;
    if( v10 )
      v2 = &v10[2].AceCount;
    *((_QWORD *)pSelfRelativeSecurityDescriptor + 4) = v2;
    return 0;
  }
  else
  {
    *(_DWORD *)pBufferSize = v12;
    return -1073741789;
  }
}

Referenced by:

RtlpSysVolCheckOwnerAndSecurity