mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 17:12:57 +00:00
some work on winlogon
svn path=/trunk/; revision=6841
This commit is contained in:
parent
695f82be0d
commit
e4b1dac7b7
16 changed files with 1314 additions and 130 deletions
|
@ -6,6 +6,7 @@ Signature="$ReactOS$
|
||||||
HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\WinLogon","Shell",0x00020000,"%SystemRoot%\System32\cmd.exe"
|
HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\WinLogon","Shell",0x00020000,"%SystemRoot%\System32\cmd.exe"
|
||||||
;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\WinLogon","Shell",0x00020000,"%SystemRoot%\bin\explorer.exe"
|
;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","StartServices",0x00010001,0x00000001
|
||||||
|
HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\WinLogon","StartGUI",0x00010001,0x00000000
|
||||||
|
|
||||||
HKCU, "Control Panel\Desktop", "CursorBlinkRate",0x00000000,"530"
|
HKCU, "Control Panel\Desktop", "CursorBlinkRate",0x00000000,"530"
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $Id: Makefile,v 1.4 2003/11/24 19:04:23 weiden Exp $
|
# $Id: Makefile,v 1.5 2003/12/01 18:21:04 weiden Exp $
|
||||||
|
|
||||||
PATH_TO_TOP = ../..
|
PATH_TO_TOP = ../..
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ TARGET_CFLAGS = \
|
||||||
|
|
||||||
TARGET_LFLAGS = -nostartfiles -nostdlib
|
TARGET_LFLAGS = -nostartfiles -nostdlib
|
||||||
|
|
||||||
TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a
|
TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a user32.a
|
||||||
|
|
||||||
TARGET_GCCLIBS = gcc
|
TARGET_GCCLIBS = gcc
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: msgina.c,v 1.4 2003/11/24 19:04:23 weiden Exp $
|
/* $Id: msgina.c,v 1.5 2003/12/01 18:21:04 weiden Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS msgina.dll
|
* PROJECT: ReactOS msgina.dll
|
||||||
* FILE: lib/msgina/msgina.c
|
* FILE: lib/msgina/msgina.c
|
||||||
|
@ -28,9 +28,57 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <WinWlx.h>
|
#include <WinWlx.h>
|
||||||
#include "msgina.h"
|
#include "msgina.h"
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
extern HINSTANCE hDllInstance;
|
extern HINSTANCE hDllInstance;
|
||||||
|
|
||||||
|
typedef struct _DISPLAYSTATUSMSG
|
||||||
|
{
|
||||||
|
PGINA_CONTEXT Context;
|
||||||
|
HDESK hDesktop;
|
||||||
|
DWORD dwOptions;
|
||||||
|
PWSTR pTitle;
|
||||||
|
PWSTR pMessage;
|
||||||
|
HANDLE StartupEvent;
|
||||||
|
} DISPLAYSTATUSMSG, *PDISPLAYSTATUSMSG;
|
||||||
|
|
||||||
|
BOOL CALLBACK
|
||||||
|
LoggedOnDlgProc(
|
||||||
|
HWND hwndDlg,
|
||||||
|
UINT uMsg,
|
||||||
|
WPARAM wParam,
|
||||||
|
LPARAM lParam
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch(uMsg)
|
||||||
|
{
|
||||||
|
case WM_COMMAND:
|
||||||
|
{
|
||||||
|
switch(LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case IDYES:
|
||||||
|
case IDNO:
|
||||||
|
{
|
||||||
|
EndDialog(hwndDlg, LOWORD(wParam));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
{
|
||||||
|
SetFocus(GetDlgItem(hwndDlg, IDNO));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_CLOSE:
|
||||||
|
{
|
||||||
|
EndDialog(hwndDlg, IDNO);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
|
@ -80,6 +128,9 @@ WlxInitialize(
|
||||||
/* save window station */
|
/* save window station */
|
||||||
pgContext->station = lpWinsta;
|
pgContext->station = lpWinsta;
|
||||||
|
|
||||||
|
/* clear status window handle */
|
||||||
|
pgContext->hStatusWindow = 0;
|
||||||
|
|
||||||
/* notify winlogon that we will use the default SAS */
|
/* notify winlogon that we will use the default SAS */
|
||||||
pgContext->pWlxFuncs->WlxUseCtrlAltDel(hWlx);
|
pgContext->pWlxFuncs->WlxUseCtrlAltDel(hWlx);
|
||||||
|
|
||||||
|
@ -128,6 +179,7 @@ WlxStartApplication(
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -138,7 +190,7 @@ WlxActivateUserShell(
|
||||||
PWSTR pszMprLogonScript,
|
PWSTR pszMprLogonScript,
|
||||||
PVOID pEnvironment)
|
PVOID pEnvironment)
|
||||||
{
|
{
|
||||||
PGINA_CONTEXT pgContext = (PGINA_CONTEXT) pWlxContext;
|
PGINA_CONTEXT pgContext = (PGINA_CONTEXT)pWlxContext;
|
||||||
STARTUPINFO si;
|
STARTUPINFO si;
|
||||||
PROCESS_INFORMATION pi;
|
PROCESS_INFORMATION pi;
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
|
@ -151,6 +203,7 @@ WlxActivateUserShell(
|
||||||
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
|
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
|
||||||
0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
|
0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
|
VirtualFree(pEnvironment, 0, MEM_RELEASE);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
BufSize = MAX_PATH * sizeof(WCHAR);
|
BufSize = MAX_PATH * sizeof(WCHAR);
|
||||||
|
@ -158,15 +211,18 @@ WlxActivateUserShell(
|
||||||
&BufSize) != ERROR_SUCCESS) || (ValueType != REG_SZ))
|
&BufSize) != ERROR_SUCCESS) || (ValueType != REG_SZ))
|
||||||
{
|
{
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
|
VirtualFree(pEnvironment, 0, MEM_RELEASE);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
|
|
||||||
/* execute userinit */
|
/* FIXME - execute logon script */
|
||||||
|
|
||||||
|
/* start userinit */
|
||||||
si.cb = sizeof(STARTUPINFO);
|
si.cb = sizeof(STARTUPINFO);
|
||||||
si.lpReserved = NULL;
|
si.lpReserved = NULL;
|
||||||
si.lpTitle = L"userinit";
|
si.lpTitle = L"userinit";
|
||||||
si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
|
si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0;
|
||||||
si.dwFlags = 0;
|
si.dwFlags = 0;
|
||||||
si.wShowWindow = SW_SHOW;
|
si.wShowWindow = SW_SHOW;
|
||||||
si.lpReserved2 = NULL;
|
si.lpReserved2 = NULL;
|
||||||
|
@ -190,6 +246,204 @@ WlxActivateUserShell(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxLoggedOnSAS(
|
||||||
|
PVOID pWlxContext,
|
||||||
|
DWORD dwSasType,
|
||||||
|
PVOID pReserved)
|
||||||
|
{
|
||||||
|
PGINA_CONTEXT pgContext = (PGINA_CONTEXT)pWlxContext;
|
||||||
|
int SasAction = WLX_SAS_ACTION_NONE;
|
||||||
|
|
||||||
|
switch(dwSasType)
|
||||||
|
{
|
||||||
|
case WLX_SAS_TYPE_CTRL_ALT_DEL:
|
||||||
|
{
|
||||||
|
int Result;
|
||||||
|
/* display "Are you sure you want to log off?" dialog */
|
||||||
|
Result = pgContext->pWlxFuncs->WlxDialogBoxParam(pgContext->hWlx,
|
||||||
|
pgContext->hDllInstance,
|
||||||
|
(LPTSTR)IDD_LOGOFF_DLG,
|
||||||
|
NULL,
|
||||||
|
LoggedOnDlgProc,
|
||||||
|
(LPARAM)pgContext);
|
||||||
|
if(Result == IDOK)
|
||||||
|
{
|
||||||
|
SasAction = WLX_SAS_ACTION_LOCK_WKSTA;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WLX_SAS_TYPE_SC_INSERT:
|
||||||
|
{
|
||||||
|
DbgPrint("WlxLoggedOnSAS: SasType WLX_SAS_TYPE_SC_INSERT not supported!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WLX_SAS_TYPE_SC_REMOVE:
|
||||||
|
{
|
||||||
|
DbgPrint("WlxLoggedOnSAS: SasType WLX_SAS_TYPE_SC_REMOVE not supported!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WLX_SAS_TYPE_TIMEOUT:
|
||||||
|
{
|
||||||
|
DbgPrint("WlxLoggedOnSAS: SasType WLX_SAS_TYPE_TIMEOUT not supported!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
DbgPrint("WlxLoggedOnSAS: Unknown SasType: 0x%x\n", dwSasType);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return SasAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
CALLBACK
|
||||||
|
StatusMessageWindowProc(
|
||||||
|
HWND hwndDlg,
|
||||||
|
UINT uMsg,
|
||||||
|
WPARAM wParam,
|
||||||
|
LPARAM lParam
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch(uMsg)
|
||||||
|
{
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
{
|
||||||
|
PDISPLAYSTATUSMSG msg = (PDISPLAYSTATUSMSG)lParam;
|
||||||
|
if(!msg)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
msg->Context->hStatusWindow = hwndDlg;
|
||||||
|
|
||||||
|
if(msg->pTitle)
|
||||||
|
SetWindowText(hwndDlg, msg->pTitle);
|
||||||
|
SetDlgItemText(hwndDlg, IDC_STATUSLABEL, msg->pMessage);
|
||||||
|
if(!msg->Context->SignaledStatusWindowCreated)
|
||||||
|
{
|
||||||
|
msg->Context->SignaledStatusWindowCreated = TRUE;
|
||||||
|
SetEvent(msg->StartupEvent);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD WINAPI
|
||||||
|
StartupWindowThread(LPVOID lpParam)
|
||||||
|
{
|
||||||
|
HDESK OldDesk;
|
||||||
|
PDISPLAYSTATUSMSG msg = (PDISPLAYSTATUSMSG)lpParam;
|
||||||
|
|
||||||
|
OldDesk = GetThreadDesktop(GetCurrentThreadId());
|
||||||
|
|
||||||
|
if(!SetThreadDesktop(msg->hDesktop))
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, lpParam);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
DialogBoxParam(hDllInstance,
|
||||||
|
MAKEINTRESOURCE(IDD_STATUSWINDOW),
|
||||||
|
0,
|
||||||
|
StatusMessageWindowProc,
|
||||||
|
(LPARAM)lpParam);
|
||||||
|
SetThreadDesktop(OldDesk);
|
||||||
|
|
||||||
|
msg->Context->hStatusWindow = 0;
|
||||||
|
msg->Context->SignaledStatusWindowCreated = FALSE;
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, lpParam);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxDisplayStatusMessage(
|
||||||
|
PVOID pWlxContext,
|
||||||
|
HDESK hDesktop,
|
||||||
|
DWORD dwOptions,
|
||||||
|
PWSTR pTitle,
|
||||||
|
PWSTR pMessage)
|
||||||
|
{
|
||||||
|
PDISPLAYSTATUSMSG msg;
|
||||||
|
HANDLE Thread;
|
||||||
|
DWORD ThreadId;
|
||||||
|
PGINA_CONTEXT pgContext = (PGINA_CONTEXT)pWlxContext;
|
||||||
|
|
||||||
|
if(!pgContext->hStatusWindow)
|
||||||
|
{
|
||||||
|
msg = (PDISPLAYSTATUSMSG)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DISPLAYSTATUSMSG));
|
||||||
|
if(!msg)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
msg->Context = pgContext;
|
||||||
|
msg->dwOptions = dwOptions;
|
||||||
|
msg->pTitle = pTitle;
|
||||||
|
msg->pMessage = pMessage;
|
||||||
|
msg->hDesktop = hDesktop;
|
||||||
|
|
||||||
|
msg->StartupEvent = CreateEvent(NULL,
|
||||||
|
TRUE,
|
||||||
|
FALSE,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if(!msg->StartupEvent)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
Thread = CreateThread(NULL,
|
||||||
|
0,
|
||||||
|
StartupWindowThread,
|
||||||
|
(PVOID)msg,
|
||||||
|
0,
|
||||||
|
&ThreadId);
|
||||||
|
if(Thread)
|
||||||
|
{
|
||||||
|
CloseHandle(Thread);
|
||||||
|
WaitForSingleObject(msg->StartupEvent, INFINITE);
|
||||||
|
CloseHandle(msg->StartupEvent);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pTitle)
|
||||||
|
SetWindowText(pgContext->hStatusWindow, pTitle);
|
||||||
|
|
||||||
|
SetDlgItemText(pgContext->hStatusWindow, IDC_STATUSLABEL, pMessage);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxRemoveStatusMessage(
|
||||||
|
PVOID pWlxContext)
|
||||||
|
{
|
||||||
|
PGINA_CONTEXT pgContext = (PGINA_CONTEXT)pWlxContext;
|
||||||
|
if(pgContext->hStatusWindow)
|
||||||
|
{
|
||||||
|
EndDialog(pgContext->hStatusWindow, 0);
|
||||||
|
pgContext->hStatusWindow = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOL STDCALL
|
BOOL STDCALL
|
||||||
DllMain(
|
DllMain(
|
||||||
HINSTANCE hinstDLL,
|
HINSTANCE hinstDLL,
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef __MSGINA_H
|
#ifndef __MSGINA_H
|
||||||
#define __MSGINA_H
|
#define __MSGINA_H
|
||||||
|
|
||||||
#define GINA_VERSION (WLX_VERSION_1_0)
|
#define GINA_VERSION (WLX_VERSION_1_3)
|
||||||
|
|
||||||
#define PWLX_DISPATCH_VERSION PWLX_DISPATCH_VERSION_1_0
|
#define PWLX_DISPATCH_VERSION PWLX_DISPATCH_VERSION_1_3
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
HANDLE hWlx;
|
HANDLE hWlx;
|
||||||
|
@ -11,6 +11,8 @@ typedef struct {
|
||||||
PWLX_DISPATCH_VERSION pWlxFuncs;
|
PWLX_DISPATCH_VERSION pWlxFuncs;
|
||||||
HANDLE hDllInstance;
|
HANDLE hDllInstance;
|
||||||
HANDLE UserToken;
|
HANDLE UserToken;
|
||||||
|
HWND hStatusWindow;
|
||||||
|
BOOL SignaledStatusWindowCreated;
|
||||||
} GINA_CONTEXT, *PGINA_CONTEXT;
|
} GINA_CONTEXT, *PGINA_CONTEXT;
|
||||||
|
|
||||||
HINSTANCE hDllInstance;
|
HINSTANCE hDllInstance;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <reactos/resource.h>
|
#include <reactos/resource.h>
|
||||||
#include <defines.h>
|
#include <defines.h>
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
|
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
|
||||||
|
|
||||||
|
@ -36,4 +37,26 @@ BEGIN
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDI_LOGOFFICON ICON "resources/ico_logoff.ico"
|
||||||
|
|
||||||
|
IDD_LOGOFF_DLG DIALOG 0, 0, 188, 60
|
||||||
|
STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Log Off ReactOS"
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
FONT 8, "MS Sans Serif"
|
||||||
|
{
|
||||||
|
ICON IDI_LOGOFFICON, IDC_LOGOFFICON, 7, 7, 21, 21, SS_ICON | WS_CHILD | WS_VISIBLE
|
||||||
|
LTEXT "Are you sure you want to log off?", -1, 35, 16, 146, 8, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP
|
||||||
|
PUSHBUTTON "&Log Off", 1, 41, 39, 50, 14, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
|
PUSHBUTTON "&No", 2, 95, 39, 50, 14, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP
|
||||||
|
}
|
||||||
|
|
||||||
|
IDD_STATUSWINDOW DIALOG 0, 0, 274, 26
|
||||||
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION
|
||||||
|
CAPTION "Please wait..."
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
FONT 8, "MS Sans Serif"
|
||||||
|
{
|
||||||
|
LTEXT "", IDC_STATUSLABEL, 7, 8, 234, 12, SS_ENDELLIPSIS
|
||||||
|
}
|
||||||
|
|
||||||
|
|
14
reactos/lib/msgina/resource.h
Normal file
14
reactos/lib/msgina/resource.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef __MSGINA_RESOURCE_H
|
||||||
|
#define __MSGINA_RESOURCE_H
|
||||||
|
|
||||||
|
#define IDD_LOGOFF_DLG 2250
|
||||||
|
#define IDD_STATUSWINDOW 2450
|
||||||
|
|
||||||
|
#define IDC_LOGOFFICON 21
|
||||||
|
#define IDC_STATUSLABEL 2451
|
||||||
|
|
||||||
|
#define IDI_LOGOFFICON 2251
|
||||||
|
|
||||||
|
#endif /* __MSGINA_RESOURCE_H */
|
||||||
|
|
||||||
|
/* EOF */
|
BIN
reactos/lib/msgina/resources/ico_logoff.ico
Normal file
BIN
reactos/lib/msgina/resources/ico_logoff.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: stubs.c,v 1.4 2003/11/24 19:04:23 weiden Exp $
|
/* $Id: stubs.c,v 1.5 2003/12/01 18:21:04 weiden Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS msgina.dll
|
* PROJECT: ReactOS msgina.dll
|
||||||
|
@ -86,20 +86,6 @@ WlxIsLogoffOk(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
int WINAPI
|
|
||||||
WlxLoggedOnSAS(
|
|
||||||
PVOID pWlxContext,
|
|
||||||
DWORD dwSasType,
|
|
||||||
PVOID pReserved)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
*/
|
*/
|
||||||
|
@ -170,22 +156,6 @@ WlxScreenSaverNotify(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOL WINAPI
|
|
||||||
WlxDisplayStatusMessage(
|
|
||||||
PVOID pWlxContext,
|
|
||||||
HDESK hDesktop,
|
|
||||||
DWORD dwOptions,
|
|
||||||
PWSTR pTitle,
|
|
||||||
PWSTR pMessage)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
*/
|
*/
|
||||||
|
@ -214,18 +184,6 @@ WlxNetworkProviderLoad(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOL WINAPI
|
|
||||||
WlxRemoveStatusMessage(
|
|
||||||
PVOID pWlxContext)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $Id: makefile,v 1.7 2003/11/14 17:13:35 weiden Exp $
|
# $Id: makefile,v 1.8 2003/12/01 18:21:04 weiden Exp $
|
||||||
|
|
||||||
PATH_TO_TOP = ../../..
|
PATH_TO_TOP = ../../..
|
||||||
|
|
||||||
|
@ -10,11 +10,11 @@ TARGET_NAME = winlogon
|
||||||
|
|
||||||
TARGET_INSTALLDIR = system32
|
TARGET_INSTALLDIR = system32
|
||||||
|
|
||||||
TARGET_SDKLIBS = ntdll.a kernel32.a user32.a
|
TARGET_SDKLIBS = ntdll.a kernel32.a user32.a secur32.a
|
||||||
|
|
||||||
TARGET_OBJECTS = $(TARGET_NAME).o setup.o
|
TARGET_OBJECTS = $(TARGET_NAME).o setup.o wlx.o
|
||||||
|
|
||||||
TARGET_CFLAGS = -Wall -Werror
|
TARGET_CFLAGS = -Wall -Werror -DUNICODE -I./ -I../../../include
|
||||||
|
|
||||||
include $(PATH_TO_TOP)/rules.mak
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
|
31
reactos/subsys/system/winlogon/resource.h
Normal file
31
reactos/subsys/system/winlogon/resource.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/* Dialogs */
|
||||||
|
#define IDD_GINALOADFAILED 400
|
||||||
|
#define IDD_SHUTDOWNCOMPUTER 300
|
||||||
|
|
||||||
|
/* Icons */
|
||||||
|
#define IDI_WINLOGON 4
|
||||||
|
|
||||||
|
/* Controls */
|
||||||
|
#define IDC_GINALOADFAILED 401
|
||||||
|
#define IDC_GINALOADFAILEDCONTACT 402
|
||||||
|
|
||||||
|
#define IDC_SHUTDOWNCOMPUTER 302
|
||||||
|
#define IDC_BTNSHTDOWNCOMPUTER 305
|
||||||
|
#define IDC_SHTDOWNICON 102
|
||||||
|
|
||||||
|
/* Strings */
|
||||||
|
#define IDS_PREPARENETWORKCONNECTIONS 1675
|
||||||
|
#define IDS_APPLYINGCOMPUTERSETTINGS 1676
|
||||||
|
#define IDS_RUNNINGSTARTUPSCRIPTS 1677
|
||||||
|
#define IDS_RUNNINGSHUTDOWNSCRIPTS 1678
|
||||||
|
#define IDS_APPLYINGYOURPERSONALSETTINGS 1679
|
||||||
|
#define IDS_RUNNINGLOGOFFSCRIPTS 1680
|
||||||
|
#define IDS_RUNNINGLOGONSCRIPTS 1681
|
||||||
|
#define IDS_LOADINGYOURPERSONALSETTINGS 1682
|
||||||
|
#define IDS_CLOSINGNETWORKCONNECTIONS 1683
|
||||||
|
#define IDS_REACTOSISSHUTTINGDOWN 1684
|
||||||
|
#define IDS_PREPARETOSTANDBY 1685
|
||||||
|
#define IDS_PREPARETOHIBERNATE 1686
|
||||||
|
#define IDS_SAVEYOURSETTINGS 1687
|
||||||
|
#define IDS_REACTOSISSTARTINGUP 1690
|
||||||
|
|
BIN
reactos/subsys/system/winlogon/resources/winlogon.ico
Normal file
BIN
reactos/subsys/system/winlogon/resources/winlogon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: setup.c,v 1.1 2003/03/25 19:26:33 ekohl Exp $
|
/* $Id: setup.c,v 1.2 2003/12/01 18:21:04 weiden Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS winlogon
|
* PROJECT: ReactOS winlogon
|
||||||
* FILE: subsys/system/winlogon/setup.h
|
* FILE: subsys/system/winlogon/setup.h
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <lsass/ntsecapi.h>
|
#include <ntsecapi.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
@ -49,7 +49,7 @@ GetSetupType(VOID)
|
||||||
DWORD dwSetupType;
|
DWORD dwSetupType;
|
||||||
|
|
||||||
dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||||
"SYSTEM\\Setup", //TEXT("SYSTEM\\Setup"),
|
L"SYSTEM\\Setup", //TEXT("SYSTEM\\Setup"),
|
||||||
0,
|
0,
|
||||||
KEY_QUERY_VALUE,
|
KEY_QUERY_VALUE,
|
||||||
&hKey);
|
&hKey);
|
||||||
|
@ -60,7 +60,7 @@ GetSetupType(VOID)
|
||||||
|
|
||||||
dwSize = sizeof(DWORD);
|
dwSize = sizeof(DWORD);
|
||||||
dwError = RegQueryValueEx (hKey,
|
dwError = RegQueryValueEx (hKey,
|
||||||
"SetupType", //TEXT("SetupType"),
|
L"SetupType", //TEXT("SetupType"),
|
||||||
NULL,
|
NULL,
|
||||||
&dwType,
|
&dwType,
|
||||||
(LPBYTE)&dwSetupType,
|
(LPBYTE)&dwSetupType,
|
||||||
|
@ -82,7 +82,7 @@ SetSetupType (DWORD dwSetupType)
|
||||||
HANDLE hKey;
|
HANDLE hKey;
|
||||||
|
|
||||||
dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||||
"SYSTEM\\Setup", //TEXT("SYSTEM\\Setup"),
|
L"SYSTEM\\Setup", //TEXT("SYSTEM\\Setup"),
|
||||||
0,
|
0,
|
||||||
KEY_QUERY_VALUE,
|
KEY_QUERY_VALUE,
|
||||||
&hKey);
|
&hKey);
|
||||||
|
@ -92,7 +92,7 @@ SetSetupType (DWORD dwSetupType)
|
||||||
}
|
}
|
||||||
|
|
||||||
dwError = RegSetValueEx (hKey,
|
dwError = RegSetValueEx (hKey,
|
||||||
"SetupType", //TEXT("SetupType"),
|
L"SetupType", //TEXT("SetupType"),
|
||||||
0,
|
0,
|
||||||
REG_DWORD,
|
REG_DWORD,
|
||||||
(LPBYTE)&dwSetupType,
|
(LPBYTE)&dwSetupType,
|
||||||
|
@ -112,7 +112,7 @@ RunSetup (VOID)
|
||||||
{
|
{
|
||||||
PROCESS_INFORMATION ProcessInformation;
|
PROCESS_INFORMATION ProcessInformation;
|
||||||
STARTUPINFO StartupInfo;
|
STARTUPINFO StartupInfo;
|
||||||
CHAR CommandLine[MAX_PATH];
|
WCHAR CommandLine[MAX_PATH];
|
||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
DWORD dwError;
|
DWORD dwError;
|
||||||
HANDLE hKey;
|
HANDLE hKey;
|
||||||
|
@ -123,7 +123,7 @@ RunSetup (VOID)
|
||||||
DPRINT ("RunSetup() called\n");
|
DPRINT ("RunSetup() called\n");
|
||||||
|
|
||||||
dwError = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
|
dwError = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
|
||||||
"SYSTEM\\Setup",
|
L"SYSTEM\\Setup",
|
||||||
0,
|
0,
|
||||||
KEY_QUERY_VALUE,
|
KEY_QUERY_VALUE,
|
||||||
&hKey);
|
&hKey);
|
||||||
|
@ -134,7 +134,7 @@ RunSetup (VOID)
|
||||||
|
|
||||||
dwSize = MAX_PATH;
|
dwSize = MAX_PATH;
|
||||||
dwError = RegQueryValueEx (hKey,
|
dwError = RegQueryValueEx (hKey,
|
||||||
"CmdLine",
|
L"CmdLine",
|
||||||
NULL,
|
NULL,
|
||||||
&dwType,
|
&dwType,
|
||||||
(LPBYTE)CommandLine,
|
(LPBYTE)CommandLine,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: winlogon.c,v 1.20 2003/11/14 17:13:35 weiden Exp $
|
/* $Id: winlogon.c,v 1.21 2003/12/01 18:21:04 weiden Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -14,48 +14,62 @@
|
||||||
#include <ntos.h>
|
#include <ntos.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <lsass/ntsecapi.h>
|
#include <ntsecapi.h>
|
||||||
|
#include <napi/lpc.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
#include "winlogon.h"
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
#define SUPPORT_CONSOLESTART 1
|
||||||
|
#define START_LSASS 0
|
||||||
|
|
||||||
/* GLOBALS ******************************************************************/
|
/* GLOBALS ******************************************************************/
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
LoadGina(PMSGINAFUNCTIONS Functions);
|
||||||
|
BOOL
|
||||||
|
MsGinaInit();
|
||||||
|
|
||||||
|
HINSTANCE hAppInstance;
|
||||||
HWINSTA InteractiveWindowStation; /* WinSta0 */
|
HWINSTA InteractiveWindowStation; /* WinSta0 */
|
||||||
HDESK ApplicationDesktop; /* WinSta0\Default */
|
HDESK ApplicationDesktop; /* WinSta0\Default */
|
||||||
HDESK WinlogonDesktop; /* WinSta0\Winlogon */
|
HDESK WinlogonDesktop; /* WinSta0\Winlogon */
|
||||||
HDESK ScreenSaverDesktop; /* WinSta0\Screen-Saver */
|
HDESK ScreenSaverDesktop; /* WinSta0\Screen-Saver */
|
||||||
|
|
||||||
|
MSGINAFUNCTIONS MsGinaFunctions;
|
||||||
|
|
||||||
|
#if SUPPORT_CONSOLESTART
|
||||||
|
BOOL StartConsole = TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
static void PrintString (char* fmt,...)
|
static void PrintString (WCHAR* fmt,...)
|
||||||
{
|
{
|
||||||
char buffer[512];
|
WCHAR buffer[512];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
vsprintf(buffer, fmt, ap);
|
wsprintf(buffer, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
OutputDebugString(buffer);
|
OutputDebugString(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static BOOLEAN StartServices(VOID)
|
static BOOLEAN StartServices(VOID)
|
||||||
{
|
{
|
||||||
HANDLE ServicesInitEvent;
|
HANDLE ServicesInitEvent;
|
||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
STARTUPINFO StartupInfo;
|
STARTUPINFO StartupInfo;
|
||||||
PROCESS_INFORMATION ProcessInformation;
|
PROCESS_INFORMATION ProcessInformation;
|
||||||
CHAR CommandLine[MAX_PATH];
|
|
||||||
DWORD Count;
|
DWORD Count;
|
||||||
|
|
||||||
/* Start the service control manager (services.exe) */
|
/* Start the service control manager (services.exe) */
|
||||||
GetSystemDirectory(CommandLine, MAX_PATH);
|
|
||||||
strcat(CommandLine, "\\services.exe");
|
|
||||||
|
|
||||||
StartupInfo.cb = sizeof(StartupInfo);
|
StartupInfo.cb = sizeof(StartupInfo);
|
||||||
StartupInfo.lpReserved = NULL;
|
StartupInfo.lpReserved = NULL;
|
||||||
|
@ -66,10 +80,10 @@ static BOOLEAN StartServices(VOID)
|
||||||
StartupInfo.lpReserved2 = 0;
|
StartupInfo.lpReserved2 = 0;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
PrintString("WL: Creating new process - \"services.exe\".\n");
|
PrintString(L"WL: Creating new process - \"services.exe\".\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Result = CreateProcess(CommandLine,
|
Result = CreateProcess(L"services.exe",
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -81,7 +95,7 @@ static BOOLEAN StartServices(VOID)
|
||||||
&ProcessInformation);
|
&ProcessInformation);
|
||||||
if (!Result)
|
if (!Result)
|
||||||
{
|
{
|
||||||
PrintString("WL: Failed to execute services\n");
|
PrintString(L"WL: Failed to execute services\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +107,7 @@ static BOOLEAN StartServices(VOID)
|
||||||
//DbgPrint("WL: Attempting to open event \"SvcctrlStartEvent_A3725DX\"\n");
|
//DbgPrint("WL: Attempting to open event \"SvcctrlStartEvent_A3725DX\"\n");
|
||||||
ServicesInitEvent = OpenEvent(EVENT_ALL_ACCESS, //SYNCHRONIZE,
|
ServicesInitEvent = OpenEvent(EVENT_ALL_ACCESS, //SYNCHRONIZE,
|
||||||
FALSE,
|
FALSE,
|
||||||
"SvcctrlStartEvent_A3725DX");
|
L"SvcctrlStartEvent_A3725DX");
|
||||||
if (ServicesInitEvent != NULL)
|
if (ServicesInitEvent != NULL)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
@ -116,19 +130,18 @@ static BOOLEAN StartServices(VOID)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if START_LSASS
|
||||||
static BOOLEAN StartLsass(VOID)
|
static BOOLEAN StartLsass(VOID)
|
||||||
{
|
{
|
||||||
HANDLE LsassInitEvent;
|
HANDLE LsassInitEvent;
|
||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
STARTUPINFO StartupInfo;
|
STARTUPINFO StartupInfo;
|
||||||
PROCESS_INFORMATION ProcessInformation;
|
PROCESS_INFORMATION ProcessInformation;
|
||||||
CHAR CommandLine[MAX_PATH];
|
|
||||||
|
|
||||||
LsassInitEvent = CreateEvent(NULL,
|
LsassInitEvent = CreateEvent(NULL,
|
||||||
TRUE,
|
TRUE,
|
||||||
FALSE,
|
FALSE,
|
||||||
"\\LsassInitDone");
|
L"\\LsassInitDone");
|
||||||
|
|
||||||
if (LsassInitEvent == NULL)
|
if (LsassInitEvent == NULL)
|
||||||
{
|
{
|
||||||
|
@ -138,9 +151,6 @@ static BOOLEAN StartLsass(VOID)
|
||||||
|
|
||||||
/* Start the local security authority subsystem (lsass.exe) */
|
/* Start the local security authority subsystem (lsass.exe) */
|
||||||
|
|
||||||
GetSystemDirectory(CommandLine, MAX_PATH);
|
|
||||||
strcat(CommandLine, "\\lsass.exe");
|
|
||||||
|
|
||||||
StartupInfo.cb = sizeof(StartupInfo);
|
StartupInfo.cb = sizeof(StartupInfo);
|
||||||
StartupInfo.lpReserved = NULL;
|
StartupInfo.lpReserved = NULL;
|
||||||
StartupInfo.lpDesktop = NULL;
|
StartupInfo.lpDesktop = NULL;
|
||||||
|
@ -149,7 +159,7 @@ static BOOLEAN StartLsass(VOID)
|
||||||
StartupInfo.cbReserved2 = 0;
|
StartupInfo.cbReserved2 = 0;
|
||||||
StartupInfo.lpReserved2 = 0;
|
StartupInfo.lpReserved2 = 0;
|
||||||
|
|
||||||
Result = CreateProcess(CommandLine,
|
Result = CreateProcess(L"lsass.exe",
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -175,13 +185,13 @@ static BOOLEAN StartLsass(VOID)
|
||||||
static BOOLEAN OpenRegistryKey(HANDLE *WinLogonKey)
|
static BOOLEAN OpenRegistryKey(HANDLE *WinLogonKey)
|
||||||
{
|
{
|
||||||
return ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
return ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||||
_T("SOFTWARE\\ReactOS\\Windows NT\\CurrentVersion\\WinLogon"),
|
L"SOFTWARE\\ReactOS\\Windows NT\\CurrentVersion\\WinLogon",
|
||||||
0,
|
0,
|
||||||
KEY_QUERY_VALUE,
|
KEY_QUERY_VALUE,
|
||||||
WinLogonKey);
|
WinLogonKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOLEAN StartProcess(PCHAR ValueName)
|
static BOOLEAN StartProcess(PWCHAR ValueName)
|
||||||
{
|
{
|
||||||
BOOL StartIt;
|
BOOL StartIt;
|
||||||
HANDLE WinLogonKey;
|
HANDLE WinLogonKey;
|
||||||
|
@ -210,25 +220,51 @@ static BOOLEAN StartProcess(PCHAR ValueName)
|
||||||
|
|
||||||
return StartIt;
|
return StartIt;
|
||||||
}
|
}
|
||||||
|
#if SUPPORT_CONSOLESTART
|
||||||
|
static BOOL StartIntoGUI(void)
|
||||||
|
{
|
||||||
|
HANDLE WinLogonKey;
|
||||||
|
DWORD Type, Size, Value;
|
||||||
|
|
||||||
|
if(OpenRegistryKey(&WinLogonKey))
|
||||||
|
{
|
||||||
|
Size = sizeof(DWORD);
|
||||||
|
if(ERROR_SUCCESS == RegQueryValueEx(WinLogonKey,
|
||||||
|
L"StartGUI",
|
||||||
|
NULL,
|
||||||
|
&Type,
|
||||||
|
(LPBYTE)&Value,
|
||||||
|
&Size))
|
||||||
|
{
|
||||||
|
if(Type == REG_DWORD)
|
||||||
|
{
|
||||||
|
RegCloseKey(WinLogonKey);
|
||||||
|
return (Value != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RegCloseKey(WinLogonKey);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static PCHAR GetShell(PCHAR CommandLine)
|
static PWCHAR GetShell(WCHAR *CommandLine)
|
||||||
{
|
{
|
||||||
HANDLE WinLogonKey;
|
HANDLE WinLogonKey;
|
||||||
BOOL GotCommandLine;
|
BOOL GotCommandLine;
|
||||||
DWORD Type;
|
DWORD Type;
|
||||||
DWORD Size;
|
DWORD Size;
|
||||||
CHAR Shell[_MAX_PATH];
|
WCHAR Shell[_MAX_PATH];
|
||||||
|
|
||||||
GotCommandLine = FALSE;
|
GotCommandLine = FALSE;
|
||||||
if (OpenRegistryKey(&WinLogonKey))
|
if (OpenRegistryKey(&WinLogonKey))
|
||||||
{
|
{
|
||||||
Size = MAX_PATH;
|
Size = MAX_PATH;
|
||||||
if (ERROR_SUCCESS == RegQueryValueEx(WinLogonKey,
|
if (ERROR_SUCCESS == RegQueryValueEx(WinLogonKey,
|
||||||
_T("Shell"),
|
L"Shell",
|
||||||
NULL,
|
NULL,
|
||||||
&Type,
|
&Type,
|
||||||
(LPBYTE) Shell,
|
(LPBYTE) Shell,
|
||||||
&Size))
|
&Size))
|
||||||
{
|
{
|
||||||
if (REG_EXPAND_SZ == Type)
|
if (REG_EXPAND_SZ == Type)
|
||||||
{
|
{
|
||||||
|
@ -237,7 +273,7 @@ static PCHAR GetShell(PCHAR CommandLine)
|
||||||
}
|
}
|
||||||
else if (REG_SZ == Type)
|
else if (REG_SZ == Type)
|
||||||
{
|
{
|
||||||
strcpy(CommandLine, Shell);
|
wcscpy(CommandLine, Shell);
|
||||||
GotCommandLine = TRUE;
|
GotCommandLine = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -247,19 +283,19 @@ static PCHAR GetShell(PCHAR CommandLine)
|
||||||
if (! GotCommandLine)
|
if (! GotCommandLine)
|
||||||
{
|
{
|
||||||
GetSystemDirectory(CommandLine, MAX_PATH - 10);
|
GetSystemDirectory(CommandLine, MAX_PATH - 10);
|
||||||
strcat(CommandLine, "\\cmd.exe");
|
wcscat(CommandLine, L"\\cmd.exe");
|
||||||
}
|
}
|
||||||
|
|
||||||
return CommandLine;
|
return CommandLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL DoLoginUser(PCHAR Name, PCHAR Password)
|
static BOOL DoLoginUser(PWCHAR Name, PWCHAR Password)
|
||||||
{
|
{
|
||||||
PROCESS_INFORMATION ProcessInformation;
|
PROCESS_INFORMATION ProcessInformation;
|
||||||
STARTUPINFO StartupInfo;
|
STARTUPINFO StartupInfo;
|
||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
CHAR CommandLine[MAX_PATH];
|
WCHAR CommandLine[MAX_PATH];
|
||||||
CHAR CurrentDirectory[MAX_PATH];
|
WCHAR CurrentDirectory[MAX_PATH];
|
||||||
|
|
||||||
GetWindowsDirectory(CurrentDirectory, MAX_PATH);
|
GetWindowsDirectory(CurrentDirectory, MAX_PATH);
|
||||||
|
|
||||||
|
@ -292,6 +328,7 @@ static BOOL DoLoginUser(PCHAR Name, PCHAR Password)
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int STDCALL
|
int STDCALL
|
||||||
WinMain(HINSTANCE hInstance,
|
WinMain(HINSTANCE hInstance,
|
||||||
|
@ -299,19 +336,23 @@ WinMain(HINSTANCE hInstance,
|
||||||
LPSTR lpCmdLine,
|
LPSTR lpCmdLine,
|
||||||
int nShowCmd)
|
int nShowCmd)
|
||||||
{
|
{
|
||||||
|
#if SUPPORT_CONSOLESTART
|
||||||
|
WCHAR LoginName[255];
|
||||||
|
WCHAR Password[255];
|
||||||
|
#endif
|
||||||
#if 0
|
#if 0
|
||||||
LSA_STRING ProcessName;
|
LSA_STRING ProcessName, PackageName;
|
||||||
NTSTATUS Status;
|
|
||||||
HANDLE LsaHandle;
|
HANDLE LsaHandle;
|
||||||
LSA_OPERATIONAL_MODE Mode;
|
LSA_OPERATIONAL_MODE Mode;
|
||||||
CHAR LoginPrompt[] = "login:";
|
ULONG AuthenticationPackage;
|
||||||
CHAR PasswordPrompt[] = "password:";
|
|
||||||
#endif
|
#endif
|
||||||
CHAR LoginName[255];
|
HANDLE hShutdownEvent;
|
||||||
CHAR Password[255];
|
WCHAR StatusMsg[256];
|
||||||
BOOL Success;
|
BOOL Success;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
hAppInstance = hInstance;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: Create a security descriptor with
|
* FIXME: Create a security descriptor with
|
||||||
* one ACE containing the Winlogon SID
|
* one ACE containing the Winlogon SID
|
||||||
|
@ -321,7 +362,7 @@ WinMain(HINSTANCE hInstance,
|
||||||
* Create the interactive window station
|
* Create the interactive window station
|
||||||
*/
|
*/
|
||||||
InteractiveWindowStation =
|
InteractiveWindowStation =
|
||||||
CreateWindowStationW(L"WinSta0", 0, GENERIC_ALL, NULL);
|
CreateWindowStation(L"WinSta0", 0, GENERIC_ALL, NULL);
|
||||||
if (InteractiveWindowStation == NULL)
|
if (InteractiveWindowStation == NULL)
|
||||||
{
|
{
|
||||||
DbgPrint("WL: Failed to create window station (0x%X)\n", GetLastError());
|
DbgPrint("WL: Failed to create window station (0x%X)\n", GetLastError());
|
||||||
|
@ -338,32 +379,32 @@ WinMain(HINSTANCE hInstance,
|
||||||
* Create the application desktop
|
* Create the application desktop
|
||||||
*/
|
*/
|
||||||
ApplicationDesktop =
|
ApplicationDesktop =
|
||||||
CreateDesktopW(L"Default",
|
CreateDesktop(L"Default",
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
0, /* FIXME: Set some flags */
|
0, /* FIXME: Set some flags */
|
||||||
GENERIC_ALL,
|
GENERIC_ALL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the winlogon desktop
|
* Create the winlogon desktop
|
||||||
*/
|
*/
|
||||||
WinlogonDesktop = CreateDesktopW(L"Winlogon",
|
WinlogonDesktop = CreateDesktop(L"Winlogon",
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
0, /* FIXME: Set some flags */
|
0, /* FIXME: Set some flags */
|
||||||
GENERIC_ALL,
|
GENERIC_ALL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the screen saver desktop
|
* Create the screen saver desktop
|
||||||
*/
|
*/
|
||||||
ScreenSaverDesktop = CreateDesktopW(L"Screen-Saver",
|
ScreenSaverDesktop = CreateDesktop(L"Screen-Saver",
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
0, /* FIXME: Set some flags */
|
0, /* FIXME: Set some flags */
|
||||||
GENERIC_ALL,
|
GENERIC_ALL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Switch to winlogon desktop
|
* Switch to winlogon desktop
|
||||||
|
@ -384,9 +425,6 @@ WinMain(HINSTANCE hInstance,
|
||||||
DbgPrint("WL: Cannot switch to Winlogon desktop (0x%X)\n", GetLastError());
|
DbgPrint("WL: Cannot switch to Winlogon desktop (0x%X)\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
AllocConsole();
|
|
||||||
SetConsoleTitle( "Winlogon" );
|
|
||||||
|
|
||||||
/* Check for pending setup */
|
/* Check for pending setup */
|
||||||
if (GetSetupType () != 0)
|
if (GetSetupType () != 0)
|
||||||
{
|
{
|
||||||
|
@ -400,17 +438,61 @@ WinMain(HINSTANCE hInstance,
|
||||||
ExitProcess (0);
|
ExitProcess (0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if SUPPORT_CONSOLESTART
|
||||||
|
StartConsole = !StartIntoGUI();
|
||||||
|
if(!StartConsole)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
if(!LoadGina(&MsGinaFunctions))
|
||||||
|
{
|
||||||
|
NtShutdownSystem(ShutdownReboot);
|
||||||
|
ExitProcess(0);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME - better solution needed */
|
||||||
|
hShutdownEvent = CreateEvent(NULL,
|
||||||
|
TRUE,
|
||||||
|
FALSE,
|
||||||
|
L"WinLogonShutdown");
|
||||||
|
|
||||||
|
if(!hShutdownEvent)
|
||||||
|
{
|
||||||
|
DbgPrint("WL: Failed to create WinLogonShutdown event!\n");
|
||||||
|
NtShutdownSystem(ShutdownNoReboot);
|
||||||
|
ExitProcess(0);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!MsGinaInit() || !MsGinaInst)
|
||||||
|
{
|
||||||
|
DbgPrint("WL: Failed to initialize winlogon!\n");
|
||||||
|
NtShutdownSystem(ShutdownNoReboot);
|
||||||
|
ExitProcess(0);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadString(hAppInstance, IDS_REACTOSISSTARTINGUP, StatusMsg, 256 * sizeof(WCHAR));
|
||||||
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||||
|
ApplicationDesktop,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
StatusMsg);
|
||||||
|
#if SUPPORT_CONSOLESTART
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* start system processes (services.exe & lsass.exe) */
|
/* start system processes (services.exe & lsass.exe) */
|
||||||
if (StartProcess("StartServices"))
|
if (StartProcess(L"StartServices"))
|
||||||
{
|
{
|
||||||
if (!StartServices())
|
if (!StartServices())
|
||||||
{
|
{
|
||||||
DbgPrint("WL: Failed to start Services (0x%X)\n", GetLastError());
|
DbgPrint("WL: Failed to start Services (0x%X)\n", GetLastError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
#if START_LSASS
|
||||||
if (StartProcess("StartLsass"))
|
if (StartProcess(L"StartLsass"))
|
||||||
{
|
{
|
||||||
if (!StartLsass())
|
if (!StartLsass())
|
||||||
{
|
{
|
||||||
|
@ -419,15 +501,37 @@ WinMain(HINSTANCE hInstance,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* FIXME: What name does the real WinLogon use? */
|
|
||||||
#if 0
|
#if 0
|
||||||
RtlInitUnicodeString((PUNICODE_STRING)&ProcessName, L"WinLogon");
|
/* real winlogon uses "Winlogon" */
|
||||||
|
RtlInitUnicodeString((PUNICODE_STRING)&ProcessName, L"Winlogon");
|
||||||
Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
|
Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
switch(Status)
|
||||||
{
|
{
|
||||||
DbgPrint("WL: Failed to connect to LSASS\n");
|
case STATUS_PORT_CONNECTION_REFUSED:
|
||||||
return(1);
|
/* FIXME - we don't have the 'SeTcbPrivilege' pivilege, so set it or call
|
||||||
|
LsaAddAccountRights() and try again */
|
||||||
|
DbgPrint("WL: LsaRegisterLogonProcess() returned STATUS_PORT_CONNECTION_REFUSED\n");
|
||||||
|
break;
|
||||||
|
case STATUS_NAME_TOO_LONG:
|
||||||
|
DbgPrint("WL: LsaRegisterLogonProcess() returned STATUS_NAME_TOO_LONG\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DbgPrint("WL: Failed to connect to LSASS\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlInitUnicodeString((PUNICODE_STRING)&PackageName, L"Kerberos");
|
||||||
|
Status = LsaLookupAuthenticationPackage(LsaHandle, &PackageName, &AuthenticationPackage);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
LsaDeregisterLogonProcess(LsaHandle);
|
||||||
|
DbgPrint("WL: Failed to lookup authentication package\n");
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* FIXME: Create a window class and associate a Winlogon
|
/* FIXME: Create a window class and associate a Winlogon
|
||||||
|
@ -475,9 +579,77 @@ WinMain(HINSTANCE hInstance,
|
||||||
Password[i - 1] =0;
|
Password[i - 1] =0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if SUPPORT_CONSOLESTART
|
||||||
|
if(StartConsole)
|
||||||
|
{
|
||||||
if (! DoLoginUser(LoginName, Password))
|
if (! DoLoginUser(LoginName, Password))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LoadString(hAppInstance, IDS_PREPARENETWORKCONNECTIONS, StatusMsg, 256 * sizeof(WCHAR));
|
||||||
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||||
|
ApplicationDesktop,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
StatusMsg);
|
||||||
|
|
||||||
|
/* FIXME */
|
||||||
|
Sleep(250);
|
||||||
|
|
||||||
|
LoadString(hAppInstance, IDS_APPLYINGCOMPUTERSETTINGS, 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);
|
||||||
|
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
||||||
|
|
||||||
|
/* FIXME - call WlxLoggedOutSAS() to display the login dialog */
|
||||||
|
Sleep(500);
|
||||||
|
|
||||||
|
LoadString(hAppInstance, IDS_LOADINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
||||||
|
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||||
|
ApplicationDesktop,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
StatusMsg);
|
||||||
|
|
||||||
|
/* FIXME */
|
||||||
|
Sleep(250);
|
||||||
|
|
||||||
|
LoadString(hAppInstance, IDS_APPLYINGYOURPERSONALSETTINGS, 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 - call WlxActivateUserShell() which will start userinit.exe */
|
||||||
|
DoLoginUser(LoginName, Password); /* FIXME - remove */
|
||||||
|
DbgPrint("shell exited! finished\n");
|
||||||
|
MessageBox(0, L"Shell exited", L"", 0);
|
||||||
|
|
||||||
|
WaitForSingleObject(hShutdownEvent, INFINITE);
|
||||||
|
CloseHandle(hShutdownEvent);
|
||||||
|
#if SUPPORT_CONSOLESTART
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
NtShutdownSystem(ShutdownNoReboot);
|
NtShutdownSystem(ShutdownNoReboot);
|
||||||
|
|
||||||
|
|
102
reactos/subsys/system/winlogon/winlogon.h
Normal file
102
reactos/subsys/system/winlogon/winlogon.h
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
* ReactOS kernel
|
||||||
|
* Copyright (C) 2003 ReactOS Team
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* 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 $
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS winlogon
|
||||||
|
* FILE: subsys/system/winlogon/winlogon.h
|
||||||
|
* PURPOSE: Winlogon
|
||||||
|
* PROGRAMMER:
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __WINLOGON_MAIN_H__
|
||||||
|
#define __WINLOGON_MAIN_H__
|
||||||
|
|
||||||
|
#include <WinWlx.h>
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI * PFWLXNEGOTIATE) (DWORD, DWORD *);
|
||||||
|
typedef BOOL (WINAPI * PFWLXINITIALIZE) (LPWSTR, HANDLE, PVOID, PVOID, PVOID *);
|
||||||
|
typedef VOID (WINAPI * PFWLXDISPLAYSASNOTICE) (PVOID);
|
||||||
|
typedef int (WINAPI * PFWLXLOGGEDOUTSAS) (PVOID, DWORD, PLUID, PSID, PDWORD,
|
||||||
|
PHANDLE, PWLX_MPR_NOTIFY_INFO,
|
||||||
|
PVOID *);
|
||||||
|
typedef BOOL (WINAPI * PFWLXACTIVATEUSERSHELL) (PVOID, PWSTR, PWSTR, PVOID);
|
||||||
|
typedef int (WINAPI * PFWLXLOGGEDONSAS) (PVOID, DWORD, PVOID);
|
||||||
|
typedef VOID (WINAPI * PFWLXDISPLAYLOCKEDNOTICE) (PVOID);
|
||||||
|
typedef int (WINAPI * PFWLXWKSTALOCKEDSAS) (PVOID, DWORD);
|
||||||
|
typedef BOOL (WINAPI * PFWLXISLOCKOK) (PVOID);
|
||||||
|
typedef BOOL (WINAPI * PFWLXISLOGOFFOK) (PVOID);
|
||||||
|
typedef VOID (WINAPI * PFWLXLOGOFF) (PVOID);
|
||||||
|
typedef VOID (WINAPI * PFWLXSHUTDOWN) (PVOID, DWORD);
|
||||||
|
|
||||||
|
/* version 1.1 */
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI * PFWLXSCREENSAVERNOTIFY) (PVOID, BOOL *);
|
||||||
|
typedef BOOL (WINAPI * PFWLXSTARTAPPLICATION) (PVOID, PWSTR, PVOID, PWSTR);
|
||||||
|
|
||||||
|
/* version 1.3 */
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI * PFWLXNETWORKPROVIDERLOAD) (PVOID, PWLX_MPR_NOTIFY_INFO);
|
||||||
|
typedef BOOL (WINAPI * PFWLXDISPLAYSTATUSMESSAGE) (PVOID, HDESK, DWORD, PWSTR, PWSTR);
|
||||||
|
typedef BOOL (WINAPI * PFWLXGETSTATUSMESSAGE) (PVOID, DWORD *, PWSTR, DWORD);
|
||||||
|
typedef BOOL (WINAPI * PFWLXREMOVESTATUSMESSAGE) (PVOID);
|
||||||
|
|
||||||
|
typedef struct _MSGINAFUNCTIONS
|
||||||
|
{
|
||||||
|
PFWLXNEGOTIATE WlxNegotiate;
|
||||||
|
PFWLXINITIALIZE WlxInitialize;
|
||||||
|
PFWLXDISPLAYSASNOTICE WlxDisplaySASNotice;
|
||||||
|
PFWLXLOGGEDOUTSAS WlxLoggedOutSAS;
|
||||||
|
PFWLXACTIVATEUSERSHELL WlxActivateUserShell;
|
||||||
|
PFWLXLOGGEDONSAS WlxLoggedOnSAS;
|
||||||
|
PFWLXDISPLAYLOCKEDNOTICE WlxDisplayLockedNotice;
|
||||||
|
PFWLXWKSTALOCKEDSAS WlxWkstaLockedSAS;
|
||||||
|
PFWLXISLOCKOK WlxIsLockOK;
|
||||||
|
PFWLXISLOGOFFOK WlxIsLogOffOK;
|
||||||
|
PFWLXLOGOFF WlxLogOff;
|
||||||
|
PFWLXSHUTDOWN WlxShutdown;
|
||||||
|
|
||||||
|
PFWLXSCREENSAVERNOTIFY WlxScreenSaverNotify;
|
||||||
|
PFWLXSTARTAPPLICATION WlxStartApplication;
|
||||||
|
|
||||||
|
PFWLXNETWORKPROVIDERLOAD WlxNetworkProviderLoad;
|
||||||
|
PFWLXDISPLAYSTATUSMESSAGE WlxDisplayStatusMessage;
|
||||||
|
PFWLXGETSTATUSMESSAGE WlxGetStatusMessage;
|
||||||
|
PFWLXREMOVESTATUSMESSAGE WlxRemoveStatusMessage;
|
||||||
|
} MSGINAFUNCTIONS, *PMSGINAFUNCTIONS;
|
||||||
|
|
||||||
|
typedef struct _MSGINAINSTANCE
|
||||||
|
{
|
||||||
|
HANDLE hDllInstance;
|
||||||
|
PMSGINAFUNCTIONS Functions;
|
||||||
|
PVOID Context;
|
||||||
|
} MSGINAINSTANCE, *PMSGINAINSTANCE;
|
||||||
|
|
||||||
|
extern HINSTANCE hAppInstance;
|
||||||
|
extern PMSGINAINSTANCE MsGinaInst;
|
||||||
|
extern HWINSTA InteractiveWindowStation; /* WinSta0 */
|
||||||
|
extern HDESK ApplicationDesktop; /* WinSta0\Default */
|
||||||
|
extern HDESK WinlogonDesktop; /* WinSta0\Winlogon */
|
||||||
|
extern HDESK ScreenSaverDesktop; /* WinSta0\Screen-Saver */
|
||||||
|
|
||||||
|
extern MSGINAFUNCTIONS MsGinaFunctions;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __WINLOGON_MAIN_H__ */
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -1,5 +1,6 @@
|
||||||
#include <defines.h>
|
#include <defines.h>
|
||||||
#include <reactos/resource.h>
|
#include <reactos/resource.h>
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
|
@ -36,3 +37,44 @@ BEGIN
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
|
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
|
||||||
|
CAPTION "Shutdown Computer"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "It is now safe to turn off your computer.", IDC_SHUTDOWNCOMPUTER, 31, 13, 132, 8
|
||||||
|
ICON IDI_WINLOGON, IDC_SHTDOWNICON, 6, 7, 18, 20
|
||||||
|
DEFPUSHBUTTON "&Restart", IDC_BTNSHTDOWNCOMPUTER, 62, 32, 40, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
IDD_GINALOADFAILED DIALOG 58, 83, 231, 119
|
||||||
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "User Interface Failure"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "The Logon User Interface DLL %s failed to load.", IDC_GINALOADFAILED, 39, 16, 156, 24
|
||||||
|
LTEXT "Contact your system administrator to replace the DLL, or restore the original DLL.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25
|
||||||
|
DEFPUSHBUTTON "&Restart", 1, 80, 91, 68, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_PREPARENETWORKCONNECTIONS "Preparing network connections..."
|
||||||
|
IDS_APPLYINGCOMPUTERSETTINGS "Applying computer settings..."
|
||||||
|
IDS_RUNNINGSTARTUPSCRIPTS "Running startup scripts..."
|
||||||
|
IDS_RUNNINGSHUTDOWNSCRIPTS "Running shutdown scripts..."
|
||||||
|
IDS_APPLYINGYOURPERSONALSETTINGS "Applying your personal settings..."
|
||||||
|
IDS_RUNNINGLOGOFFSCRIPTS "Running logoff scripts..."
|
||||||
|
IDS_RUNNINGLOGONSCRIPTS "Running logon scripts..."
|
||||||
|
IDS_LOADINGYOURPERSONALSETTINGS "Loading your personal settings..."
|
||||||
|
IDS_CLOSINGNETWORKCONNECTIONS "Closing network connections..."
|
||||||
|
IDS_REACTOSISSHUTTINGDOWN "ReactOS is shutting down..."
|
||||||
|
IDS_PREPARETOSTANDBY "Preparing to Standby..."
|
||||||
|
IDS_PREPARETOHIBERNATE "Preparing to Hibernate..."
|
||||||
|
IDS_SAVEYOURSETTINGS "Saving your settings..."
|
||||||
|
IDS_REACTOSISSTARTINGUP "ReactOS is starting up..."
|
||||||
|
END
|
||||||
|
|
||||||
|
|
585
reactos/subsys/system/winlogon/wlx.c
Normal file
585
reactos/subsys/system/winlogon/wlx.c
Normal file
|
@ -0,0 +1,585 @@
|
||||||
|
/* $Id: wlx.c,v 1.1 2003/12/01 18:21:04 weiden Exp $
|
||||||
|
*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS kernel
|
||||||
|
* FILE: services/winlogon/winlogon.c
|
||||||
|
* PURPOSE: Logon
|
||||||
|
* PROGRAMMER: David Welch (welch@cwcom.net)
|
||||||
|
* UPDATE HISTORY:
|
||||||
|
* Created 22/05/98
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
|
#include <ntos.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <WinWlx.h>
|
||||||
|
#include <napi/lpc.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
|
#include "winlogon.h"
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#define Unimplemented DbgPrint("WL: %S() at %S:%i unimplemented!\n", __FUNCTION__, __FILE__, __LINE__)
|
||||||
|
|
||||||
|
PMSGINAINSTANCE MsGinaInst;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
VOID WINAPI
|
||||||
|
WlxUseCtrlAltDel(
|
||||||
|
HANDLE hWlx
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
VOID WINAPI
|
||||||
|
WlxSetContextPointer(
|
||||||
|
HANDLE hWlx,
|
||||||
|
PVOID pWlxContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
VOID WINAPI
|
||||||
|
WlxSasNotify(
|
||||||
|
HANDLE hWlx,
|
||||||
|
DWORD dwSasType
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxSetTimeout(
|
||||||
|
HANDLE hWlx,
|
||||||
|
DWORD Timeout
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxAssignShellProtection(
|
||||||
|
HANDLE hWlx,
|
||||||
|
HANDLE hToken,
|
||||||
|
HANDLE hProcess,
|
||||||
|
HANDLE hThread
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxMessageBox(
|
||||||
|
HANDLE hWlx,
|
||||||
|
HWND hwndOwner,
|
||||||
|
LPWSTR lpszText,
|
||||||
|
LPWSTR lpszTitle,
|
||||||
|
UINT fuStyle
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxDialogBox(
|
||||||
|
HANDLE hWlx,
|
||||||
|
HANDLE hInst,
|
||||||
|
LPWSTR lpszTemplate,
|
||||||
|
HWND hwndOwner,
|
||||||
|
DLGPROC dlgprc
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxDialogBoxParam(
|
||||||
|
HANDLE hWlx,
|
||||||
|
HANDLE hInst,
|
||||||
|
LPWSTR lpszTemplate,
|
||||||
|
HWND hwndOwner,
|
||||||
|
DLGPROC dlgprc,
|
||||||
|
LPARAM dwInitParam
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxDialogBoxIndirect(
|
||||||
|
HANDLE hWlx,
|
||||||
|
HANDLE hInst,
|
||||||
|
LPCDLGTEMPLATE hDialogTemplate,
|
||||||
|
HWND hwndOwner,
|
||||||
|
DLGPROC dlgprc
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxDialogBoxIndirectParam(
|
||||||
|
HANDLE hWlx,
|
||||||
|
HANDLE hInst,
|
||||||
|
LPCDLGTEMPLATE hDialogTemplate,
|
||||||
|
HWND hwndOwner,
|
||||||
|
DLGPROC dlgprc,
|
||||||
|
LPARAM dwInitParam
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxSwitchDesktopToUser(
|
||||||
|
HANDLE hWlx
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxSwitchDesktopToWinlogon(
|
||||||
|
HANDLE hWlx
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxChangePasswordNotify(
|
||||||
|
HANDLE hWlx,
|
||||||
|
PWLX_MPR_NOTIFY_INFO pMprInfo,
|
||||||
|
DWORD dwChangeInfo
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxGetSourceDesktop(
|
||||||
|
HANDLE hWlx,
|
||||||
|
PWLX_DESKTOP* ppDesktop
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxSetReturnDesktop(
|
||||||
|
HANDLE hWlx,
|
||||||
|
PWLX_DESKTOP pDesktop
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxCreateUserDesktop(
|
||||||
|
HANDLE hWlx,
|
||||||
|
HANDLE hToken,
|
||||||
|
DWORD Flags,
|
||||||
|
PWSTR pszDesktopName,
|
||||||
|
PWLX_DESKTOP* ppDesktop
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
int WINAPI
|
||||||
|
WlxChangePasswordNotifyEx(
|
||||||
|
HANDLE hWlx,
|
||||||
|
PWLX_MPR_NOTIFY_INFO pMprInfo,
|
||||||
|
DWORD dwChangeInfo,
|
||||||
|
PWSTR ProviderName,
|
||||||
|
PVOID Reserved
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxCloseUserDesktop(
|
||||||
|
HANDLE hWlx,
|
||||||
|
PWLX_DESKTOP pDesktop,
|
||||||
|
HANDLE hToken
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxSetOption(
|
||||||
|
HANDLE hWlx,
|
||||||
|
DWORD Option,
|
||||||
|
ULONG_PTR Value,
|
||||||
|
ULONG_PTR* OldValue
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxGetOption(
|
||||||
|
HANDLE hWlx,
|
||||||
|
DWORD Option,
|
||||||
|
ULONG_PTR* Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
VOID WINAPI
|
||||||
|
WlxWin31Migrate(
|
||||||
|
HANDLE hWlx
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxQueryClientCredentials(
|
||||||
|
PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxQueryInetConnectorCredentials(
|
||||||
|
PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
DWORD WINAPI
|
||||||
|
WlxQueryConsoleSwitchCredentials(
|
||||||
|
PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 pCred
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxQueryTsLogonCredentials(
|
||||||
|
PWLX_CLIENT_CREDENTIALS_INFO_V2_0 pCred
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
WlxDisconnect(void)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
DWORD WINAPI
|
||||||
|
WlxQueryTerminalServicesData(
|
||||||
|
HANDLE hWlx,
|
||||||
|
PWLX_TERMINAL_SERVICES_DATA pTSData,
|
||||||
|
WCHAR* UserName,
|
||||||
|
WCHAR* Domain
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Unimplemented;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const
|
||||||
|
WLX_DISPATCH_VERSION_1_4 FunctionTable = {
|
||||||
|
WlxUseCtrlAltDel,
|
||||||
|
WlxSetContextPointer,
|
||||||
|
WlxSasNotify,
|
||||||
|
WlxSetTimeout,
|
||||||
|
WlxAssignShellProtection,
|
||||||
|
WlxMessageBox,
|
||||||
|
WlxDialogBox,
|
||||||
|
WlxDialogBoxParam,
|
||||||
|
WlxDialogBoxIndirect,
|
||||||
|
WlxDialogBoxIndirectParam,
|
||||||
|
WlxSwitchDesktopToUser,
|
||||||
|
WlxSwitchDesktopToWinlogon,
|
||||||
|
WlxChangePasswordNotify,
|
||||||
|
WlxGetSourceDesktop,
|
||||||
|
WlxSetReturnDesktop,
|
||||||
|
WlxCreateUserDesktop,
|
||||||
|
WlxChangePasswordNotifyEx,
|
||||||
|
WlxCloseUserDesktop,
|
||||||
|
WlxSetOption,
|
||||||
|
WlxGetOption,
|
||||||
|
WlxWin31Migrate,
|
||||||
|
WlxQueryClientCredentials,
|
||||||
|
WlxQueryInetConnectorCredentials,
|
||||||
|
WlxDisconnect,
|
||||||
|
WlxQueryTerminalServicesData,
|
||||||
|
WlxQueryConsoleSwitchCredentials,
|
||||||
|
WlxQueryTsLogonCredentials
|
||||||
|
};
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
GetMsGinaPath(WCHAR *path)
|
||||||
|
{
|
||||||
|
DWORD Status, Type, Size;
|
||||||
|
HANDLE hKey;
|
||||||
|
|
||||||
|
Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||||
|
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
|
||||||
|
0,
|
||||||
|
KEY_QUERY_VALUE,
|
||||||
|
&hKey);
|
||||||
|
if(Status != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
wcscpy(path, L"msgina.dll");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Size = MAX_PATH * sizeof(WCHAR);
|
||||||
|
Status = RegQueryValueEx(hKey,
|
||||||
|
L"GinaDLL",
|
||||||
|
NULL,
|
||||||
|
&Type,
|
||||||
|
(LPBYTE)path,
|
||||||
|
&Size);
|
||||||
|
if((Status != ERROR_SUCCESS) || (Size != REG_SZ) || (Size == 0))
|
||||||
|
{
|
||||||
|
wcscpy(path, L"msgina.dll");
|
||||||
|
}
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
CALLBACK
|
||||||
|
GinaLoadFailedProc(
|
||||||
|
HWND hwndDlg,
|
||||||
|
UINT uMsg,
|
||||||
|
WPARAM wParam,
|
||||||
|
LPARAM lParam
|
||||||
|
)
|
||||||
|
{
|
||||||
|
switch(uMsg)
|
||||||
|
{
|
||||||
|
case WM_COMMAND:
|
||||||
|
{
|
||||||
|
switch(LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case IDOK:
|
||||||
|
EndDialog(hwndDlg, IDOK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
WCHAR str[MAX_PATH], str2[MAX_PATH];
|
||||||
|
|
||||||
|
if(lParam)
|
||||||
|
{
|
||||||
|
len = GetDlgItemText(hwndDlg, IDC_GINALOADFAILED, str, MAX_PATH);
|
||||||
|
|
||||||
|
if(len)
|
||||||
|
{
|
||||||
|
wsprintf(str2, str, (LPWSTR)lParam);
|
||||||
|
SetDlgItemText(hwndDlg, IDC_GINALOADFAILED, str2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetFocus(GetDlgItem(hwndDlg, IDOK));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_CLOSE:
|
||||||
|
{
|
||||||
|
EndDialog(hwndDlg, IDCANCEL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
LoadGina(PMSGINAFUNCTIONS Functions)
|
||||||
|
{
|
||||||
|
HMODULE hGina;
|
||||||
|
WCHAR GinaDll[MAX_PATH + 1];
|
||||||
|
DWORD DllVersion = 0;
|
||||||
|
|
||||||
|
MsGinaInst = NULL;
|
||||||
|
|
||||||
|
GetMsGinaPath(GinaDll);
|
||||||
|
|
||||||
|
hGina = LoadLibrary(GinaDll);
|
||||||
|
if(!hGina)
|
||||||
|
{
|
||||||
|
DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), 0, GinaLoadFailedProc, (LPARAM)&GinaDll);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Functions->WlxNegotiate = (PFWLXNEGOTIATE)GetProcAddress(hGina, "WlxNegotiate");
|
||||||
|
Functions->WlxInitialize = (PFWLXINITIALIZE)GetProcAddress(hGina, "WlxInitialize");
|
||||||
|
|
||||||
|
if(Functions->WlxNegotiate)
|
||||||
|
{
|
||||||
|
if(!Functions->WlxNegotiate(WLX_VERSION_1_3, &DllVersion))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME - allow other versions */
|
||||||
|
if(DllVersion != WLX_VERSION_1_3)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
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->WlxRemoveStatusMessage = (PFWLXREMOVESTATUSMESSAGE)GetProcAddress(hGina, "WlxRemoveStatusMessage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Functions->WlxNegotiate != NULL) && (Functions->WlxInitialize != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
MsGinaInit()
|
||||||
|
{
|
||||||
|
PMSGINAINSTANCE Instance;
|
||||||
|
|
||||||
|
Instance = (PMSGINAINSTANCE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MSGINAINSTANCE));
|
||||||
|
if(!Instance)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance->Functions = &MsGinaFunctions;
|
||||||
|
Instance->hDllInstance = NULL; /* FIXME */
|
||||||
|
Instance->Context = NULL;
|
||||||
|
|
||||||
|
MsGinaInst = Instance;
|
||||||
|
|
||||||
|
if(!Instance->Functions->WlxInitialize(InteractiveWindowStation,
|
||||||
|
(HANDLE)Instance,
|
||||||
|
NULL,
|
||||||
|
(PVOID)&FunctionTable,
|
||||||
|
&Instance->Context))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue