punycode_encode

NTSTATUS __stdcall punycode_encode(
        WCHAR *pInput,
        INT64 inputLength,
        WCHAR *pOutput,
        INT64 *poutputBufferLength,
        UINT8 bAllowEmail,
        UINT8 bUseStd3Rules){
  WCHAR *v6; 
  INT64 *v7; 
  WCHAR *v8; 
  WCHAR *v9; 
  WCHAR *v10; 
  WCHAR *v11; 
  __int64 v12; 
  unsigned int v13; 
  WCHAR *v14; 
  UINT8 v15; 
  WCHAR *v16; 
  WCHAR *LabelEnd; 
  WCHAR *v18; 
  WCHAR *v19; 
  __int16 v20; 
  WCHAR *v21; 
  WCHAR *v22; 
  NTSTATUS v23; 
  int v24; 
  WCHAR *i; 
  WCHAR v26; 
  __int64 v27; 
  WCHAR *j; 
  int v29; 
  int v30; 
  int k; 
  int v32; 
  wchar_t *v33; 
  NTSTATUS UTF32; 
  __int64 v35; 
  __int64 v36; 
  wchar_t *v37; 
  unsigned int m; 
  NTSTATUS v39; 
  int v40; 
  int v41; 
  int v42; 
  int n; 
  int v44; 
  int v45; 
  int v46; 
  __int16 v47; 
  __int16 v48; 
  NTSTATUS v49; 
  __int64 v50; 
  WCHAR *v51; 
  NTSTATUS result; 
  UINT64 dwFlags; 
  int v54; 
  WCHAR *v55; 
  wchar_t *Str2; 
  NTSTATUS Str2a; 
  WCHAR *v58; 
  WCHAR *v59; 
  WCHAR *v61; 
  __int64 v62; 
  int v64; 
  WCHAR *ppszDestEnd; 
  INT64 *v66; 

  v66 = poutputBufferLength;
  ppszDestEnd = pOutput;
  v6 = pOutput;
  v7 = poutputBufferLength;
  v61 = pOutput;
  v8 = pInput;
  v9 = pInput;
  v10 = pOutput;
  v11 = &pInput[(int)inputLength];
  v12 = *(int *)poutputBufferLength;
  v13 = 0;
  v59 = v11;
  v14 = &pOutput[v12];
  v55 = v14;
  if( (int)inputLength > 0 )
  {
    v15 = bAllowEmail;
    v16 = pOutput;
    if( pInput >= v11 )
    {
LABEL_82:
      v18 = v16;
      v51 = v16;
      if( v15 )
        goto LABEL_93;
    }
    else
    {
      v58 = pOutput;
      while( 1 )
      {
        LabelEnd = FindLabelEnd(v9, v11, v15);
        v21 = LabelEnd;
        if( LabelEnd == v9 )
          break;
        v13 = 0;
        if( !v15 && bUseStd3Rules && (*v9 == v20 || LabelEnd > v8 && *(LabelEnd - 1) == v20) )
          goto LABEL_89;
        LODWORD(dwFlags) = 0;
        v22 = L"xl--";
        if( !v15 )
          v22 = (WCHAR *)L"xn--";
        Str2 = v22;
        v23 = RtlStringCchCopyNExW(v6, v14 - v6, v22, 4ui64, &ppszDestEnd, 0i64, dwFlags);
        v13 = 0;
        if( v23 < 0 )
        {
LABEL_85:
          result = -1073741789;
          goto LABEL_90;
        }
        v6 = ppszDestEnd;
        v24 = 0;
        for( i = v9; i < v21; ++i )
        {
          v26 = *i;
          if( *i >= 0x80u )
          {
            if( (unsigned __int16)(v26 + 10240) <= 0x3FFu )
              ++i;
          }
          else
          {
            if( !v15 && (bUseStd3Rules != (_BYTE)v13 && !ValidateStd3Range(v26) || v26 < 0x20u || v26 == 127) || !v26 )
              goto LABEL_89;
            if( v6 >= v14 )
              goto LABEL_85;
            if( !v15 && (unsigned __int16)(v26 - 65) <= 0x19u )
              v26 += 32;
            *v6++ = v26;
            ppszDestEnd = v6;
            ++v24;
          }
        }
        v27 = v21 - v9;
        v62 = v27;
        if( v24 == v27 )
        {
          v6 -= 4;
          for( j = v16; j < v6; ++j )
            *j = j[4];
          ppszDestEnd = v6;
        }
        else
        {
          if( (__int64)(((char *)v59 - (char *)v9) & 0xFFFFFFFFFFFFFFFEui64) >= 8 )
          {
            v29 = wcsnicmp(v9, Str2, 4u);
            v13 = 0;
            if( !v29 )
              goto LABEL_89;
          }
          v30 = v13;
          v64 = v13;
          if( v24 > 0 )
          {
            if( v6 >= v55 )
              goto LABEL_85;
            *v6++ = 45;
            ppszDestEnd = v6;
          }
          v54 = 72;
          for( k = 128; v24 < v27; k = v32 + 1 )
          {
            v32 = 0x7FFFFFF;
            v33 = v9;
            if( v9 < v21 )
            {
              do
              {
                UTF32 = GetUTF32(v33);
                if( UTF32 >= k && UTF32 < v32 )
                  v32 = UTF32;
                v36 = 4i64;
                if( UTF32 < 0x10000 )
                  v36 = 2i64;
                v33 = (wchar_t *)(v36 + v35);
              }
              while( v33 < v21 );
              v27 = v62;
              v30 = v64;
            }
            v37 = v9;
            for( m = (v32 - k) * (v24 - v30 + 1) + v13; v37 < v21; v37 = (wchar_t *)((char *)v37 + v50) )
            {
              v39 = GetUTF32(v37);
              v41 = v40 + 1;
              Str2a = v39;
              if( v39 >= v32 )
                v41 = v40;
              m = v41;
              if( v39 == v32 )
              {
                v42 = v41;
                for( n = 36; ; n += 36 )
                {
                  if( n > v54 )
                    v44 = n < v54 + 26 ? n - v54 : 26;
                  else
                    v44 = 1;
                  if( v42 < v44 )
                    break;
                  if( v6 >= v55 )
                    goto LABEL_84;
                  v45 = (v42 - v44) % (36 - v44);
                  v42 = (v42 - v44) / (36 - v44);
                  v46 = v45 + v44;
                  v47 = 22;
                  if( v46 <= 25 )
                    v47 = 97;
                  *v6++ = v46 + v47;
                }
                if( v6 >= v55 )
                {
LABEL_84:
                  v13 = 0;
                  goto LABEL_85;
                }
                v48 = 22;
                if( v42 <= 25 )
                  v48 = 97;
                *v6++ = v42 + v48;
                ppszDestEnd = v6;
                v49 = adapt(m, (unsigned int)(v24 - v64 + 1));
                v30 = v64;
                m = 0;
                ++v24;
                v54 = v49;
                v39 = Str2a;
                if( v32 >= 0x10000 )
                {
                  ++v24;
                  v30 = ++v64;
                }
              }
              else
              {
                v30 = v64;
              }
              v50 = 4i64;
              if( v39 < 0x10000 )
                v50 = 2i64;
            }
            v13 = m + 1;
          }
          v16 = v58;
          v13 = 0;
        }
        if( !v15 && (__int64)(((char *)v6 - (char *)v16) & 0xFFFFFFFFFFFFFFFEui64) > 126 )
          goto LABEL_89;
        v11 = v59;
        v14 = v55;
        if( v21 != v59 )
        {
          if( v6 >= v55 )
            goto LABEL_85;
          *v6++ = *v21;
          ppszDestEnd = v6;
          if( v15 )
          {
            if( *v21 == 64 )
            {
              v15 = v13;
              v61 = v6;
            }
          }
        }
        v8 = pInput;
        v58 = v6;
        v9 = v21 + 1;
        v16 = v6;
        if( v21 >= v59 )
        {
          v10 = pOutput;
          v7 = v66;
          goto LABEL_82;
        }
      }
      if( v15 || LabelEnd != v19 )
        goto LABEL_88;
      v10 = pOutput;
      v7 = v66;
    }
    v51 = v18;
    if( v18 - v61 > 255i64 - (*(v6 - 1) != 46) )
    {
LABEL_88:
      v13 = 0;
      goto LABEL_89;
    }
LABEL_93:
    if( *(v6 - 1) != 64 )
    {
      *(_DWORD *)v7 = v51 - v10;
      return 0;
    }
    goto LABEL_88;
  }
LABEL_89:
  result = -1073740010;
LABEL_90:
  *(_DWORD *)v66 = v13;
  return result;
}

Referenced by:

RtlpNameprepAsciiRealWorker