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