platinum95

Untitled

Jul 21st, 2021
941
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. INT WINAPI DECLSPEC_HOTPATCH ResolveLocaleName( const WCHAR *locale, WCHAR *buffer, INT cchLocaleName )
  2. {
  3.     WCHAR name[LOCALE_NAME_MAX_LENGTH];
  4.  
  5.     if (locale == LOCALE_NAME_USER_DEFAULT) return GetUserDefaultLocaleName( buffer, cchLocaleName );
  6.  
  7.     lstrcpynW( name, locale, LOCALE_NAME_MAX_LENGTH );
  8.  
  9.     for (;;)
  10.     {
  11.         WCHAR neutral[3];
  12.         WCHAR* p;
  13.         LCID lcid = LocaleNameToLCID( name, LOCALE_ALLOW_NEUTRAL_NAMES );
  14.  
  15.         if (lcid != LOCALE_CUSTOM_UNSPECIFIED && lcid > 0 && GetLocaleInfoEx( name, LOCALE_INEUTRAL, neutral, 3 ) == 2)
  16.         {
  17.             if (neutral[ 0 ] == '1')
  18.             {
  19.                 /* Attempt to get default locale from neutral locale */
  20.                 lcid = MAKELCID( MAKELANGID(lcid,  SUBLANG_DEFAULT), SORT_DEFAULT );
  21.  
  22.                 return GetLocaleInfoW( lcid, LOCALE_SNAME, buffer, cchLocaleName );
  23.             }
  24.             else
  25.             {
  26.                 /* Found a valid non-neutral locale */
  27.                 int len = lstrlenW( name ) + 1u;
  28.  
  29.                 if (buffer && cchLocaleName < len )
  30.                 {
  31.                     SetLastError( ERROR_INSUFFICIENT_BUFFER );
  32.                     return 0;
  33.                 }
  34.                 if (buffer) lstrcpynW( buffer, name, len );
  35.  
  36.                 return len;
  37.             }
  38.         }
  39.  
  40.  
  41.         if (p = wcsrchr( name, L'_' ))
  42.         {
  43.             *p = 0;
  44.             continue;
  45.         }
  46.         else
  47.         {
  48.             /* Not dealing with modifiers; check for & remove script e.g. en-Latn-IE -> en-IE */
  49.             int delim = 0;
  50.             for (p = name; *p != 0; ++p) if ( *p == L'-' ) ++delim;
  51.             if ( delim == 2)
  52.             {
  53.                 wchar_t* from;
  54.                 wchar_t* to;
  55.  
  56.                 from = wcsrchr( name, L'-' ) + 1;
  57.                 to = wcschr( name, L'-' ) + 1;
  58.                 while (*from != 0) *(to++) = *(from++);
  59.                 *to = 0;
  60.                 continue;
  61.             }
  62.             else if (((p = wcsrchr( name, L'-' ))))
  63.             {
  64.                 *p = 0;
  65.                 continue;
  66.             }
  67.             break;
  68.         }
  69.     }
  70.     return 0;
  71. }
RAW Paste Data