2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Userinit Logon Application
4 * FILE: base/system/userinit/livecd.c
5 * PROGRAMMERS: Eric Kohl
15 InitImageInfo(PIMGINFO ImgInfo
)
19 ZeroMemory(ImgInfo
, sizeof(*ImgInfo
));
21 ImgInfo
->hBitmap
= LoadImage(hInstance
,
22 MAKEINTRESOURCE(IDB_ROSLOGO
),
28 if (ImgInfo
->hBitmap
!= NULL
)
30 GetObject(ImgInfo
->hBitmap
, sizeof(BITMAP
), &bitmap
);
32 ImgInfo
->cxSource
= bitmap
.bmWidth
;
33 ImgInfo
->cySource
= bitmap
.bmHeight
;
41 HKEY ControlKey
= NULL
;
42 LPWSTR SystemStartOptions
= NULL
;
43 LPWSTR CurrentOption
, NextOption
; /* Pointers into SystemStartOptions */
47 TRACE("IsLiveCD()\n");
49 rc
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
50 REGSTR_PATH_CURRENT_CONTROL_SET
,
54 if (rc
!= ERROR_SUCCESS
)
56 WARN("RegOpenKeyEx() failed with error %lu\n", rc
);
60 rc
= ReadRegSzKey(ControlKey
, L
"SystemStartOptions", &SystemStartOptions
);
61 if (rc
!= ERROR_SUCCESS
)
63 WARN("ReadRegSzKey() failed with error %lu\n", rc
);
67 /* Check for CONSOLE switch in SystemStartOptions */
68 CurrentOption
= SystemStartOptions
;
71 NextOption
= wcschr(CurrentOption
, L
' ');
74 if (_wcsicmp(CurrentOption
, L
"MININT") == 0)
76 TRACE("Found 'MININT' boot option\n");
80 CurrentOption
= NextOption
? NextOption
+ 1 : NULL
;
84 if (ControlKey
!= NULL
)
85 RegCloseKey(ControlKey
);
86 HeapFree(GetProcessHeap(), 0, SystemStartOptions
);
88 TRACE("IsLiveCD() returning %d\n", ret
);
95 LocalesEnumProc(LPTSTR lpLocale
)
100 BOOL bNoShow
= FALSE
;
102 lcid
= wcstoul(lpLocale
, NULL
, 16);
104 /* Display only languages with installed support */
105 if (!IsValidLocale(lcid
, LCID_INSTALLED
))
108 if (lcid
== MAKELCID(MAKELANGID(LANG_SPANISH
, SUBLANG_SPANISH
), SORT_DEFAULT
) ||
109 lcid
== MAKELCID(MAKELANGID(LANG_SPANISH
, SUBLANG_SPANISH_MODERN
), SORT_DEFAULT
))
113 LoadStringW(hInstance
, IDS_SPAIN
, lang
, 255);
123 GetLocaleInfoW(lcid
, LOCALE_SLANGUAGE
, lang
, sizeof(lang
)/sizeof(WCHAR
));
126 if (bNoShow
== FALSE
)
128 index
= SendMessageW(hList
,
144 CreateLanguagesList(HWND hwnd
)
150 EnumSystemLocalesW(LocalesEnumProc
, LCID_SUPPORTED
);
152 /* Select current locale */
153 /* or should it be System and not user? */
154 GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_SLANGUAGE
, langSel
, sizeof(langSel
)/sizeof(WCHAR
));
166 GetLayoutID(LPWSTR szLayoutNum
, LPWSTR szLCID
)
174 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Keyboard Layout\\Preload", 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
176 dwBufLen
= sizeof(szTempLCID
);
177 dwRes
= RegQueryValueExW(hKey
, szLayoutNum
, NULL
, NULL
, (LPBYTE
)szTempLCID
, &dwBufLen
);
179 if (dwRes
!= ERROR_SUCCESS
)
188 // Look for a substitude of this layout
189 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Keyboard Layout\\Substitutes", 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
191 dwBufLen
= sizeof(szTempLCID
);
193 if (RegQueryValueExW(hKey
, szTempLCID
, NULL
, NULL
, (LPBYTE
)szLCID
, &dwBufLen
) != ERROR_SUCCESS
)
195 // No substitute found, then use the old LCID
196 wcscpy(szLCID
, szTempLCID
);
203 // Substitutes key couldn't be opened, so use the old LCID
204 wcscpy(szLCID
, szTempLCID
);
220 WCHAR szBuf
[MAX_PATH
], szDispName
[MAX_PATH
], szIndex
[MAX_PATH
], szPath
[MAX_PATH
];
224 wsprintf(szBuf
, L
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s", szLCID
);
226 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, (LPCTSTR
)szBuf
, 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
228 dwBufLen
= sizeof(szBuf
);
230 if (RegQueryValueExW(hKey
, L
"Layout Display Name", NULL
, NULL
, (LPBYTE
)szDispName
, &dwBufLen
) == ERROR_SUCCESS
)
232 if (szDispName
[0] == '@')
234 for (i
= 0; i
< wcslen(szDispName
); i
++)
236 if ((szDispName
[i
] == ',') && (szDispName
[i
+ 1] == '-'))
238 for (j
= i
+ 2, k
= 0; j
< wcslen(szDispName
)+1; j
++, k
++)
240 szIndex
[k
] = szDispName
[j
];
242 szDispName
[i
- 1] = '\0';
246 szDispName
[i
] = szDispName
[i
+ 1];
249 if (ExpandEnvironmentStringsW(szDispName
, szPath
, MAX_PATH
))
251 hLib
= LoadLibraryW(szPath
);
254 if (LoadStringW(hLib
, _wtoi(szIndex
), szPath
, sizeof(szPath
) / sizeof(WCHAR
)) != 0)
256 wcscpy(szName
, szPath
);
266 dwBufLen
= sizeof(szBuf
);
268 if (RegQueryValueExW(hKey
, L
"Layout Text", NULL
, NULL
, (LPBYTE
)szName
, &dwBufLen
) == ERROR_SUCCESS
)
290 iCurSel
= SendMessageW(hwnd
, CB_GETCURSEL
, 0, 0);
291 if (iCurSel
== CB_ERR
)
294 pszLCID
= (PWSTR
)SendMessageW(hwnd
, CB_GETITEMDATA
, iCurSel
, 0);
295 if (pszLCID
== (PWSTR
)CB_ERR
)
298 if (GetLayoutID(pszLCID
, szLCID
))
300 hKl
= LoadKeyboardLayoutW(szLCID
, KLF_ACTIVATE
| KLF_SETFORPROCESS
);
301 SystemParametersInfoW(SPI_SETDEFAULTINPUTLANG
, 0, &hKl
, SPIF_SENDWININICHANGE
);
309 SelectKeyboardForLanguage(
316 TRACE("LCID: %08lx\n", lcid
);
317 TRACE("LangID: %04lx\n", LANGIDFROMLCID(lcid
));
319 nCount
= SendMessageW(hwnd
, CB_GETCOUNT
, 0, 0);
321 for (i
= 0; i
< nCount
; i
++)
323 LayoutId
= (LCID
)SendMessageW(hwnd
, CB_GETITEMDATA
, i
, 0);
324 TRACE("Layout: %08lx\n", LayoutId
);
326 if (LANGIDFROMLCID(LayoutId
) == LANGIDFROMLCID(lcid
))
328 TRACE("Found 1: %08lx --> %08lx\n", LayoutId
, lcid
);
329 SendMessageW(hwnd
, CB_SETCURSEL
, i
, 0);
334 for (i
= 0; i
< nCount
; i
++)
336 LayoutId
= (LCID
)SendMessageW(hwnd
, CB_GETITEMDATA
, i
, 0);
337 TRACE("Layout: %08lx\n", LayoutId
);
339 if (PRIMARYLANGID(LayoutId
) == PRIMARYLANGID(lcid
))
341 TRACE("Found 2: %08lx --> %08lx\n", LayoutId
, lcid
);
342 SendMessageW(hwnd
, CB_SETCURSEL
, i
, 0);
347 TRACE("No match found!\n");
353 CreateKeyboardLayoutList(
357 WCHAR szLayoutID
[9], KeyName
[MAX_PATH
];
364 lError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
365 L
"System\\CurrentControlSet\\Control\\Keyboard Layouts",
367 KEY_ENUMERATE_SUB_KEYS
,
369 if (lError
!= ERROR_SUCCESS
)
374 dwSize
= sizeof(szLayoutID
) / sizeof(WCHAR
);
376 lError
= RegEnumKeyExW(hKey
,
384 if (lError
!= ERROR_SUCCESS
)
387 GetLayoutName(szLayoutID
, KeyName
);
389 iIndex
= (INT
)SendMessageW(hItemsList
, CB_ADDSTRING
, 0, (LPARAM
)KeyName
);
391 ulLayoutID
= wcstoul(szLayoutID
, NULL
, 16);
392 SendMessageW(hItemsList
, CB_SETITEMDATA
, iIndex
, (LPARAM
)ulLayoutID
);
395 if (wcscmp(szLayoutID
, L
"00000409") == 0)
397 SendMessageW(hItemsList
, CB_SETCURSEL
, (WPARAM
)iIndex
, (LPARAM
)0);
409 InitializeDefaultUserLocale(
420 struct {LCTYPE LCType
; PWSTR pValue
;} LocaleData
[] = {
422 {LOCALE_SDECIMAL
, L
"sDecimal"},
423 {LOCALE_STHOUSAND
, L
"sThousand"},
424 {LOCALE_SNEGATIVESIGN
, L
"sNegativeSign"},
425 {LOCALE_SPOSITIVESIGN
, L
"sPositiveSign"},
426 {LOCALE_SGROUPING
, L
"sGrouping"},
427 {LOCALE_SLIST
, L
"sList"},
428 {LOCALE_SNATIVEDIGITS
, L
"sNativeDigits"},
429 {LOCALE_INEGNUMBER
, L
"iNegNumber"},
430 {LOCALE_IDIGITS
, L
"iDigits"},
431 {LOCALE_ILZERO
, L
"iLZero"},
432 {LOCALE_IMEASURE
, L
"iMeasure"},
433 {LOCALE_IDIGITSUBSTITUTION
, L
"NumShape"},
436 {LOCALE_SCURRENCY
, L
"sCurrency"},
437 {LOCALE_SMONDECIMALSEP
, L
"sMonDecimalSep"},
438 {LOCALE_SMONTHOUSANDSEP
, L
"sMonThousandSep"},
439 {LOCALE_SMONGROUPING
, L
"sMonGrouping"},
440 {LOCALE_ICURRENCY
, L
"iCurrency"},
441 {LOCALE_INEGCURR
, L
"iNegCurr"},
442 {LOCALE_ICURRDIGITS
, L
"iCurrDigits"},
445 {LOCALE_STIMEFORMAT
, L
"sTimeFormat"},
446 {LOCALE_STIME
, L
"sTime"},
447 {LOCALE_S1159
, L
"s1159"},
448 {LOCALE_S2359
, L
"s2359"},
449 {LOCALE_ITIME
, L
"iTime"},
450 {LOCALE_ITIMEMARKPOSN
, L
"iTimePrefix"},
451 {LOCALE_ITLZERO
, L
"iTLZero"},
454 {LOCALE_SLONGDATE
, L
"sLongDate"},
455 {LOCALE_SSHORTDATE
, L
"sShortDate"},
456 {LOCALE_SDATE
, L
"sDate"},
457 {LOCALE_IFIRSTDAYOFWEEK
, L
"iFirstDayOfWeek"},
458 {LOCALE_IFIRSTWEEKOFYEAR
, L
"iFirstWeekOfYear"},
459 {LOCALE_IDATE
, L
"iDate"},
460 {LOCALE_ICALENDARTYPE
, L
"iCalendarType"},
463 {LOCALE_SCOUNTRY
, L
"sCountry"},
464 {LOCALE_SLANGUAGE
, L
"sLanguage"},
465 {LOCALE_ICOUNTRY
, L
"iCountry"},
468 ret
= RegOpenKeyExW(HKEY_USERS
,
469 L
".DEFAULT\\Control Panel\\International",
471 KEY_READ
| KEY_WRITE
,
473 if (ret
!= ERROR_SUCCESS
)
478 if (pNewLcid
== NULL
)
480 dwSize
= 9 * sizeof(WCHAR
);
481 ret
= RegQueryValueExW(hLocaleKey
,
487 if (ret
!= ERROR_SUCCESS
)
490 lcid
= (LCID
)wcstoul(szBuffer
, &ptr
, 16);
498 swprintf(szBuffer
, L
"%08lx", lcid
);
499 RegSetValueExW(hLocaleKey
,
504 (wcslen(szBuffer
) + 1) * sizeof(WCHAR
));
508 while (LocaleData
[i
].pValue
!= NULL
)
510 if (GetLocaleInfo(lcid
,
511 LocaleData
[i
].LCType
| LOCALE_NOUSEROVERRIDE
,
513 sizeof(szBuffer
) / sizeof(WCHAR
)))
515 RegSetValueExW(hLocaleKey
,
516 LocaleData
[i
].pValue
,
520 (wcslen(szBuffer
) + 1) * sizeof(WCHAR
));
527 RegCloseKey(hLocaleKey
);
532 CenterWindow(HWND hWnd
)
538 hWndParent
= GetParent(hWnd
);
539 if (hWndParent
== NULL
)
540 hWndParent
= GetDesktopWindow();
542 GetWindowRect(hWndParent
, &rcParent
);
543 GetWindowRect(hWnd
, &rcWindow
);
547 ((rcParent
.right
- rcParent
.left
) - (rcWindow
.right
- rcWindow
.left
)) / 2,
548 ((rcParent
.bottom
- rcParent
.top
) - (rcWindow
.bottom
- rcWindow
.top
)) / 2,
558 LPDRAWITEMSTRUCT lpDrawItem
,
565 if (lpDrawItem
->CtlID
== uCtlID
)
567 /* position image in centre of dialog */
568 left
= (lpDrawItem
->rcItem
.right
- pState
->ImageInfo
.cxSource
) / 2;
570 hdcMem
= CreateCompatibleDC(lpDrawItem
->hDC
);
573 SelectObject(hdcMem
, pState
->ImageInfo
.hBitmap
);
574 BitBlt(lpDrawItem
->hDC
,
576 lpDrawItem
->rcItem
.top
,
577 lpDrawItem
->rcItem
.right
- lpDrawItem
->rcItem
.left
,
578 lpDrawItem
->rcItem
.bottom
- lpDrawItem
->rcItem
.top
,
600 /* Retrieve pointer to the state */
601 pState
= (PSTATE
)GetWindowLongPtr (hwndDlg
, GWL_USERDATA
);
606 /* Save pointer to the global state */
607 pState
= (PSTATE
)lParam
;
608 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pState
);
610 /* Center the dialog window */
611 CenterWindow (hwndDlg
);
613 CreateLanguagesList(GetDlgItem(hwndDlg
, IDC_LANGUAGELIST
));
614 CreateKeyboardLayoutList(GetDlgItem(hwndDlg
, IDC_LAYOUTLIST
));
616 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
620 OnDrawItem((LPDRAWITEMSTRUCT
)lParam
,
626 switch (LOWORD(wParam
))
628 case IDC_LANGUAGELIST
:
629 if (HIWORD(wParam
) == CBN_SELCHANGE
)
634 iCurSel
= SendDlgItemMessageW(hwndDlg
,
639 if (iCurSel
== CB_ERR
)
642 NewLcid
= SendDlgItemMessageW(hwndDlg
,
647 if (NewLcid
== (LCID
)CB_ERR
)
650 TRACE("LCID: 0x%08lx\n", NewLcid
);
651 SelectKeyboardForLanguage(GetDlgItem(hwndDlg
, IDC_LAYOUTLIST
),
657 if (HIWORD(wParam
) == BN_CLICKED
)
662 iCurSel
= SendDlgItemMessageW(hwndDlg
,
667 if (iCurSel
== CB_ERR
)
670 NewLcid
= SendDlgItemMessageW(hwndDlg
,
675 if (NewLcid
== (LCID
)CB_ERR
)
678 NtSetDefaultLocale(TRUE
, NewLcid
);
679 InitializeDefaultUserLocale(&NewLcid
);
681 SetKeyboardLayout(GetDlgItem(hwndDlg
, IDC_LAYOUTLIST
));
683 pState
->NextPage
= STARTPAGE
;
684 EndDialog(hwndDlg
, 0);
712 /* Retrieve pointer to the state */
713 pState
= (PSTATE
)GetWindowLongPtr (hwndDlg
, GWL_USERDATA
);
718 /* Save pointer to the state */
719 pState
= (PSTATE
)lParam
;
720 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pState
);
722 /* Center the dialog window */
723 CenterWindow(hwndDlg
);
725 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
729 OnDrawItem((LPDRAWITEMSTRUCT
)lParam
,
735 if (HIWORD(wParam
) == BN_CLICKED
)
737 switch (LOWORD(wParam
))
740 pState
->NextPage
= DONE
;
742 EndDialog(hwndDlg
, 0);
746 pState
->NextPage
= DONE
;
747 pState
->Run
= INSTALLER
;
748 EndDialog(hwndDlg
, 0);
752 pState
->NextPage
= LOCALEPAGE
;
753 EndDialog(hwndDlg
, 0);
774 InitImageInfo(&pState
->ImageInfo
);
776 while (pState
->NextPage
!= DONE
)
778 switch (pState
->NextPage
)
781 DialogBoxParam(hInstance
,
782 MAKEINTRESOURCE(IDD_LOCALEPAGE
),
789 DialogBoxParam(hInstance
,
790 MAKEINTRESOURCE(IDD_STARTPAGE
),
801 DeleteObject(pState
->ImageInfo
.hBitmap
);