UpcaseUnicodeToMultiByteNHelper

INT64 __fastcall UpcaseUnicodeToMultiByteNHelper(INT64 a1, UINT64 a2, _DWORD *a3, UINT16 *a4, UINT64 a5){
  unsigned int v5; 
  unsigned int v8; 
  _BYTE *v9; 
  int i; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int16 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int16 v17; 
  unsigned int v18; 
  v5 = a5;
  v8 = a2;
  LODWORD(v9) = a1;
  for( i = a1; v5; --v5 )
  {
    if( !v8 )
      break;
    v11 = *a4;
    v12 = NlsUnicodeToMbAnsiData;
    ++a4;
    v13 = *(_WORD *)(NlsUnicodeToMbAnsiData + 2 * v11);
    v14 = *((unsigned __int16 *)&NlsLeadByteInfoTable + ((unsigned __int64)v13 >> 8));
    if( (_WORD)v14 )
    {
      v15 = (unsigned __int8)v13 + v14;
      v16 = NlsMbAnsiCodePageTables;
    }
    else
    {
      v16 = NlsAnsiToUnicodeData;
      v15 = (unsigned __int8)v13;
    }
    v17 = *(_WORD *)(v12 + 2i64 * NLS_UPCASE(*(_WORD *)(v16 + 2 * v15)));
    if( HIBYTE(v17) )
    {
      v18 = v8--;
      if( v18 < 2 )
        break;
      *v9++ = HIBYTE(v17);
    }
    *v9 = v17;
    --v8;
    LODWORD(v9) = (_DWORD)v9 + 1;
  }
  if( a3 )
    *a3 = (_DWORD)v9 - i;
  return v8 < v5 ? 0x80000005 : 0;
}

Referenced by:

RtlUpcaseUnicodeToMultiByteN
RtlUpcaseUnicodeToOemN