RtlConvertSidToUnicodeString

NTSTATUS __stdcall RtlConvertSidToUnicodeString(
        UNICODE_STRING *UnicodeString,
        PVOID Sid,
        UINT8 AllocateDestinationString){
  NTSTATUS v6; 
  WCHAR *v7; 
  NTSTATUS result; 
  UNICODE_STRING *v9; 
  unsigned __int8 v10; 
  unsigned int v11; 
  int v12; 
  UINT64 v13; 
  _LARGE_INTEGER Value; 
  UNICODE_STRING SourceString; 
  wchar_t Dst; 
  WCHAR String[2]; 
  WCHAR v18[248]; 
  __int16 v19; 
  __int16 v20; 
  SourceString = 0i64;
  if( RtlValidSid(Sid) != 1 || *(_BYTE *)Sid != 1 )
    return -1073741704;
  wcscpy_s(&Dst, 0x100ui64, (PWCHAR)L"S-1-");
  v6 = 0;
  v7 = String;
  if( *((_BYTE *)Sid + 2) || *((_BYTE *)Sid + 3) )
  {
    wcscat_s(&Dst, 0x100ui64, L"0x");
    v7 = v18;
    v12 = *((unsigned __int8 *)Sid + 5);
    Value.HighPart = *((unsigned __int8 *)Sid + 3) + (*((unsigned __int8 *)Sid + 2) << 8);
    Value.LowPart = *((unsigned __int8 *)Sid + 7)
                  + (*((unsigned __int8 *)Sid + 6) << 8)
                  + (v12 << 16)
                  + (*((unsigned __int8 *)Sid + 4) << 24);
    result = RtlLargeIntegerToUnicode(&Value, v13, 250i64, v18);
  }
  else
  {
    result = RtlIntegerToUnicode(
               *((unsigned __int8 *)Sid + 7)
             + (*((unsigned __int8 *)Sid + 6) << 8)
             + (*((unsigned __int8 *)Sid + 5) << 16)
             + (*((unsigned __int8 *)Sid + 4) << 24),
               0xAui64,
               252i64,
               String);
  }
  if( result >= 0 )
  {
    v10 = 0;
    if( *((_BYTE *)Sid + 1) )
    {
      while( 1 )
      {
        while( v7 < (WCHAR *)&v19 && *v7 )
          ++v7;
        *v7++ = 45;
        result = RtlIntegerToUnicode(*((unsigned int *)Sid + v10 + 2), 0xAui64, 256 - (unsigned int)(v7 - &Dst), v7);
        if( result < 0 )
          break;
        if( ++v10 >= *((_BYTE *)Sid + 1) )
          goto LABEL_14;
      }
    }
    else
    {
LABEL_14:
      if( AllocateDestinationString )
        return RtlCreateUnicodeString(UnicodeString, &Dst) == 0 ? 0xC0000017 : 0;
      while( v7 < (WCHAR *)&v20 && *v7 )
        ++v7;
      v11 = 2 * (v7 - &Dst);
      if( v11 >= UnicodeString->MaximumLength )
        return -2147483643;
      SourceString.Length = v11;
      SourceString.Buffer = &Dst;
      SourceString.MaximumLength = v11 + 2;
      RtlCopyUnicodeString(UnicodeString, &SourceString, v9);
      return v6;
    }
  }
  return result;
}

Referenced by:

AdtpBuildSidListString
CmpGetVirtualizationID
ExpWnfGetPermanentPerUserDataStoreHandle
LocalConvertSidToStringSidW
OpenGlobalizationUserSettingsKey_ForMua
PiDqOpenUserObjectRegKey
PspReadUserQuotaLimits
RtlFormatCurrentUserKeyPath
RtlpGetTokenNamedObjectPath
SepValidateReferencedCachedHandles
SysCtxRegOpenCurrentUserKey