UpcaseUnicodeToUTF8NHelper
NTSTATUS __stdcall UpcaseUnicodeToUTF8NHelper(PCHAR UTF8StringDestination, UINT32 UTF8StringMaxByteCount, INT64 a3){
__int64 v3;
unsigned int v4;
NTSTATUS v5;
int v6;
__int64 v7;
unsigned int v11;
wchar_t *v12;
__int64 v13;
UINT16 v14;
UINT16 *v15;
__int64 v16;
UINT64 UnicodeStringByteCount;
__int64 UTF8StringActualByteCount[2];
wchar_t UnicodeStringSource[64];
unsigned int v21;
v4 = v21;
v5 = 0;
v6 = 0;
v7 = v3;
if( v21 )
{
while( 1 )
{
if( !UTF8StringMaxByteCount )
goto LABEL_15;
LODWORD(UTF8StringActualByteCount[0]) = 0;
if( v4 < 0x40 )
break;
v11 = 64;
if( v4 != 64 && (unsigned int)*(unsigned __int16 *)(v7 + 126) - 55296 <= 0x3FF )
{
v11 = 63;
LABEL_8:
if( !v11 )
goto LABEL_11;
}
v12 = UnicodeStringSource;
v13 = v7 - (_QWORD)UnicodeStringSource;
do
{
v14 = NLS_UPCASE(*(wchar_t *)((char *)v12 + v13));
*v15 = v14;
v12 = v15 + 1;
}
while( v16 != 1 );
LABEL_11:
LODWORD(UnicodeStringByteCount) = 2 * v11;
if( RtlUnicodeToUTF8N(
UTF8StringDestination,
UTF8StringMaxByteCount,
(PULONG)UTF8StringActualByteCount,
UnicodeStringSource,
UnicodeStringByteCount) < 0 )
{
v6 += LODWORD(UTF8StringActualByteCount[0]);
v5 = -2147483643;
goto LABEL_15;
}
UTF8StringDestination += LODWORD(UTF8StringActualByteCount[0]);
UTF8StringMaxByteCount -= LODWORD(UTF8StringActualByteCount[0]);
v6 += LODWORD(UTF8StringActualByteCount[0]);
v7 += 2i64 * v11;
v4 -= v11;
if( !v4 )
goto LABEL_15;
}
v11 = v4;
goto LABEL_8;
}
LABEL_15:
if( a3 )
*(_DWORD *)a3 = v6;
return v5;
}Referenced by:
RtlUpcaseUnicodeToMultiByteN
RtlUpcaseUnicodeToOemN