;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\WinLogon","Shell",0x00020000,"%SystemRoot%\bin\explorer.exe"
HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\WinLogon","StartServices",0x00010001,0x00000001
HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\WinLogon","StartGUI",0x00010001,0x00000000
+HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\WinLogon","Userinit",0x00020000,"%SystemRoot%\system32\userinit.exe,"
HKCU, "Control Panel\Desktop", "CursorBlinkRate",0x00000000,"530"
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: msgina.c,v 1.5 2003/12/01 18:21:04 weiden Exp $
+/* $Id: msgina.c,v 1.6 2003/12/07 00:04:20 weiden Exp $
*
* PROJECT: ReactOS msgina.dll
* FILE: lib/msgina/msgina.c
BOOL Ret;
/* get the path of userinit */
- if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ if(RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
{
+ /* FIXME - why does this always fail??? */
VirtualFree(pEnvironment, 0, MEM_RELEASE);
return FALSE;
}
}
RegCloseKey(hKey);
- /* FIXME - execute logon script */
-
/* start userinit */
+ /* FIXME - allow to start more applications that are comma-separated */
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpTitle = L"userinit";
#define IDS_SAVEYOURSETTINGS 1687
#define IDS_REACTOSISSTARTINGUP 1690
+#define IDS_FAILEDACTIVATEUSERSHELL 1001
-/* $Id: winlogon.c,v 1.21 2003/12/01 18:21:04 weiden Exp $
+/* $Id: winlogon.c,v 1.22 2003/12/07 00:04:20 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
/* GLOBALS ******************************************************************/
BOOL
-LoadGina(PMSGINAFUNCTIONS Functions);
+LoadGina(PMSGINAFUNCTIONS Functions, DWORD *DllVersion);
BOOL
-MsGinaInit();
+MsGinaInit(DWORD Version);
HINSTANCE hAppInstance;
HWINSTA InteractiveWindowStation; /* WinSta0 */
OutputDebugString(buffer);
}
+BOOL
+CALLBACK
+ShutdownComputerProc(
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+ switch(uMsg)
+ {
+ case WM_COMMAND:
+ {
+ switch(LOWORD(wParam))
+ {
+ case IDC_BTNSHTDOWNCOMPUTER:
+ EndDialog(hwndDlg, IDC_BTNSHTDOWNCOMPUTER);
+ break;
+ }
+ break;
+ }
+ case WM_INITDIALOG:
+ {
+ RemoveMenu(GetSystemMenu(hwndDlg, FALSE), SC_CLOSE, MF_BYCOMMAND);
+ SetFocus(GetDlgItem(hwndDlg, IDC_BTNSHTDOWNCOMPUTER));
+ break;
+ }
+ }
+ return FALSE;
+}
+
static BOOLEAN StartServices(VOID)
{
HANDLE ServicesInitEvent;
return StartIt;
}
+
+/*
+static BOOL RestartShell(void)
+{
+ HANDLE WinLogonKey;
+ DWORD Type, Size, Value;
+
+ if(OpenRegistryKey(&WinLogonKey))
+ {
+ Size = sizeof(DWORD);
+ if(ERROR_SUCCESS == RegQueryValueEx(WinLogonKey,
+ L"AutoRestartShell",
+ NULL,
+ &Type,
+ (LPBYTE)&Value,
+ &Size))
+ {
+ if(Type == REG_DWORD)
+ {
+ RegCloseKey(WinLogonKey);
+ return (Value != 0);
+ }
+ }
+ RegCloseKey(WinLogonKey);
+ }
+ return FALSE;
+}
+*/
+
#if SUPPORT_CONSOLESTART
static BOOL StartIntoGUI(void)
{
LSA_OPERATIONAL_MODE Mode;
ULONG AuthenticationPackage;
#endif
+ DWORD GinaDllVersion;
HANDLE hShutdownEvent;
WCHAR StatusMsg[256];
BOOL Success;
if(!StartConsole)
{
#endif
- if(!LoadGina(&MsGinaFunctions))
+ if(!LoadGina(&MsGinaFunctions, &GinaDllVersion))
{
NtShutdownSystem(ShutdownReboot);
ExitProcess(0);
return(0);
}
- if(!MsGinaInit() || !MsGinaInst)
+ if(!MsGinaInit(GinaDllVersion) || !MsGinaInst)
{
DbgPrint("WL: Failed to initialize winlogon!\n");
NtShutdownSystem(ShutdownNoReboot);
if (! DoLoginUser(LoginName, Password))
{
}
+
+ NtShutdownSystem(ShutdownNoReboot);
+ ExitProcess(0);
}
else
{
StatusMsg);
/* FIXME */
- Sleep(250);
+ Sleep(150);
LoadString(hAppInstance, IDS_APPLYINGCOMPUTERSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
StatusMsg);
/* FIXME */
- Sleep(250);
+ Sleep(150);
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
/* FIXME - call WlxLoggedOutSAS() to display the login dialog */
- Sleep(500);
+ Sleep(250);
LoadString(hAppInstance, IDS_LOADINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
StatusMsg);
/* FIXME */
- Sleep(250);
+ Sleep(150);
LoadString(hAppInstance, IDS_APPLYINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
StatusMsg);
/* FIXME */
- Sleep(250);
+ Sleep(150);
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
- /* FIXME - call WlxActivateUserShell() which will start userinit.exe */
- DoLoginUser(LoginName, Password); /* FIXME - remove */
- DbgPrint("shell exited! finished\n");
- MessageBox(0, L"Shell exited", L"", 0);
-
+ if(!MsGinaInst->Functions->WlxActivateUserShell(MsGinaInst->Context,
+ L"WinSta0\\Default",
+ NULL,
+ NULL))
+ {
+ LoadString(hAppInstance, IDS_FAILEDACTIVATEUSERSHELL, StatusMsg, 256 * sizeof(WCHAR));
+ MessageBox(0, StatusMsg, NULL, MB_ICONERROR);
+ SetEvent(hShutdownEvent);
+ }
+
+
WaitForSingleObject(hShutdownEvent, INFINITE);
CloseHandle(hShutdownEvent);
-#if SUPPORT_CONSOLESTART
- }
-#endif
- NtShutdownSystem(ShutdownNoReboot);
+ LoadString(hAppInstance, IDS_SAVEYOURSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
+ MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
+ ApplicationDesktop,
+ 0,
+ NULL,
+ StatusMsg);
+
+ /* FIXME */
+ Sleep(150);
+ MsGinaInst->Functions->WlxShutdown(MsGinaInst->Context, WLX_SAS_ACTION_SHUTDOWN);
+
+ LoadString(hAppInstance, IDS_REACTOSISSHUTTINGDOWN, StatusMsg, 256 * sizeof(WCHAR));
+ MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
+ ApplicationDesktop,
+ 0,
+ NULL,
+ StatusMsg);
+
+ /* FIXME */
+ Sleep(250);
+
+ MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
+ MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
+
+ /* FIXME - Flush disks and registry, ... */
+
+ /* FIXME - only show this dialog if it's a shutdown and the computer doesn't support APM */
+ switch(DialogBox(hInstance, MAKEINTRESOURCE(IDD_SHUTDOWNCOMPUTER), 0, ShutdownComputerProc))
+ {
+ case IDC_BTNSHTDOWNCOMPUTER:
+ NtShutdownSystem(ShutdownReboot);
+ break;
+ default:
+ NtShutdownSystem(ShutdownNoReboot);
+ break;
+ }
ExitProcess(0);
+#if SUPPORT_CONSOLESTART
+ }
+#endif
return 0;
}
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: winlogon.h,v 1.1 2003/12/01 18:21:04 weiden Exp $
+/* $Id: winlogon.h,v 1.2 2003/12/07 00:04:20 weiden Exp $
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS winlogon
* FILE: subsys/system/winlogon/winlogon.h
PFWLXLOGGEDONSAS WlxLoggedOnSAS;
PFWLXDISPLAYLOCKEDNOTICE WlxDisplayLockedNotice;
PFWLXWKSTALOCKEDSAS WlxWkstaLockedSAS;
- PFWLXISLOCKOK WlxIsLockOK;
- PFWLXISLOGOFFOK WlxIsLogOffOK;
- PFWLXLOGOFF WlxLogOff;
+ PFWLXISLOCKOK WlxIsLockOk;
+ PFWLXISLOGOFFOK WlxIsLogoffOk;
+ PFWLXLOGOFF WlxLogoff;
PFWLXSHUTDOWN WlxShutdown;
PFWLXSCREENSAVERNOTIFY WlxScreenSaverNotify;
HANDLE hDllInstance;
PMSGINAFUNCTIONS Functions;
PVOID Context;
+ DWORD Version;
} MSGINAINSTANCE, *PMSGINAINSTANCE;
extern HINSTANCE hAppInstance;
IDI_WINLOGON ICON "resources/winlogon.ico"
IDD_SHUTDOWNCOMPUTER DIALOG 45, 22, 164, 52
-STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION |
- WS_SYSMENU
+STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Shutdown Computer"
FONT 8, "MS Shell Dlg"
BEGIN
IDS_REACTOSISSTARTINGUP "ReactOS is starting up..."
END
+STRINGTABLE
+BEGIN
+ IDS_FAILEDACTIVATEUSERSHELL "Winlogon failed to activate user shell!"
+END
+
+
-/* $Id: wlx.c,v 1.1 2003/12/01 18:21:04 weiden Exp $
+/* $Id: wlx.c,v 1.2 2003/12/07 00:04:20 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
ULONG_PTR* OldValue
)
{
+ PMSGINAINSTANCE Instance = (PMSGINAINSTANCE)hWlx;
Unimplemented;
+ if(Instance || !Value)
+ {
+ switch(Option)
+ {
+ case WLX_OPTION_USE_CTRL_ALT_DEL:
+ return TRUE;
+ case WLX_OPTION_CONTEXT_POINTER:
+ {
+ *OldValue = (ULONG_PTR)Instance->Context;
+ Instance->Context = (PVOID)Value;
+ return TRUE;
+ }
+ case WLX_OPTION_USE_SMART_CARD:
+ return FALSE;
+ }
+ }
+
return FALSE;
}
ULONG_PTR* Value
)
{
+ PMSGINAINSTANCE Instance = (PMSGINAINSTANCE)hWlx;
Unimplemented;
+ if(Instance || !Value)
+ {
+ switch(Option)
+ {
+ case WLX_OPTION_USE_CTRL_ALT_DEL:
+ return TRUE;
+ case WLX_OPTION_CONTEXT_POINTER:
+ {
+ *Value = (ULONG_PTR)Instance->Context;
+ return TRUE;
+ }
+ case WLX_OPTION_USE_SMART_CARD:
+ case WLX_OPTION_SMART_CARD_PRESENT:
+ case WLX_OPTION_SMART_CARD_INFO:
+ *Value = 0;
+ return FALSE;
+ case WLX_OPTION_DISPATCH_TABLE_SIZE:
+ {
+ switch(Instance->Version)
+ {
+ case WLX_VERSION_1_0:
+ *Value = sizeof(WLX_DISPATCH_VERSION_1_0);
+ break;
+ case WLX_VERSION_1_1:
+ *Value = sizeof(WLX_DISPATCH_VERSION_1_1);
+ break;
+ case WLX_VERSION_1_2:
+ *Value = sizeof(WLX_DISPATCH_VERSION_1_2);
+ break;
+ case WLX_VERSION_1_3:
+ *Value = sizeof(WLX_DISPATCH_VERSION_1_3);
+ break;
+ case WLX_VERSION_1_4:
+ *Value = sizeof(WLX_DISPATCH_VERSION_1_4);
+ break;
+ default:
+ return 0;
+ }
+ return TRUE;
+ }
+ }
+ }
+
return FALSE;
}
}
BOOL
-LoadGina(PMSGINAFUNCTIONS Functions)
+LoadGina(PMSGINAFUNCTIONS Functions, DWORD *DllVersion)
{
HMODULE hGina;
WCHAR GinaDll[MAX_PATH + 1];
- DWORD DllVersion = 0;
MsGinaInst = NULL;
if(Functions->WlxNegotiate)
{
- if(!Functions->WlxNegotiate(WLX_VERSION_1_3, &DllVersion))
+ if(!Functions->WlxNegotiate(WLX_VERSION_1_3, DllVersion))
{
return FALSE;
}
- /* FIXME - allow other versions */
- if(DllVersion != WLX_VERSION_1_3)
+ if(*DllVersion >= WLX_VERSION_1_0)
{
- return FALSE;
+ Functions->WlxActivateUserShell = (PFWLXACTIVATEUSERSHELL)GetProcAddress(hGina, "WlxActivateUserShell");
+ Functions->WlxDisplayLockedNotice = (PFWLXDISPLAYLOCKEDNOTICE)GetProcAddress(hGina, "WlxDisplayLockedNotice");
+ Functions->WlxDisplaySASNotice = (PFWLXDISPLAYSASNOTICE)GetProcAddress(hGina, "WlxDisplaySASNotice");
+ Functions->WlxIsLockOk = (PFWLXISLOCKOK)GetProcAddress(hGina, "WlxIsLockOk");
+ Functions->WlxIsLogoffOk = (PFWLXISLOGOFFOK)GetProcAddress(hGina, "WlxIsLogoffOk");
+ Functions->WlxLoggedOnSAS = (PFWLXLOGGEDONSAS)GetProcAddress(hGina, "WlxLoggedOnSAS");
+ Functions->WlxLoggedOutSAS = (PFWLXLOGGEDOUTSAS)GetProcAddress(hGina, "WlxLoggedOutSAS");
+ Functions->WlxLogoff = (PFWLXLOGOFF)GetProcAddress(hGina, "WlxLogoff");
+ Functions->WlxShutdown = (PFWLXSHUTDOWN)GetProcAddress(hGina, "WlxShutdown");
+ Functions->WlxWkstaLockedSAS = (PFWLXWKSTALOCKEDSAS)GetProcAddress(hGina, "WlxWkstaLockedSAS");
}
- if(DllVersion >= WLX_VERSION_1_3)
+ if(*DllVersion >= WLX_VERSION_1_1)
+ {
+ Functions->WlxScreenSaverNotify = (PFWLXSCREENSAVERNOTIFY)GetProcAddress(hGina, "WlxScreenSaverNotify");
+ Functions->WlxStartApplication = (PFWLXSTARTAPPLICATION)GetProcAddress(hGina, "WlxStartApplication");
+ }
+
+ if(*DllVersion >= WLX_VERSION_1_3)
{
- Functions->WlxNetworkProviderLoad = (PFWLXNETWORKPROVIDERLOAD)GetProcAddress(hGina, "WlxNetworkProviderLoad");
Functions->WlxDisplayStatusMessage = (PFWLXDISPLAYSTATUSMESSAGE)GetProcAddress(hGina, "WlxDisplayStatusMessage");
Functions->WlxGetStatusMessage = (PFWLXGETSTATUSMESSAGE)GetProcAddress(hGina, "WlxGetStatusMessage");
+ Functions->WlxNetworkProviderLoad = (PFWLXNETWORKPROVIDERLOAD)GetProcAddress(hGina, "WlxNetworkProviderLoad");
Functions->WlxRemoveStatusMessage = (PFWLXREMOVESTATUSMESSAGE)GetProcAddress(hGina, "WlxRemoveStatusMessage");
}
+
+ if(*DllVersion >= WLX_VERSION_1_4)
+ {
+
+ }
}
return (Functions->WlxNegotiate != NULL) && (Functions->WlxInitialize != NULL);
}
BOOL
-MsGinaInit()
+MsGinaInit(DWORD Version)
{
PMSGINAINSTANCE Instance;
Instance->Functions = &MsGinaFunctions;
Instance->hDllInstance = NULL; /* FIXME */
Instance->Context = NULL;
+ Instance->Version = Version;
MsGinaInst = Instance;