ReactOS  0.4.13-dev-257-gfabbd7c
input_list.c
Go to the documentation of this file.
1 /*
2 * PROJECT: input.dll
3 * FILE: dll/cpl/input/input_list.c
4 * PURPOSE: input.dll
5 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
6 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7 */
8 
9 #include "input_list.h"
10 
11 typedef struct
12 {
15 } MUI_SUBFONT;
16 
17 #include "../../../base/setup/lib/muifonts.h"
18 
20 {
21  DWORD cbData;
22  HKEY hKey;
23  static const WCHAR pszKey[] =
24  L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes";
25 
26  hKey = NULL;
28  if (hKey == NULL)
29  return FALSE;
30 
31  /* Overwrite only */
32  for (; pSubstitutes->FontName; ++pSubstitutes)
33  {
34  cbData = (lstrlenW(pSubstitutes->SubFontName) + 1) * sizeof(WCHAR);
35  RegSetValueExW(hKey, pSubstitutes->FontName, 0,
36  REG_SZ, (LPBYTE)pSubstitutes->SubFontName, cbData);
37  }
38 
39  RegCloseKey(hKey);
40 
41  return TRUE;
42 }
43 
44 BOOL
46 {
47  MUI_SUBFONT *pSubstitutes;
48  WORD wLangID, wPrimaryLangID, wSubLangID;
49 
50  wLangID = LANGIDFROMLCID(dwLocaleId);
51  wPrimaryLangID = PRIMARYLANGID(wLangID);
52  wSubLangID = SUBLANGID(wLangID);
53 
54  /* FIXME: Add more if necessary */
55  switch (wPrimaryLangID)
56  {
57  default:
58  pSubstitutes = LatinFonts;
59  break;
60  case LANG_AZERI:
61  case LANG_BELARUSIAN:
62  case LANG_BULGARIAN:
63  case LANG_KAZAK:
64  case LANG_RUSSIAN:
65  case LANG_SERBIAN:
66  case LANG_TATAR:
67  case LANG_UKRAINIAN:
68  case LANG_UZBEK:
69  pSubstitutes = CyrillicFonts;
70  break;
71  case LANG_GREEK:
72  pSubstitutes = GreekFonts;
73  break;
74  case LANG_HEBREW:
75  pSubstitutes = HebrewFonts;
76  break;
77  case LANG_CHINESE:
78  switch (wSubLangID)
79  {
83  pSubstitutes = ChineseSimplifiedFonts;
84  break;
87  pSubstitutes = ChineseTraditionalFonts;
88  break;
89  default:
90  pSubstitutes = NULL;
91  DebugBreak();
92  break;
93  }
94  break;
95  case LANG_JAPANESE:
96  pSubstitutes = JapaneseFonts;
97  break;
98  case LANG_KOREAN:
99  pSubstitutes = KoreanFonts;
100  break;
101  case LANG_ARABIC:
102  case LANG_ARMENIAN:
103  case LANG_BENGALI:
104  case LANG_FARSI:
105  case LANG_GEORGIAN:
106  case LANG_GUJARATI:
107  case LANG_HINDI:
108  case LANG_KONKANI:
109  case LANG_MARATHI:
110  case LANG_PUNJABI:
111  case LANG_SANSKRIT:
112  case LANG_TAMIL:
113  case LANG_TELUGU:
114  case LANG_THAI:
115  case LANG_URDU:
116  case LANG_VIETNAMESE:
117  pSubstitutes = UnicodeFonts;
118  break;
119  }
120 
121  if (pSubstitutes)
122  {
123  UpdateRegistryForFontSubstitutes(pSubstitutes);
124  return TRUE;
125  }
126  return FALSE;
127 }
128 
130 
131 
132 static INPUT_LIST_NODE*
134 {
135  INPUT_LIST_NODE *pCurrent;
136  INPUT_LIST_NODE *pNew;
137 
138  pCurrent = _InputList;
139 
140  pNew = (INPUT_LIST_NODE*)malloc(sizeof(INPUT_LIST_NODE));
141  if (pNew == NULL)
142  return NULL;
143 
144  ZeroMemory(pNew, sizeof(INPUT_LIST_NODE));
145 
146  if (pCurrent == NULL)
147  {
148  _InputList = pNew;
149  }
150  else
151  {
152  while (pCurrent->pNext != NULL)
153  {
154  pCurrent = pCurrent->pNext;
155  }
156 
157  pNew->pPrev = pCurrent;
158  pCurrent->pNext = pNew;
159  }
160 
161  return pNew;
162 }
163 
164 
165 static VOID
167 {
168  INPUT_LIST_NODE *pCurrent = pNode;
169 
170  if (_InputList == NULL)
171  return;
172 
173  if (pCurrent != NULL)
174  {
175  INPUT_LIST_NODE *pNext = pCurrent->pNext;
176  INPUT_LIST_NODE *pPrev = pCurrent->pPrev;
177 
178  free(pCurrent->pszIndicator);
179  free(pCurrent);
180 
181  if (pNext != NULL)
182  pNext->pPrev = pPrev;
183 
184  if (pPrev != NULL)
185  pPrev->pNext = pNext;
186  else
187  _InputList = pNext;
188  }
189 }
190 
191 
192 VOID
194 {
195  INPUT_LIST_NODE *pCurrent;
196 
197  if (_InputList == NULL)
198  return;
199 
200  pCurrent = _InputList;
201 
202  while (pCurrent != NULL)
203  {
204  INPUT_LIST_NODE *pNext = pCurrent->pNext;
205 
206  free(pCurrent->pszIndicator);
207  free(pCurrent);
208 
209  pCurrent = pNext;
210  }
211 
212  _InputList = NULL;
213 }
214 
215 
216 static BOOL
218 {
219  BOOL bResult = FALSE;
220  HKEY hTempKey = NULL;
221  HKEY hKey = NULL;
222 
224  L"Keyboard Layout",
225  0,
227  &hKey) == ERROR_SUCCESS)
228  {
229  RegDeleteKeyW(hKey, L"Preload");
230  RegDeleteKeyW(hKey, L"Substitutes");
231 
232  RegCloseKey(hKey);
233  }
234 
235  if (RegCreateKeyW(HKEY_CURRENT_USER, L"Keyboard Layout", &hKey) != ERROR_SUCCESS)
236  {
237  goto Cleanup;
238  }
239 
240  if (RegCreateKeyW(hKey, L"Preload", &hTempKey) != ERROR_SUCCESS)
241  {
242  goto Cleanup;
243  }
244 
245  RegCloseKey(hTempKey);
246 
247  if (RegCreateKeyW(hKey, L"Substitutes", &hTempKey) != ERROR_SUCCESS)
248  {
249  goto Cleanup;
250  }
251 
252  RegCloseKey(hTempKey);
253 
254  bResult = TRUE;
255 
256 Cleanup:
257  if (hTempKey != NULL)
258  RegCloseKey(hTempKey);
259  if (hKey != NULL)
260  RegCloseKey(hKey);
261 
262  return bResult;
263 }
264 
265 
266 static VOID
268 {
269  WCHAR szMethodIndex[MAX_PATH];
270  WCHAR szPreload[MAX_PATH];
271  BOOL bIsImeMethod = FALSE;
272  HKEY hKey;
273 
274  StringCchPrintfW(szMethodIndex, ARRAYSIZE(szMethodIndex), L"%lu", dwIndex);
275 
276  /* Check is IME method */
277  if ((HIWORD(pNode->pLayout->dwId) & 0xF000) == 0xE000)
278  {
279  StringCchPrintfW(szPreload, ARRAYSIZE(szPreload), L"%08X", pNode->pLayout->dwId);
280  bIsImeMethod = TRUE;
281  }
282  else
283  {
284  StringCchPrintfW(szPreload, ARRAYSIZE(szPreload), L"%08X", pNode->pLocale->dwId);
285  }
286 
288  L"Keyboard Layout\\Preload",
289  0,
291  &hKey) == ERROR_SUCCESS)
292  {
293  RegSetValueExW(hKey,
294  szMethodIndex,
295  0,
296  REG_SZ,
297  (LPBYTE)szPreload,
298  (wcslen(szPreload) + 1) * sizeof(WCHAR));
299 
300  RegCloseKey(hKey);
301  }
302 
303  if (pNode->pLocale->dwId != pNode->pLayout->dwId && bIsImeMethod == FALSE)
304  {
306  L"Keyboard Layout\\Substitutes",
307  0,
309  &hKey) == ERROR_SUCCESS)
310  {
311  WCHAR szSubstitutes[MAX_PATH];
312 
313  StringCchPrintfW(szSubstitutes, ARRAYSIZE(szSubstitutes), L"%08X", pNode->pLayout->dwId);
314 
315  RegSetValueExW(hKey,
316  szPreload,
317  0,
318  REG_SZ,
319  (LPBYTE)szSubstitutes,
320  (wcslen(szSubstitutes) + 1) * sizeof(WCHAR));
321 
322  RegCloseKey(hKey);
323  }
324  }
325 
326  if ((pNode->wFlags & INPUT_LIST_NODE_FLAG_ADDED) ||
328  {
330  }
331 }
332 
333 
334 /*
335  * Writes any changes in input methods to the registry
336  */
337 BOOL
339 {
340  INPUT_LIST_NODE *pCurrent;
341  DWORD dwIndex;
342  BOOL bRet = FALSE;
343 
344  /* Process deleted and edited input methods */
345  for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
346  {
347  if ((pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED) ||
348  (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_EDITED))
349  {
350  if (UnloadKeyboardLayout(pCurrent->hkl))
351  {
352  /* Only unload the edited input method, but does not delete it from the list */
353  if (!(pCurrent->wFlags & INPUT_LIST_NODE_FLAG_EDITED))
354  {
355  InputList_RemoveNode(pCurrent);
356  }
357  }
358  }
359  }
360 
362 
363  /* Find default input method */
364  for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
365  {
366  if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
367  {
368  bRet = InputList_SetFontSubstitutes(pCurrent->pLocale->dwId);
370  break;
371  }
372  }
373 
374  if (SystemParametersInfoW(SPI_SETDEFAULTINPUTLANG,
375  0,
376  (LPVOID)((LPDWORD)&pCurrent->hkl),
377  0))
378  {
379  DWORD dwRecipients;
380 
381  dwRecipients = BSM_ALLCOMPONENTS;
382 
384  &dwRecipients,
385  WM_INPUTLANGCHANGEREQUEST,
386  0,
387  (LPARAM)pCurrent->hkl);
388  }
389 
390  /* Add methods to registry */
391  dwIndex = 2;
392 
393  for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
394  {
395  if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
396  continue;
397 
398  InputList_AddInputMethodToUserRegistry(dwIndex, pCurrent);
399 
400  dwIndex++;
401  }
402 
403  return bRet;
404 }
405 
406 
407 BOOL
409 {
410  WCHAR szIndicator[MAX_STR_LEN];
411  INPUT_LIST_NODE *pInput;
412 
413  if (pLocale == NULL || pLayout == NULL)
414  {
415  return FALSE;
416  }
417 
418  for (pInput = _InputList; pInput != NULL; pInput = pInput->pNext)
419  {
420  if (pInput->pLocale == pLocale && pInput->pLayout == pLayout)
421  {
422  return FALSE;
423  }
424  }
425 
426  pInput = InputList_AppendNode();
427 
429 
430  pInput->pLocale = pLocale;
431  pInput->pLayout = pLayout;
432 
433  if (GetLocaleInfoW(LOWORD(pInput->pLocale->dwId),
435  szIndicator,
436  ARRAYSIZE(szIndicator)))
437  {
438  size_t len = wcslen(szIndicator);
439 
440  if (len > 0)
441  {
442  szIndicator[len - 1] = 0;
443  pInput->pszIndicator = _wcsdup(szIndicator);
444  }
445  }
446 
447  return TRUE;
448 }
449 
450 
451 VOID
453 {
454  INPUT_LIST_NODE *pCurrent;
455 
456  if (pNode == NULL)
457  return;
458 
459  for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
460  {
461  if (pCurrent == pNode)
462  {
464  }
465  else
466  {
467  pCurrent->wFlags &= ~INPUT_LIST_NODE_FLAG_DEFAULT;
468  }
469  }
470 }
471 
472 
473 /*
474  * It marks the input method for deletion, but does not delete it directly.
475  * To apply the changes using InputList_Process()
476  */
477 VOID
479 {
480  BOOL bRemoveNode = FALSE;
481 
482  if (pNode == NULL)
483  return;
484 
485  if (pNode->wFlags & INPUT_LIST_NODE_FLAG_ADDED)
486  {
487  /*
488  * If the input method has been added to the list, but not yet written
489  * in the registry, then simply remove it from the list
490  */
491  bRemoveNode = TRUE;
492  }
493  else
494  {
496  }
497 
499  {
500  if (pNode->pNext != NULL)
501  {
502  pNode->pNext->wFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
503  }
504  else if (pNode->pPrev != NULL)
505  {
506  pNode->pPrev->wFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
507  }
508  }
509 
510  if (bRemoveNode != FALSE)
511  {
512  InputList_RemoveNode(pNode);
513  }
514 }
515 
516 
517 VOID
519 {
520  INT iLayoutCount;
521  HKL *pLayoutList;
522 
523  iLayoutCount = GetKeyboardLayoutList(0, NULL);
524  pLayoutList = (HKL*) malloc(iLayoutCount * sizeof(HKL));
525 
526  if (pLayoutList != NULL)
527  {
528  if (GetKeyboardLayoutList(iLayoutCount, pLayoutList) > 0)
529  {
530  INT iIndex;
531 
532  for (iIndex = 0; iIndex < iLayoutCount; iIndex++)
533  {
534  LOCALE_LIST_NODE *pLocale = LocaleList_GetByHkl(pLayoutList[iIndex]);
535  LAYOUT_LIST_NODE *pLayout = LayoutList_GetByHkl(pLayoutList[iIndex]);
536 
537  if (pLocale != NULL && pLayout != NULL)
538  {
539  WCHAR szIndicator[MAX_STR_LEN] = { 0 };
540  INPUT_LIST_NODE *pInput;
541  HKL hklDefault;
542 
543  pInput = InputList_AppendNode();
544 
545  pInput->pLocale = pLocale;
546  pInput->pLayout = pLayout;
547  pInput->hkl = pLayoutList[iIndex];
548 
549  if (SystemParametersInfoW(SPI_GETDEFAULTINPUTLANG,
550  0,
551  (LPVOID)((LPDWORD)&hklDefault),
552  0) == FALSE)
553  {
554  hklDefault = GetKeyboardLayout(0);
555  }
556 
557  if (pInput->hkl == hklDefault)
558  {
560  }
561 
562  if (GetLocaleInfoW(LOWORD(pInput->pLocale->dwId),
564  szIndicator,
565  ARRAYSIZE(szIndicator)))
566  {
567  size_t len = wcslen(szIndicator);
568 
569  if (len > 0)
570  {
571  szIndicator[len - 1] = 0;
572  pInput->pszIndicator = _wcsdup(szIndicator);
573  }
574  }
575  }
576  }
577  }
578 
579  free(pLayoutList);
580  }
581 }
582 
583 
586 {
587  return _InputList;
588 }
#define LANG_UZBEK
Definition: nls.h:142
#define BSM_ALLCOMPONENTS
Definition: dbt.h:47
#define LANG_BELARUSIAN
Definition: nls.h:35
PCWSTR SubFontName
Definition: mui.h:6
#define TRUE
Definition: types.h:120
#define SUBLANG_CHINESE_TRADITIONAL
Definition: nls.h:208
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_SET_VALUE
Definition: nt_native.h:1017
static INPUT_LIST_NODE * InputList_AppendNode(VOID)
Definition: input_list.c:133
#define LANG_THAI
Definition: nls.h:132
#define LANG_HINDI
Definition: nls.h:68
#define HKEY_CURRENT_USER
Definition: winreg.h:11
VOID InputList_Destroy(VOID)
Definition: input_list.c:193
#define free
Definition: debug_ros.c:5
LONG WINAPI BroadcastSystemMessageW(DWORD dwFlags, LPDWORD lpdwRecipients, UINT uiMessage, WPARAM wParam, LPARAM lParam)
Definition: message.c:3397
static INPUT_LIST_NODE * _InputList
Definition: input_list.c:129
LOCALE_LIST_NODE * pLocale
Definition: input_list.h:18
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1240
static VOID InputList_AddInputMethodToUserRegistry(DWORD dwIndex, INPUT_LIST_NODE *pNode)
Definition: input_list.c:267
#define LANG_AZERI
Definition: nls.h:32
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define KLF_NOTELLSHELL
Definition: winuser.h:116
#define ZeroMemory
Definition: winbase.h:1635
BOOL InputList_SetFontSubstitutes(LCID dwLocaleId)
Definition: input_list.c:45
#define SUBLANG_CHINESE_HONGKONG
Definition: nls.h:210
struct _INPUT_LIST_NODE * pPrev
Definition: input_list.h:25
#define LANG_ARABIC
Definition: nls.h:29
DWORD LCID
Definition: nls.h:13
uint16_t * PWCHAR
Definition: typedefs.h:54
Definition: mui.h:3
#define SUBLANG_CHINESE_SINGAPORE
Definition: nls.h:211
#define LANG_BENGALI
Definition: nls.h:36
INPUT_LIST_NODE * InputList_GetFirst(VOID)
Definition: input_list.c:585
LAYOUT_LIST_NODE * pLayout
Definition: input_list.h:19
#define BSF_POSTMESSAGE
Definition: dbt.h:58
#define lstrlenW
Definition: compat.h:407
int32_t INT
Definition: typedefs.h:56
#define LANG_HEBREW
Definition: nls.h:67
#define LANG_SERBIAN
Definition: nls.h:116
PWCHAR FontName
Definition: input_list.c:13
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: lang.c:1098
static BOOL InputList_PrepareUserRegistry(VOID)
Definition: input_list.c:217
#define LANG_BULGARIAN
Definition: nls.h:40
#define LOCALE_NOUSEROVERRIDE
Definition: winnls.h:19
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
#define LANG_JAPANESE
Definition: nls.h:76
MUI_SUBFONT LatinFonts[]
Definition: muifonts.h:3
unsigned int BOOL
Definition: ntddk_ex.h:94
VOID InputList_Create(VOID)
Definition: input_list.c:518
void WINAPI DebugBreak(void)
static VOID InputList_RemoveNode(INPUT_LIST_NODE *pNode)
Definition: input_list.c:166
#define LANG_KONKANI
Definition: nls.h:83
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
#define INPUT_LIST_NODE_FLAG_ADDED
Definition: input_list.h:9
#define LANG_TELUGU
Definition: nls.h:131
#define LANG_TATAR
Definition: nls.h:130
LAYOUT_LIST_NODE * LayoutList_GetByHkl(HKL hkl)
Definition: layout_list.c:242
#define KLF_SUBSTITUTE_OK
Definition: winuser.h:112
PWCHAR SubFontName
Definition: input_list.c:14
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4917
BOOL WINAPI SystemParametersInfoW(_In_ UINT, _In_ UINT, _Inout_opt_ PVOID, _In_ UINT)
MUI_SUBFONT HebrewFonts[]
Definition: muifonts.h:85
MUI_SUBFONT KoreanFonts[]
Definition: muifonts.h:251
MUI_SUBFONT CyrillicFonts[]
Definition: muifonts.h:31
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define INPUT_LIST_NODE_FLAG_DEFAULT
Definition: input_list.h:11
BOOL WINAPI UnloadKeyboardLayout(_In_ HKL)
#define LANG_SANSKRIT
Definition: nls.h:115
UINT WINAPI GetKeyboardLayoutList(_In_ int nBuff, _Out_writes_to_opt_(nBuff, return) HKL FAR *lpList)
#define LOCALE_SABBREVLANGNAME
Definition: winnls.h:28
#define MAX_PATH
Definition: compat.h:26
#define LANG_URDU
Definition: nls.h:141
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
VOID InputList_SetDefault(INPUT_LIST_NODE *pNode)
Definition: input_list.c:452
#define LANG_RUSSIAN
Definition: nls.h:113
BOOL InputList_Add(LOCALE_LIST_NODE *pLocale, LAYOUT_LIST_NODE *pLayout)
Definition: input_list.c:408
static const WCHAR L[]
Definition: oid.c:1250
#define INPUT_LIST_NODE_FLAG_DELETED
Definition: input_list.h:10
GLenum GLsizei len
Definition: glext.h:6722
#define LANGIDFROMLCID(l)
Definition: nls.h:18
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1202
UINT_PTR HKL
Definition: msctf.idl:101
static const WCHAR Cleanup[]
Definition: register.c:80
#define SUBLANG_CHINESE_SIMPLIFIED
Definition: nls.h:209
PCWSTR FontName
Definition: mui.h:5
#define LANG_VIETNAMESE
Definition: nls.h:143
#define LANG_MARATHI
Definition: nls.h:98
MUI_SUBFONT JapaneseFonts[]
Definition: muifonts.h:206
MUI_SUBFONT ChineseTraditionalFonts[]
Definition: muifonts.h:162
VOID InputList_Remove(INPUT_LIST_NODE *pNode)
Definition: input_list.c:478
#define LANG_PUNJABI
Definition: nls.h:109
MUI_SUBFONT UnicodeFonts[]
Definition: muifonts.h:294
#define SUBLANG_CHINESE_MACAU
Definition: nls.h:212
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
HKL WINAPI LoadKeyboardLayoutW(_In_ LPCWSTR, _In_ UINT)
PKEYBOARD_LAYOUT GetKeyboardLayout()
Definition: utils.c:194
#define LANG_UKRAINIAN
Definition: nls.h:139
MUI_SUBFONT ChineseSimplifiedFonts[]
Definition: muifonts.h:118
#define LANG_FARSI
Definition: nls.h:55
#define MAX_STR_LEN
Definition: defines.h:33
BOOL UpdateRegistryForFontSubstitutes(MUI_SUBFONT *pSubstitutes)
Definition: input_list.c:19
struct _INPUT_LIST_NODE * pNext
Definition: input_list.h:26
#define LANG_CHINESE
Definition: nls.h:42
uint32_t * LPDWORD
Definition: typedefs.h:57
#define HIWORD(l)
Definition: typedefs.h:246
BOOL InputList_Process(VOID)
Definition: input_list.c:338
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3381
#define LANG_ARMENIAN
Definition: nls.h:30
#define malloc
Definition: debug_ros.c:4
#define LANG_KOREAN
Definition: nls.h:84
#define LANG_TAMIL
Definition: nls.h:129
#define LANG_GEORGIAN
Definition: nls.h:61
#define LANG_KAZAK
Definition: nls.h:79
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
MUI_SUBFONT GreekFonts[]
Definition: muifonts.h:58
#define LANG_GREEK
Definition: nls.h:63
#define LOWORD(l)
Definition: pedump.c:82
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define LANG_GUJARATI
Definition: nls.h:65
#define INPUT_LIST_NODE_FLAG_EDITED
Definition: input_list.h:8
LOCALE_LIST_NODE * LocaleList_GetByHkl(HKL hkl)
Definition: locale_list.c:129
WCHAR * pszIndicator
Definition: input_list.h:23
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define REG_SZ
Definition: layer.c:22
#define SUBLANGID(l)
Definition: nls.h:17