From: Eric Kohl Date: Sat, 11 Jan 2014 16:20:31 +0000 (+0000) Subject: [WINLOGON] X-Git-Tag: ReactOS-0.3.16~282 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=f0ecb9c0cb57c3e219d6ec7ee6e376ded9f3207e [WINLOGON] - Implement a global dialog tracking list. - Close the SAS notice dialog before the logon dialog is created and create a new SAS notice dialog when the user cancels the logon dialog. This prevents the creation of multiple SAS notice dialogs below the logon dialog. svn path=/trunk/; revision=61585 --- diff --git a/reactos/base/system/winlogon/sas.c b/reactos/base/system/winlogon/sas.c index 377050a101c..3646d447777 100644 --- a/reactos/base/system/winlogon/sas.c +++ b/reactos/base/system/winlogon/sas.c @@ -845,6 +845,7 @@ DoGenericAction( Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context); break; case WLX_SAS_ACTION_NONE: /* 0x02 */ + Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context); break; case WLX_SAS_ACTION_LOCK_WKSTA: /* 0x03 */ if (Session->Gina.Functions.WlxIsLockOk(Session->Gina.Context)) @@ -923,6 +924,13 @@ DispatchSAS( default: { PSID LogonSid = NULL; /* FIXME */ + HWND hwnd; + + hwnd = GetTopDialogWindow(); + if (hwnd != NULL) + { + SendMessage(hwnd, WM_USER, 0, 0); + } Session->Options = 0; diff --git a/reactos/base/system/winlogon/winlogon.c b/reactos/base/system/winlogon/winlogon.c index c9581381a29..5fcd614fdbf 100644 --- a/reactos/base/system/winlogon/winlogon.c +++ b/reactos/base/system/winlogon/winlogon.c @@ -334,6 +334,9 @@ WinMain( ZeroMemory(WLSession, sizeof(WLSESSION)); WLSession->DialogTimeout = 120; /* 2 minutes */ + /* Initialize the dialog tracking list */ + InitDialogListHead(); + if (!CreateWindowStationAndDesktops(WLSession)) { ERR("WL: Could not create window station and desktops\n"); diff --git a/reactos/base/system/winlogon/winlogon.h b/reactos/base/system/winlogon/winlogon.h index e776124da81..d0495f01337 100644 --- a/reactos/base/system/winlogon/winlogon.h +++ b/reactos/base/system/winlogon/winlogon.h @@ -189,17 +189,17 @@ typedef struct _GINAINSTANCE */ typedef enum _LOGON_STATE { - STATE_INIT, // not user yet + STATE_INIT, // not used yet STATE_LOGGED_OFF, - STATE_LOGGED_OFF_SAS, // not user yet + STATE_LOGGED_OFF_SAS, // not used yet STATE_LOGGED_ON, - STATE_LOGGED_ON_SAS, // not user yet - STATE_SCREENSAVER, // not user yet + STATE_LOGGED_ON_SAS, // not used yet + STATE_SCREENSAVER, // not used yet STATE_LOCKED, - STATE_LOCKED_SAS, // not user yet - STATE_LOGGING_OFF, // not user yet - STATE_SHUTTING_DOWN, // not user yet - STATE_SHUT_DOWN // not user yet + STATE_LOCKED_SAS, // not used yet + STATE_LOGGING_OFF, // not used yet + STATE_SHUTTING_DOWN, // not used yet + STATE_SHUT_DOWN // not used yet } LOGON_STATE, *PLOGON_STATE; #define LockWorkstation(Session) @@ -291,6 +291,12 @@ BOOL RemoveStatusMessage(IN PWLSESSION Session); /* wlx.c */ +VOID +InitDialogListHead(VOID); + +HWND +GetTopDialogWindow(VOID); + BOOL GinaInit(IN OUT PWLSESSION Session); diff --git a/reactos/base/system/winlogon/wlx.c b/reactos/base/system/winlogon/wlx.c index 13fa78084ab..cbb5c17be67 100644 --- a/reactos/base/system/winlogon/wlx.c +++ b/reactos/base/system/winlogon/wlx.c @@ -26,13 +26,107 @@ #define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | \ GENERIC_EXECUTE | GENERIC_ALL) +typedef struct _DIALOG_LIST_ENTRY +{ + LIST_ENTRY Entry; + HWND hWnd; + DLGPROC DlgProc; + LPARAM lParam; +} DIALOG_LIST_ENTRY, *PDIALOG_LIST_ENTRY; + /* GLOBALS ******************************************************************/ -static DLGPROC PreviousWindowProc; -static UINT_PTR IdTimer; +//static UINT_PTR IdTimer; +static LIST_ENTRY DialogListHead; /* FUNCTIONS ****************************************************************/ +VOID +InitDialogListHead(VOID) +{ + InitializeListHead(&DialogListHead); +} + + +static +PDIALOG_LIST_ENTRY +AddDialogListEntry(VOID) +{ + PDIALOG_LIST_ENTRY ListEntry; + + ListEntry = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DIALOG_LIST_ENTRY)); + if (ListEntry == NULL) + return NULL; + + TRACE("Add entry %p\n", ListEntry); + + InsertHeadList(&DialogListHead, + &ListEntry->Entry); + + return ListEntry; +} + + +static +VOID +RemoveDialogListEntry(PDIALOG_LIST_ENTRY ListEntry) +{ + TRACE("Remove entry %p\n", ListEntry); + + RemoveEntryList(&ListEntry->Entry); + RtlFreeHeap(RtlGetProcessHeap(), 0, ListEntry); +} + + +static +PDIALOG_LIST_ENTRY +GetDialogListEntry(HWND hwndDlg) +{ + PDIALOG_LIST_ENTRY Current; + PLIST_ENTRY ListEntry; + + ListEntry = DialogListHead.Flink; + while (ListEntry != &DialogListHead) + { + Current = CONTAINING_RECORD(ListEntry, + DIALOG_LIST_ENTRY, + Entry); + if (Current->hWnd == hwndDlg) + { + TRACE("Found entry: %p\n", Current); + return Current; + } + + ListEntry = ListEntry->Flink; + } + + TRACE("Found no entry!\n"); + return NULL; +} + + +HWND +GetTopDialogWindow(VOID) +{ + PDIALOG_LIST_ENTRY Current; + PLIST_ENTRY ListEntry; + + ListEntry = DialogListHead.Flink; + if (ListEntry != &DialogListHead) + { + Current = CONTAINING_RECORD(ListEntry, + DIALOG_LIST_ENTRY, + Entry); + + TRACE("Found entry: %p window %p\n", Current, Current->hWnd); + return Current->hWnd; + } + + TRACE("Found no window\n"); + return NULL; +} + + static INT_PTR CALLBACK @@ -42,6 +136,36 @@ DefaultWlxWindowProc( IN WPARAM wParam, IN LPARAM lParam) { + PDIALOG_LIST_ENTRY ListEntry; + INT_PTR ret; + + if (uMsg == WM_INITDIALOG) + { + ListEntry = (PDIALOG_LIST_ENTRY)lParam; + + TRACE("Set dialog handle: %p\n", hwndDlg); + ListEntry->hWnd = hwndDlg; + lParam = ListEntry->lParam; +// SetTopTimeout(hWnd); + } + else + { + ListEntry = GetDialogListEntry(hwndDlg); + if (ListEntry == NULL) + return FALSE; + } + + if (uMsg == WM_USER) + { + EndDialog(hwndDlg, 0); + return 0; + } + + ret = ListEntry->DlgProc(hwndDlg, uMsg, wParam, lParam); + + return ret; + +/* if (uMsg == WM_TIMER && (UINT_PTR)wParam == IdTimer) { EndDialog(hwndDlg, -1); @@ -64,6 +188,7 @@ DefaultWlxWindowProc( { return PreviousWindowProc(hwndDlg, uMsg, wParam, lParam); } +*/ } /* @@ -186,10 +311,7 @@ WlxDialogBox( TRACE("WlxDialogBox()\n"); - if (PreviousWindowProc != NULL) - return -1; - PreviousWindowProc = dlgprc; - return (int)DialogBoxW((HINSTANCE) hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc); + return (int)WlxDialogBoxParam(hWlx, hInst, lpszTemplate, hwndOwner, dlgprc, 0); } /* @@ -205,14 +327,25 @@ WlxDialogBoxParam( DLGPROC dlgprc, LPARAM dwInitParam) { + PDIALOG_LIST_ENTRY ListEntry; + int ret; + UNREFERENCED_PARAMETER(hWlx); TRACE("WlxDialogBoxParam()\n"); - if (PreviousWindowProc != NULL) + ListEntry = AddDialogListEntry(); + if (ListEntry == NULL) return -1; - PreviousWindowProc = dlgprc; - return (int)DialogBoxParamW(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc, dwInitParam); + + ListEntry->DlgProc = dlgprc; + ListEntry->lParam = dwInitParam; + + ret = (int)DialogBoxParamW(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc, (LPARAM)ListEntry); + + RemoveDialogListEntry(ListEntry); + + return ret; } /* @@ -231,10 +364,7 @@ WlxDialogBoxIndirect( TRACE("WlxDialogBoxIndirect()\n"); - if (PreviousWindowProc != NULL) - return -1; - PreviousWindowProc = dlgprc; - return (int)DialogBoxIndirectW(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc); + return (int)WlxDialogBoxIndirectParam(hWlx, hInst, hDialogTemplate, hwndOwner, dlgprc, 0); } /* @@ -250,14 +380,25 @@ WlxDialogBoxIndirectParam( DLGPROC dlgprc, LPARAM dwInitParam) { + PDIALOG_LIST_ENTRY ListEntry; + int ret; + UNREFERENCED_PARAMETER(hWlx); TRACE("WlxDialogBoxIndirectParam()\n"); - if (PreviousWindowProc != NULL) + ListEntry = AddDialogListEntry(); + if (ListEntry == NULL) return -1; - PreviousWindowProc = dlgprc; - return (int)DialogBoxIndirectParamW(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc, dwInitParam); + + ListEntry->DlgProc = dlgprc; + ListEntry->lParam = dwInitParam; + + ret = (int)DialogBoxIndirectParamW(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc, (LPARAM)ListEntry); + + RemoveDialogListEntry(ListEntry); + + return ret; } /* @@ -789,7 +930,6 @@ GinaInit( Session->Gina.Version = GinaDllVersion; Session->Gina.UseCtrlAltDelete = FALSE; Session->SuppressStatus = FALSE; - PreviousWindowProc = NULL; TRACE("Calling WlxInitialize(\"%S\")\n", Session->InteractiveWindowStationName); return Session->Gina.Functions.WlxInitialize(