RtlUnicodeToMultiByteN

NTSTATUS __stdcall RtlUnicodeToMultiByteN(
        PCHAR MultiByteString,
        UINT64 MaxBytesInMultiByteString,
        PULONG BytesInMultiByteString,
        WCHAR *UnicodeString,
        UINT64 BytesInUnicodeString){
  unsigned int v8; 
  unsigned int v9; 
  INT64 v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned int *v14; 
  int v15; 
  int v16; 
  PCHAR v17; 
  __int64 v18; 
  __int16 v19; 
  unsigned int v20; 
  UINT64 UnicodeStringByteCount; 
  char v22; 

  v8 = MaxBytesInMultiByteString;
  if( RtlpIsUtf8Process(0) )
  {
    v14 = (unsigned int *)&v22;
    if( BytesInMultiByteString )
      v14 = BytesInMultiByteString;
    if( (_DWORD)BytesInUnicodeString )
    {
      LODWORD(UnicodeStringByteCount) = BytesInUnicodeString;
      RtlUnicodeToUTF8N(MultiByteString, v8, v14, UnicodeString, UnicodeStringByteCount);
    }
    else
    {
      *v14 = 0;
    }
  }
  else
  {
    v9 = (unsigned int)BytesInUnicodeString >> 1;
    if( (_BYTE)NlsMbCodePageTag )
    {
      v15 = (int)MultiByteString;
      v16 = (int)MultiByteString;
      if( v9 )
      {
        v17 = MultiByteString;
        do
        {
          v16 = (int)v17;
          if( !v8 )
            break;
          v18 = *UnicodeString++;
          v19 = *(_WORD *)(NlsUnicodeToMbAnsiData + 2 * v18);
          if( HIBYTE(v19) )
          {
            v20 = v8--;
            if( v20 < 2 )
              break;
            *MultiByteString = HIBYTE(v19);
            MultiByteString = ++v17;
          }
          *MultiByteString = v19;
          --v8;
          MultiByteString = v17 + 1;
          v17 = MultiByteString;
          v16 = (int)MultiByteString;
          --v9;
        }
        while( v9 );
      }
      if( BytesInMultiByteString )
        *BytesInMultiByteString = v16 - v15;
    }
    else
    {
      if( v9 < v8 )
        v8 = (unsigned int)BytesInUnicodeString >> 1;
      if( BytesInMultiByteString )
        *BytesInMultiByteString = v8;
      v10 = NlsUnicodeToAnsiData;
      if( v8 )
      {
        v11 = v8;
        do
        {
          v12 = *UnicodeString;
          ++MultiByteString;
          ++UnicodeString;
          *(MultiByteString - 1) = *(_BYTE *)(v12 + v10);
          --v11;
        }
        while( v11 );
      }
    }
  }
  return 0;
}

Referenced by:

RtlUnicodeStringToAnsiString
safecrt_wctomb_s
wcstombs
wctomb_s_l