RtlpIdnToUnicodeWorker

INT64 __fastcall RtlpIdnToUnicodeWorker(
        INT64 a1,
        const WCHAR *a2,
        INT64 a3,
        INT64 a4,
        INT64 *a5,
        WCHAR *pOutput,
        UINT8 Normalized){
  UINT8 *v7; 
  const WCHAR *v8; 
  char v9; 
  INT64 *v10; 
  WCHAR *v11; 
  INT64 v12; 
  WCHAR v13; 
  INT64 result; 
  int v15; 
  int v16; 
  WCHAR *v17; 
  __int64 v18; 
  int v19; 
  UINT8 *v20; 
  __int64 i; 
  WCHAR v22; 
  __int64 j; 
  WCHAR *pOutputEmailAt; 
  size_t pcchLength; 
  INT64 v26; 
  v26 = a4;
  v7 = (UINT8 *)a4;
  pOutputEmailAt = 0i64;
  v8 = a2;
  Normalized = 0;
  v9 = a1;
  if( !a2 )
    return 3221225485i64;
  v10 = a5;
  if( !a5 || *(int *)a5 < 0 || (int)a3 < -1 || *(int *)a5 > 0 && !a4 )
    return 3221225485i64;
  if( (a1 & 0xFFFFFFF0) != 0 )
    return 3221225485i64;
  if( (_DWORD)a3 == -1 )
  {
    pcchLength = 0i64;
    if( RtlStringCchLengthW(a2, 0x203ui64, &pcchLength) < 0 )
      return 3221227286i64;
    LODWORD(a3) = pcchLength + 1;
  }
  v11 = pOutput;
  v12 = (unsigned int)(a3 - 1);
  LODWORD(pcchLength) = 511;
  v13 = v8[(int)a3 - 1];
  if( v13 )
    v12 = (unsigned int)a3;
  result = punycode_decode(
             v8,
             v12,
             pOutput,
             (INT64 *)&pcchLength,
             (v9 & 4) != 0,
             (v9 & 2) != 0,
             &Normalized,
             (const WCHAR **)&pOutputEmailAt);
  if( (int)result < 0 )
    return result;
  if( !v13 )
  {
    v15 = pcchLength;
    if( (int)pcchLength < 511 )
    {
      v11[(int)pcchLength] = 0;
      v16 = v15 + 1;
      goto LABEL_18;
    }
    return 3221227286i64;
  }
  v16 = pcchLength;
LABEL_18:
  if( (v9 & 8) != 0 || Normalized )
    goto LABEL_40;
  Normalized = 0;
  v17 = pOutputEmailAt;
  if( (v9 & 4) != 0 && ((int)RtlIsNormalizedString(1ui64, v11, pOutputEmailAt - v11, &Normalized) < 0 || !Normalized) )
    return 3221227286i64;
  v18 = v17 - v11;
  if( v18 >= v16 - (v13 == 0) )
    goto LABEL_40;
  v19 = v16 - (2 - (v13 != 0)) - v18;
  v20 = IdnaMemAlloc(v19);
  if( !v20 )
    return 3221225495i64;
  if( v19 > 0 )
  {
    for( i = 0i64; i < v19; ++i )
    {
      v22 = v17[i + 1];
      if( (unsigned __int16)(v22 - 65) <= 0x19u )
      {
        v17[i + 1] = v22 + 32;
        v20[i] = 1;
      }
    }
  }
  if( (int)RtlIsNormalizedString(((unsigned __int8)((v9 & 1) == 0) << 8) + 13, v17 + 1, (unsigned int)v19, &Normalized) < 0
    || !Normalized )
  {
    ExFreePoolWithTag(v20, 0);
    return 3221227286i64;
  }
  if( v19 > 0 )
  {
    for( j = 0i64; j < v19; ++j )
    {
      if( v20[j] == 1 )
        v17[j + 1] -= 32;
    }
  }
  ExFreePoolWithTag(v20, 0);
  v11 = pOutput;
  v7 = (UINT8 *)v26;
LABEL_40:
  if( v7 && *(_DWORD *)v10 )
  {
    if( v16 > *(_DWORD *)v10 )
      return 3221225507i64;
    memmove(v7, (UINT8 *)v11, 2i64 * v16);
  }
  *(_DWORD *)v10 = v16;
  return 0i64;
}

Referenced by:

RtlIdnToUnicode