Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Userinit Logon Application * FILE: base/system/userinit/livecd.c * PROGRAMMERS: Eric Kohl */
#include "userinit.h"
HWND hList;HWND hLocaleList;BOOL bSpain = FALSE;
typedef struct _LIVECD_UNATTEND{ BOOL bEnabled; LCID LocaleID;} LIVECD_UNATTEND;
/* * Taken and adapted from dll/cpl/sysdm/general.c */static VOIDInitLogo(PIMGINFO pImgInfo, HWND hwndDlg){ BITMAP logoBitmap; BITMAP maskBitmap; BITMAPINFO bmpi; HDC hDC, hDCLogo, hDCMask; HBITMAP hMask = NULL, hLogo = NULL; HBITMAP hAlphaLogo = NULL; COLORREF *pBits; INT line, column;
hDC = GetDC(hwndDlg); hDCLogo = CreateCompatibleDC(NULL); hDCMask = CreateCompatibleDC(NULL);
if (hDC == NULL || hDCLogo == NULL || hDCMask == NULL) goto Cleanup;
ZeroMemory(pImgInfo, sizeof(*pImgInfo)); ZeroMemory(&bmpi, sizeof(bmpi));
hLogo = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); hMask = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_ROSMASK), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
if (hLogo == NULL || hMask == NULL) goto Cleanup;
GetObject(hLogo, sizeof(logoBitmap), &logoBitmap); GetObject(hMask, sizeof(maskBitmap), &maskBitmap);
if (logoBitmap.bmHeight != maskBitmap.bmHeight || logoBitmap.bmWidth != maskBitmap.bmWidth) goto Cleanup;
bmpi.bmiHeader.biSize = sizeof(BITMAPINFO); bmpi.bmiHeader.biWidth = logoBitmap.bmWidth; bmpi.bmiHeader.biHeight = logoBitmap.bmHeight; bmpi.bmiHeader.biPlanes = 1; bmpi.bmiHeader.biBitCount = 32; bmpi.bmiHeader.biCompression = BI_RGB; bmpi.bmiHeader.biSizeImage = 4 * logoBitmap.bmWidth * logoBitmap.bmHeight;
/* Create a premultiplied bitmap */ hAlphaLogo = CreateDIBSection(hDC, &bmpi, DIB_RGB_COLORS, (PVOID*)&pBits, 0, 0); if (!hAlphaLogo) goto Cleanup;
SelectObject(hDCLogo, hLogo); SelectObject(hDCMask, hMask);
for (line = logoBitmap.bmHeight - 1; line >= 0; line--) { for (column = 0; column < logoBitmap.bmWidth; column++) { COLORREF alpha = GetPixel(hDCMask, column, line) & 0xFF; COLORREF Color = GetPixel(hDCLogo, column, line); DWORD r, g, b;
r = GetRValue(Color) * alpha / 255; g = GetGValue(Color) * alpha / 255; b = GetBValue(Color) * alpha / 255;
*pBits++ = b | (g << 8) | (r << 16) | (alpha << 24); } }
pImgInfo->hBitmap = hAlphaLogo; pImgInfo->cxSource = logoBitmap.bmWidth; pImgInfo->cySource = logoBitmap.bmHeight; pImgInfo->iBits = logoBitmap.bmBitsPixel; pImgInfo->iPlanes = logoBitmap.bmPlanes;
Cleanup: if (hMask != NULL) DeleteObject(hMask); if (hLogo != NULL) DeleteObject(hLogo); if (hDCMask != NULL) DeleteDC(hDCMask); if (hDCLogo != NULL) DeleteDC(hDCLogo); if (hDC != NULL) ReleaseDC(hwndDlg, hDC);}
BOOLIsLiveCD(VOID){ HKEY ControlKey = NULL; LPWSTR SystemStartOptions = NULL; LPWSTR CurrentOption, NextOption; /* Pointers into SystemStartOptions */ LONG rc; BOOL ret = FALSE;
rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, REGSTR_PATH_CURRENT_CONTROL_SET, 0, KEY_QUERY_VALUE, &ControlKey); if (rc != ERROR_SUCCESS) { WARN("RegOpenKeyEx() failed with error %lu\n", rc); goto cleanup; }
rc = ReadRegSzKey(ControlKey, L"SystemStartOptions", &SystemStartOptions); if (rc != ERROR_SUCCESS) { WARN("ReadRegSzKey() failed with error %lu\n", rc); goto cleanup; }
/* Check for CONSOLE switch in SystemStartOptions */ CurrentOption = SystemStartOptions; while (CurrentOption) { NextOption = wcschr(CurrentOption, L' '); if (NextOption) *NextOption = L'\0'; if (_wcsicmp(CurrentOption, L"MININT") == 0) { TRACE("Found 'MININT' boot option\n"); ret = TRUE; goto cleanup; } CurrentOption = NextOption ? NextOption + 1 : NULL; }
cleanup: if (ControlKey != NULL) RegCloseKey(ControlKey); HeapFree(GetProcessHeap(), 0, SystemStartOptions);
TRACE("IsLiveCD() returning %u\n", ret); return ret;}
static BOOL CALLBACKLocalesEnumProc(LPTSTR lpLocale){ LCID lcid; WCHAR lang[255]; INT index; BOOL bNoShow = FALSE;
lcid = wcstoul(lpLocale, NULL, 16);
/* Display only languages with installed support */ if (!IsValidLocale(lcid, LCID_INSTALLED)) return TRUE;
// See http://archives.miloush.net/michkap/archive/2006/09/23/768178.html for why we handle spain differently if (lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH), SORT_DEFAULT) || lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT)) { if (bSpain == FALSE) { LoadStringW(hInstance, IDS_SPAIN, lang, ARRAYSIZE(lang)); bSpain = TRUE; } else { bNoShow = TRUE; } } else { GetLocaleInfoW(lcid, LOCALE_SLANGUAGE, lang, ARRAYSIZE(lang)); }
if (bNoShow == FALSE) { index = SendMessageW(hList, CB_ADDSTRING, 0, (LPARAM)lang);
SendMessageW(hList, CB_SETITEMDATA, index, (LPARAM)lcid); }
return TRUE;}
static VOIDCreateLanguagesList(HWND hwnd, PSTATE pState){ WCHAR langSel[255]; LCID Locale = 0;
hList = hwnd; bSpain = FALSE; EnumSystemLocalesW(LocalesEnumProc, LCID_SUPPORTED);
if (pState->Unattend->bEnabled) Locale = pState->Unattend->LocaleID;
if (!Locale) { /* Select current locale */ /* or should it be System and not user? */ Locale = GetUserDefaultLCID(); } GetLocaleInfoW(Locale, LOCALE_SLANGUAGE, langSel, ARRAYSIZE(langSel));
SendMessageW(hList, CB_SELECTSTRING, -1, (LPARAM)langSel);}
staticBOOLGetLayoutName( LPCWSTR szLCID, LPWSTR szName){ HKEY hKey; DWORD dwBufLen; WCHAR szBuf[MAX_PATH], szDispName[MAX_PATH], szIndex[MAX_PATH], szPath[MAX_PATH]; HANDLE hLib; UINT i, j, k;
wsprintf(szBuf, L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s", szLCID);
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuf, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { dwBufLen = sizeof(szDispName);
if (RegQueryValueExW(hKey, L"Layout Display Name", NULL, NULL, (LPBYTE)szDispName, &dwBufLen) == ERROR_SUCCESS) { if (szDispName[0] == '@') { for (i = 0; i < wcslen(szDispName); i++) { if ((szDispName[i] == ',') && (szDispName[i + 1] == '-')) { for (j = i + 2, k = 0; j < wcslen(szDispName)+1; j++, k++) { szIndex[k] = szDispName[j]; } szDispName[i - 1] = '\0'; break; } else szDispName[i] = szDispName[i + 1]; }
if (ExpandEnvironmentStringsW(szDispName, szPath, ARRAYSIZE(szPath))) { hLib = LoadLibraryW(szPath); if (hLib) { if (LoadStringW(hLib, _wtoi(szIndex), szPath, ARRAYSIZE(szPath)) != 0) { wcscpy(szName, szPath); RegCloseKey(hKey); return TRUE; } FreeLibrary(hLib); } } } }
dwBufLen = sizeof(szBuf);
if (RegQueryValueExW(hKey, L"Layout Text", NULL, NULL, (LPBYTE)szName, &dwBufLen) == ERROR_SUCCESS) { RegCloseKey(hKey); return TRUE; } }
return FALSE;}
staticVOIDSetKeyboardLayout( HWND hwnd){ INT iCurSel; ULONG ulLayoutId; HKL hKl; WCHAR szLayoutId[9];
iCurSel = SendMessageW(hwnd, CB_GETCURSEL, 0, 0); if (iCurSel == CB_ERR) return;
ulLayoutId = (ULONG)SendMessageW(hwnd, CB_GETITEMDATA, iCurSel, 0); if (ulLayoutId == (ULONG)CB_ERR) return;
swprintf(szLayoutId, L"%08lx", ulLayoutId);
hKl = LoadKeyboardLayoutW(szLayoutId, KLF_ACTIVATE | KLF_REPLACELANG | KLF_SETFORPROCESS); SystemParametersInfoW(SPI_SETDEFAULTINPUTLANG, 0, &hKl, SPIF_SENDCHANGE);}
staticVOIDSelectKeyboardForLanguage( HWND hwnd, LCID lcid){ INT i, nCount; LCID LayoutId;
TRACE("LCID: %08lx\n", lcid); TRACE("LangID: %04lx\n", LANGIDFROMLCID(lcid));
nCount = SendMessageW(hwnd, CB_GETCOUNT, 0, 0);
for (i = 0; i < nCount; i++) { LayoutId = (LCID)SendMessageW(hwnd, CB_GETITEMDATA, i, 0); TRACE("Layout: %08lx\n", LayoutId);
if (LANGIDFROMLCID(LayoutId) == LANGIDFROMLCID(lcid)) { TRACE("Found 1: %08lx --> %08lx\n", LayoutId, lcid); SendMessageW(hwnd, CB_SETCURSEL, i, 0); return; } }
for (i = 0; i < nCount; i++) { LayoutId = (LCID)SendMessageW(hwnd, CB_GETITEMDATA, i, 0); TRACE("Layout: %08lx\n", LayoutId);
if (PRIMARYLANGID(LayoutId) == PRIMARYLANGID(lcid)) { TRACE("Found 2: %08lx --> %08lx\n", LayoutId, lcid); SendMessageW(hwnd, CB_SETCURSEL, i, 0); return; } }
TRACE("No match found!\n");}
staticVOIDCreateKeyboardLayoutList( HWND hItemsList){ HKEY hKey; WCHAR szLayoutId[9], szCurrentLayoutId[9]; WCHAR KeyName[MAX_PATH]; DWORD dwIndex = 0; DWORD dwSize; INT iIndex; LONG lError; ULONG ulLayoutId;
if (!GetKeyboardLayoutNameW(szCurrentLayoutId)) wcscpy(szCurrentLayoutId, L"00000409");
lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Keyboard Layouts", 0, KEY_ENUMERATE_SUB_KEYS, &hKey); if (lError != ERROR_SUCCESS) return;
while (TRUE) { dwSize = ARRAYSIZE(szLayoutId);
lError = RegEnumKeyExW(hKey, dwIndex, szLayoutId, &dwSize, NULL, NULL, NULL, NULL); if (lError != ERROR_SUCCESS) break;
GetLayoutName(szLayoutId, KeyName);
iIndex = (INT)SendMessageW(hItemsList, CB_ADDSTRING, 0, (LPARAM)KeyName);
ulLayoutId = wcstoul(szLayoutId, NULL, 16); SendMessageW(hItemsList, CB_SETITEMDATA, iIndex, (LPARAM)ulLayoutId);
if (wcscmp(szLayoutId, szCurrentLayoutId) == 0) { SendMessageW(hItemsList, CB_SETCURSEL, (WPARAM)iIndex, (LPARAM)0); }
dwIndex++; }
RegCloseKey(hKey);}
staticVOIDInitializeDefaultUserLocale( PLCID pNewLcid){ WCHAR szBuffer[80]; PWSTR ptr; HKEY hLocaleKey; DWORD ret; DWORD dwSize; LCID lcid; INT i;
struct {LCTYPE LCType; PWSTR pValue;} LocaleData[] = { /* Number */ {LOCALE_SDECIMAL, L"sDecimal"}, {LOCALE_STHOUSAND, L"sThousand"}, {LOCALE_SNEGATIVESIGN, L"sNegativeSign"}, {LOCALE_SPOSITIVESIGN, L"sPositiveSign"}, {LOCALE_SGROUPING, L"sGrouping"}, {LOCALE_SLIST, L"sList"}, {LOCALE_SNATIVEDIGITS, L"sNativeDigits"}, {LOCALE_INEGNUMBER, L"iNegNumber"}, {LOCALE_IDIGITS, L"iDigits"}, {LOCALE_ILZERO, L"iLZero"}, {LOCALE_IMEASURE, L"iMeasure"}, {LOCALE_IDIGITSUBSTITUTION, L"NumShape"},
/* Currency */ {LOCALE_SCURRENCY, L"sCurrency"}, {LOCALE_SMONDECIMALSEP, L"sMonDecimalSep"}, {LOCALE_SMONTHOUSANDSEP, L"sMonThousandSep"}, {LOCALE_SMONGROUPING, L"sMonGrouping"}, {LOCALE_ICURRENCY, L"iCurrency"}, {LOCALE_INEGCURR, L"iNegCurr"}, {LOCALE_ICURRDIGITS, L"iCurrDigits"},
/* Time */ {LOCALE_STIMEFORMAT, L"sTimeFormat"}, {LOCALE_STIME, L"sTime"}, {LOCALE_S1159, L"s1159"}, {LOCALE_S2359, L"s2359"}, {LOCALE_ITIME, L"iTime"}, {LOCALE_ITIMEMARKPOSN, L"iTimePrefix"}, {LOCALE_ITLZERO, L"iTLZero"},
/* Date */ {LOCALE_SLONGDATE, L"sLongDate"}, {LOCALE_SSHORTDATE, L"sShortDate"}, {LOCALE_SDATE, L"sDate"}, {LOCALE_IFIRSTDAYOFWEEK, L"iFirstDayOfWeek"}, {LOCALE_IFIRSTWEEKOFYEAR, L"iFirstWeekOfYear"}, {LOCALE_IDATE, L"iDate"}, {LOCALE_ICALENDARTYPE, L"iCalendarType"},
/* Misc */ {LOCALE_SCOUNTRY, L"sCountry"}, {LOCALE_SABBREVLANGNAME, L"sLanguage"}, {LOCALE_ICOUNTRY, L"iCountry"}, {0, NULL}};
ret = RegOpenKeyExW(HKEY_USERS, L".DEFAULT\\Control Panel\\International", 0, KEY_READ | KEY_WRITE, &hLocaleKey); if (ret != ERROR_SUCCESS) { return; }
if (pNewLcid == NULL) { dwSize = 9 * sizeof(WCHAR); ret = RegQueryValueExW(hLocaleKey, L"Locale", NULL, NULL, (PBYTE)szBuffer, &dwSize); if (ret != ERROR_SUCCESS) goto done;
lcid = (LCID)wcstoul(szBuffer, &ptr, 16); if (lcid == 0) goto done; } else { lcid = *pNewLcid;
swprintf(szBuffer, L"%08lx", lcid); RegSetValueExW(hLocaleKey, L"Locale", 0, REG_SZ, (PBYTE)szBuffer, (wcslen(szBuffer) + 1) * sizeof(WCHAR)); }
i = 0; while (LocaleData[i].pValue != NULL) { if (GetLocaleInfoW(lcid, LocaleData[i].LCType | LOCALE_NOUSEROVERRIDE, szBuffer, ARRAYSIZE(szBuffer))) { RegSetValueExW(hLocaleKey, LocaleData[i].pValue, 0, REG_SZ, (PBYTE)szBuffer, (wcslen(szBuffer) + 1) * sizeof(WCHAR)); }
i++; }
done: RegCloseKey(hLocaleKey);}
VOIDCenterWindow(HWND hWnd){ HWND hWndParent; RECT rcParent; RECT rcWindow;
hWndParent = GetParent(hWnd); if (hWndParent == NULL) hWndParent = GetDesktopWindow();
GetWindowRect(hWndParent, &rcParent); GetWindowRect(hWnd, &rcWindow);
SetWindowPos(hWnd, HWND_TOP, ((rcParent.right - rcParent.left) - (rcWindow.right - rcWindow.left)) / 2, ((rcParent.bottom - rcParent.top) - (rcWindow.bottom - rcWindow.top)) / 2, 0, 0, SWP_NOSIZE);}
staticVOIDOnDrawItem( LPDRAWITEMSTRUCT lpDrawItem, PSTATE pState, UINT uCtlID){ HDC hdcMem; LONG left;
if (lpDrawItem->CtlID == uCtlID) { /* Position image in centre of dialog */ left = (lpDrawItem->rcItem.right - pState->ImageInfo.cxSource) / 2;
hdcMem = CreateCompatibleDC(lpDrawItem->hDC); if (hdcMem != NULL) { static BLENDFUNCTION BlendFunc = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
SelectObject(hdcMem, pState->ImageInfo.hBitmap); GdiAlphaBlend(lpDrawItem->hDC, left, lpDrawItem->rcItem.top, pState->ImageInfo.cxSource, pState->ImageInfo.cySource, hdcMem, 0, 0, pState->ImageInfo.cxSource, pState->ImageInfo.cySource, BlendFunc); DeleteDC(hdcMem); } }}
staticINT_PTRCALLBACKLocaleDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PSTATE pState;
/* Retrieve pointer to the state */ pState = (PSTATE)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the state */ pState = (PSTATE)lParam; SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pState);
/* Center the dialog window */ CenterWindow(hwndDlg);
/* Fill the language and keyboard layout lists */ CreateLanguagesList(GetDlgItem(hwndDlg, IDC_LANGUAGELIST), pState); CreateKeyboardLayoutList(GetDlgItem(hwndDlg, IDC_LAYOUTLIST)); if (pState->Unattend->bEnabled) { /* Advance to the next page */ PostMessageW(hwndDlg, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), 0L); } return FALSE;
case WM_DRAWITEM: OnDrawItem((LPDRAWITEMSTRUCT)lParam, pState, IDC_LOCALELOGO); return TRUE;
case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_LANGUAGELIST: if (HIWORD(wParam) == CBN_SELCHANGE) { LCID NewLcid; INT iCurSel;
iCurSel = SendDlgItemMessageW(hwndDlg, IDC_LANGUAGELIST, CB_GETCURSEL, 0, 0); if (iCurSel == CB_ERR) break;
NewLcid = SendDlgItemMessageW(hwndDlg, IDC_LANGUAGELIST, CB_GETITEMDATA, iCurSel, 0); if (NewLcid == (LCID)CB_ERR) break;
TRACE("LCID: 0x%08lx\n", NewLcid); SelectKeyboardForLanguage(GetDlgItem(hwndDlg, IDC_LAYOUTLIST), NewLcid); } break;
case IDOK: if (HIWORD(wParam) == BN_CLICKED) { LCID NewLcid; INT iCurSel;
iCurSel = SendDlgItemMessageW(hwndDlg, IDC_LANGUAGELIST, CB_GETCURSEL, 0, 0); if (iCurSel == CB_ERR) break;
NewLcid = SendDlgItemMessageW(hwndDlg, IDC_LANGUAGELIST, CB_GETITEMDATA, iCurSel, 0); if (NewLcid == (LCID)CB_ERR) break;
/* Set the locale for the current thread */ NtSetDefaultLocale(TRUE, NewLcid);
/* Store the locale settings in the registry */ InitializeDefaultUserLocale(&NewLcid);
/* Set UI language for this thread */ SetThreadLocale(NewLcid);
SetKeyboardLayout(GetDlgItem(hwndDlg, IDC_LAYOUTLIST));
pState->NextPage = STARTPAGE; EndDialog(hwndDlg, LOWORD(wParam)); } break;
case IDCANCEL: if (HIWORD(wParam) == BN_CLICKED) { static WCHAR szMsg[RC_STRING_MAX_SIZE]; INT ret; LoadStringW(GetModuleHandle(NULL), IDS_CANCEL_CONFIRM, szMsg, ARRAYSIZE(szMsg)); ret = MessageBoxW(hwndDlg, szMsg, L"ReactOS LiveCD", MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2); if (ret == IDOK || ret == IDYES) { pState->NextPage = DONE; pState->Run = REBOOT; EndDialog(hwndDlg, LOWORD(wParam)); } } break;
default: break; } break;
default: break; }
return FALSE;}
staticINT_PTRCALLBACKStartDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PSTATE pState;
/* Retrieve pointer to the state */ pState = (PSTATE)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: { WCHAR Installer[MAX_PATH];
/* Save pointer to the state */ pState = (PSTATE)lParam; SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pState);
/* Center the dialog window */ CenterWindow(hwndDlg);
/* Check whether we can find the ReactOS installer. If not, * disable the "Install" button and directly start the LiveCD. */ *Installer = UNICODE_NULL; if (!ExpandInstallerPath(L"reactos.exe", Installer, ARRAYSIZE(Installer))) EnableWindow(GetDlgItem(hwndDlg, IDC_INSTALL), FALSE);
if (pState->Unattend->bEnabled || (*Installer == UNICODE_NULL)) { /* Click on the 'Run' button */ PostMessageW(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_RUN, BN_CLICKED), 0L); } return FALSE; }
case WM_DRAWITEM: OnDrawItem((LPDRAWITEMSTRUCT)lParam, pState, IDC_STARTLOGO); return TRUE;
case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case IDC_RUN: pState->NextPage = DONE; pState->Run = SHELL; EndDialog(hwndDlg, LOWORD(wParam)); break;
case IDC_INSTALL: pState->NextPage = DONE; pState->Run = INSTALLER; EndDialog(hwndDlg, LOWORD(wParam)); break;
case IDOK: pState->NextPage = LOCALEPAGE; EndDialog(hwndDlg, LOWORD(wParam)); break;
case IDCANCEL: if (HIWORD(wParam) == BN_CLICKED) { static WCHAR szMsg[RC_STRING_MAX_SIZE]; INT ret; LoadStringW(GetModuleHandle(NULL), IDS_CANCEL_CONFIRM, szMsg, ARRAYSIZE(szMsg)); ret = MessageBoxW(hwndDlg, szMsg, L"ReactOS LiveCD", MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2); if (ret == IDOK || ret == IDYES) { pState->NextPage = DONE; pState->Run = REBOOT; EndDialog(hwndDlg, LOWORD(wParam)); } } break;
default: break; } } break;
default: break; }
return FALSE;}
VOID ParseUnattend(LPCWSTR UnattendInf, LIVECD_UNATTEND* pUnattend){ WCHAR Buffer[MAX_PATH];
pUnattend->bEnabled = FALSE;
if (!GetPrivateProfileStringW(L"Unattend", L"Signature", L"", Buffer, _countof(Buffer), UnattendInf)) { ERR("Unable to parse Signature\n"); return; }
if (_wcsicmp(Buffer, L"$ReactOS$") && _wcsicmp(Buffer, L"$Windows NT$")) { TRACE("Unknown signature: %S\n", Buffer); return; }
if (!GetPrivateProfileStringW(L"Unattend", L"UnattendSetupEnabled", L"", Buffer, _countof(Buffer), UnattendInf)) { ERR("Unable to parse UnattendSetupEnabled\n"); return; }
if (_wcsicmp(Buffer, L"yes")) { TRACE("Unattended setup is not enabled\n", Buffer); return; }
pUnattend->bEnabled = TRUE; pUnattend->LocaleID = 0;
if (GetPrivateProfileStringW(L"Unattend", L"LocaleID", L"", Buffer, _countof(Buffer), UnattendInf) && Buffer[0]) { pUnattend->LocaleID = wcstol(Buffer, NULL, 16); }}
VOIDRunLiveCD( PSTATE pState){ LIVECD_UNATTEND Unattend = {0}; WCHAR UnattendInf[MAX_PATH];
InitLogo(&pState->ImageInfo, NULL);
GetWindowsDirectoryW(UnattendInf, _countof(UnattendInf)); wcscat(UnattendInf, L"\\unattend.inf"); ParseUnattend(UnattendInf, &Unattend); pState->Unattend = &Unattend;
while (pState->NextPage != DONE) { switch (pState->NextPage) { case LOCALEPAGE: DialogBoxParamW(hInstance, MAKEINTRESOURCEW(IDD_LOCALEPAGE), NULL, LocaleDlgProc, (LPARAM)pState); break;
case STARTPAGE: DialogBoxParamW(hInstance, MAKEINTRESOURCEW(IDD_STARTPAGE), NULL, StartDlgProc, (LPARAM)pState); break;
default: break; } }
DeleteObject(pState->ImageInfo.hBitmap);}
/* EOF */