CountUnicodeToUTF8

NTSTATUS __stdcall CountUnicodeToUTF8(PWCHAR chars, UINT64 count, UINT64 *pByteCount){
  NTSTATUS v3; 
  unsigned __int64 v4; 
  PWCHAR v6; 
  unsigned int v7; 
  WCHAR *v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  WCHAR *v11; 
  unsigned int v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  NTSTATUS result; 
  char v18; 
  WCHAR *v19; 
  unsigned int v20; 
  unsigned int v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  v3 = 0;
  v4 = (unsigned __int64)(unsigned int)count >> 1;
  v6 = chars;
  v7 = (unsigned int)count >> 1;
  v8 = &chars[v4];
LABEL_2:
  v9 = 0;
  while( 1 )
  {
    if( v6 >= v8 )
    {
      if( v9 )
      {
        ++v7;
        goto LABEL_7;
      }
      goto LABEL_23;
    }
    if( v9 )
      break;
    v9 = *v6++;
LABEL_6:
    if( v9 - 55296 > 0x3FF )
      goto LABEL_7;
    --v7;
  }
  ++v7;
  if( (unsigned int)*v6 - 56320 > 0x3FF )
  {
    v18 = 0;
  }
  else
  {
    v18 = 1;
    v9 = 65533;
  }
  v19 = v6 + 1;
  if( !v18 )
    v19 = v6;
  v6 = v19;
LABEL_7:
  if( v9 - 55296 <= 0x7FF )
  {
    v3 = 263;
    v9 = 65533;
  }
  if( v9 > 0x7F )
  {
    v20 = v7 + 1;
    if( v9 <= 0x7FF )
      v20 = v7;
    v7 = v20 + 1;
  }
  v10 = v8 - v6;
  if( v10 > 0xD )
  {
    v11 = &v6[v10 - 7];
    while( 1 )
    {
      if( v6 >= v11 )
        goto LABEL_2;
      v12 = *v6++;
      if( v12 > 0x7F )
      {
        if( v12 > 0x7FF )
        {
          if( (v12 & 0xF800) == 55296 )
            goto LABEL_63;
          ++v7;
        }
        ++v7;
      }
      if( ((unsigned __int8)v6 & 2) != 0 )
      {
        v12 = *v6++;
        if( v12 > 0x7F )
        {
          if( v12 > 0x7FF )
          {
            if( (v12 & 0xF800) == 55296 )
              goto LABEL_63;
            ++v7;
          }
          ++v7;
          goto LABEL_15;
        }
      }
      while( 1 )
      {
LABEL_15:
        if( v6 >= v11 )
          goto LABEL_2;
        v13 = *((_DWORD *)v6 + 1);
        v12 = *(_DWORD *)v6;
        v14 = *(_DWORD *)v6 | v13;
        if( (v14 & 0xFF80FF80) != 0 )
        {
          if( (v14 & 0xF800F800) != 0 )
            goto LABEL_62;
          v21 = v7 + 1;
          if( (v12 & 0xFF800000) == 0 )
            v21 = v7;
          v22 = v21 + 1;
          if( (*(_DWORD *)v6 & 0xFF80) == 0 )
            v22 = v21;
          v7 = v22 + 1;
          if( (v13 & 0xFF800000) == 0 )
            v7 = v22;
          if( (v13 & 0xFF80) != 0 )
            ++v7;
        }
        v15 = *((_DWORD *)v6 + 3);
        v6 += 4;
        v12 = *(_DWORD *)v6;
        v16 = *(_DWORD *)v6 | v15;
        if( (v16 & 0xFF80FF80) != 0 )
          break;
LABEL_18:
        v6 += 4;
      }
      if( (v16 & 0xF800F800) == 0 )
        break;
LABEL_62:
      v12 = (unsigned __int16)v12;
      ++v6;
      if( (unsigned __int16)v12 > 0x7Fu )
      {
LABEL_63:
        if( v12 <= 0x7FF )
          goto LABEL_69;
        if( v12 - 55296 > 0x7FF )
          goto LABEL_68;
        if( v12 > 0xDBFF || (unsigned int)*v6 - 56320 > 0x3FF )
        {
          --v6;
          goto LABEL_2;
        }
        ++v6;
LABEL_68:
        ++v7;
LABEL_69:
        ++v7;
      }
    }
    v23 = v7 + 1;
    if( (v12 & 0xFF800000) == 0 )
      v23 = v7;
    v24 = v23 + 1;
    if( (*(_DWORD *)v6 & 0xFF80) == 0 )
      v24 = v23;
    v7 = v24 + 1;
    if( (v15 & 0xFF800000) == 0 )
      v7 = v24;
    if( (v15 & 0xFF80) != 0 )
      ++v7;
    goto LABEL_18;
  }
  while( v6 < v8 )
  {
    v9 = *v6++;
    if( v9 > 0x7F )
      goto LABEL_6;
  }
LABEL_23:
  result = v3;
  *(_DWORD *)pByteCount = v7;
  return result;
}

Referenced by:

RtlUnicodeStringToUTF8String
RtlUnicodeToUTF8N