2006-08-02 21:01:37 +00:00
|
|
|
|
/*
|
2003-12-01 18:21:04 +00:00
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
2006-08-02 21:01:37 +00:00
|
|
|
|
* PROJECT: ReactOS Winlogon
|
2007-07-26 15:13:36 +00:00
|
|
|
|
* FILE: base/system/winlogon/wlx.c
|
2005-05-08 04:07:56 +00:00
|
|
|
|
* PURPOSE: Logon
|
2006-08-02 21:01:37 +00:00
|
|
|
|
* PROGRAMMERS: Thomas Weidenmueller (w3seek@users.sourceforge.net)
|
|
|
|
|
* Ge van Geldorp (gvg@reactos.com)
|
|
|
|
|
* Herv<EFBFBD> Poussineau (hpoussin@reactos.org)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "winlogon.h"
|
|
|
|
|
|
2014-01-11 16:20:31 +00:00
|
|
|
|
typedef struct _DIALOG_LIST_ENTRY
|
|
|
|
|
{
|
|
|
|
|
LIST_ENTRY Entry;
|
|
|
|
|
HWND hWnd;
|
|
|
|
|
DLGPROC DlgProc;
|
|
|
|
|
LPARAM lParam;
|
|
|
|
|
} DIALOG_LIST_ENTRY, *PDIALOG_LIST_ENTRY;
|
|
|
|
|
|
2007-07-26 15:13:36 +00:00
|
|
|
|
/* GLOBALS ******************************************************************/
|
|
|
|
|
|
2014-01-11 16:20:31 +00:00
|
|
|
|
//static UINT_PTR IdTimer;
|
|
|
|
|
static LIST_ENTRY DialogListHead;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
|
2007-07-26 15:13:36 +00:00
|
|
|
|
/* FUNCTIONS ****************************************************************/
|
|
|
|
|
|
2014-01-11 16:20:31 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2018-05-21 09:33:02 +00:00
|
|
|
|
VOID
|
2018-05-21 09:20:50 +00:00
|
|
|
|
CloseAllDialogWindows(VOID)
|
2014-01-11 16:20:31 +00:00
|
|
|
|
{
|
|
|
|
|
PDIALOG_LIST_ENTRY Current;
|
|
|
|
|
PLIST_ENTRY ListEntry;
|
|
|
|
|
|
|
|
|
|
ListEntry = DialogListHead.Flink;
|
2018-05-21 09:20:50 +00:00
|
|
|
|
while (ListEntry != &DialogListHead)
|
2014-01-11 16:20:31 +00:00
|
|
|
|
{
|
|
|
|
|
Current = CONTAINING_RECORD(ListEntry,
|
|
|
|
|
DIALOG_LIST_ENTRY,
|
|
|
|
|
Entry);
|
|
|
|
|
|
2018-05-21 09:20:50 +00:00
|
|
|
|
PostMessage(Current->hWnd, WLX_WM_SAS, 0, 0);
|
2014-01-11 16:20:31 +00:00
|
|
|
|
|
2018-05-21 09:20:50 +00:00
|
|
|
|
ListEntry = ListEntry->Flink;
|
|
|
|
|
}
|
2014-01-11 16:20:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
static
|
|
|
|
|
INT_PTR
|
|
|
|
|
CALLBACK
|
2006-08-03 13:50:40 +00:00
|
|
|
|
DefaultWlxWindowProc(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
IN HWND hwndDlg,
|
|
|
|
|
IN UINT uMsg,
|
|
|
|
|
IN WPARAM wParam,
|
|
|
|
|
IN LPARAM lParam)
|
2006-08-03 13:50:40 +00:00
|
|
|
|
{
|
2014-01-11 16:20:31 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-14 22:27:34 +00:00
|
|
|
|
if (uMsg == WLX_WM_SAS)
|
2014-01-11 16:20:31 +00:00
|
|
|
|
{
|
2014-01-14 22:27:34 +00:00
|
|
|
|
EndDialog(hwndDlg, WLX_DLG_SAS);
|
2014-01-11 16:20:31 +00:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ListEntry->DlgProc(hwndDlg, uMsg, wParam, lParam);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
|
|
/*
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (uMsg == WM_TIMER && (UINT_PTR)wParam == IdTimer)
|
|
|
|
|
{
|
|
|
|
|
EndDialog(hwndDlg, -1);
|
|
|
|
|
KillTimer(hwndDlg, IdTimer);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
else if (uMsg == WM_INITDIALOG)
|
|
|
|
|
{
|
|
|
|
|
IdTimer = SetTimer(hwndDlg, 0, WLSession->DialogTimeout * 1000, NULL);
|
|
|
|
|
return PreviousWindowProc(hwndDlg, uMsg, wParam, lParam);
|
|
|
|
|
}
|
|
|
|
|
else if (uMsg == WM_NCDESTROY)
|
|
|
|
|
{
|
|
|
|
|
BOOL ret;
|
|
|
|
|
ret = PreviousWindowProc(hwndDlg, uMsg, wParam, lParam);
|
|
|
|
|
PreviousWindowProc = NULL;
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return PreviousWindowProc(hwndDlg, uMsg, wParam, lParam);
|
|
|
|
|
}
|
2014-01-11 16:20:31 +00:00
|
|
|
|
*/
|
2006-08-03 13:50:40 +00:00
|
|
|
|
}
|
2005-12-01 22:29:57 +00:00
|
|
|
|
|
2003-12-01 18:21:04 +00:00
|
|
|
|
/*
|
2004-03-28 12:21:41 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
VOID
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxUseCtrlAltDel(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
ULONG_PTR OldValue;
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxUseCtrlAltDel()\n");
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
WlxSetOption(hWlx, WLX_OPTION_USE_CTRL_ALT_DEL, TRUE, &OldValue);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2004-03-28 12:21:41 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
VOID
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxSetContextPointer(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
PVOID pWlxContext)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
ULONG_PTR OldValue;
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxSetContextPointer(%p)\n", pWlxContext);
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
WlxSetOption(hWlx, WLX_OPTION_CONTEXT_POINTER, (ULONG_PTR)pWlxContext, &OldValue);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2004-03-28 12:21:41 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
VOID
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxSasNotify(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
DWORD dwSasType)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLSESSION Session = (PWLSESSION)hWlx;
|
2006-08-10 18:37:03 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxSasNotify(0x%lx)\n", dwSasType);
|
2006-08-10 18:37:03 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL || dwSasType > WLX_SAS_TYPE_MAX_MSFT_VALUE)
|
|
|
|
|
PostMessageW(Session->SASWindow, WLX_WM_SAS, dwSasType, 0);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-08-03 13:50:40 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxSetTimeout(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
DWORD Timeout)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLSESSION Session = (PWLSESSION)hWlx;
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxSetTimeout(%lu)\n", Timeout);
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
Session->DialogTimeout = Timeout;
|
|
|
|
|
return TRUE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxAssignShellProtection(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
HANDLE hToken,
|
|
|
|
|
HANDLE hProcess,
|
|
|
|
|
HANDLE hThread)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
|
|
|
|
UNREFERENCED_PARAMETER(hToken);
|
|
|
|
|
UNREFERENCED_PARAMETER(hProcess);
|
|
|
|
|
UNREFERENCED_PARAMETER(hThread);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return 0;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-07-30 08:38:35 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxMessageBox(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
HWND hwndOwner,
|
|
|
|
|
LPWSTR lpszText,
|
|
|
|
|
LPWSTR lpszTitle,
|
|
|
|
|
UINT fuStyle)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxMessageBox()\n");
|
|
|
|
|
/* FIXME: Provide a custom window proc to be able to handle timeout */
|
|
|
|
|
return MessageBoxW(hwndOwner, lpszText, lpszTitle, fuStyle);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-07-30 08:38:35 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxDialogBox(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
HANDLE hInst,
|
|
|
|
|
LPWSTR lpszTemplate,
|
|
|
|
|
HWND hwndOwner,
|
|
|
|
|
DLGPROC dlgprc)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxDialogBox()\n");
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2014-01-11 16:20:31 +00:00
|
|
|
|
return (int)WlxDialogBoxParam(hWlx, hInst, lpszTemplate, hwndOwner, dlgprc, 0);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-07-30 08:38:35 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxDialogBoxParam(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
HANDLE hInst,
|
|
|
|
|
LPWSTR lpszTemplate,
|
|
|
|
|
HWND hwndOwner,
|
|
|
|
|
DLGPROC dlgprc,
|
|
|
|
|
LPARAM dwInitParam)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2014-01-11 16:20:31 +00:00
|
|
|
|
PDIALOG_LIST_ENTRY ListEntry;
|
|
|
|
|
int ret;
|
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxDialogBoxParam()\n");
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2014-01-11 16:20:31 +00:00
|
|
|
|
ListEntry = AddDialogListEntry();
|
|
|
|
|
if (ListEntry == NULL)
|
2013-12-08 14:31:40 +00:00
|
|
|
|
return -1;
|
2014-01-11 16:20:31 +00:00
|
|
|
|
|
|
|
|
|
ListEntry->DlgProc = dlgprc;
|
|
|
|
|
ListEntry->lParam = dwInitParam;
|
|
|
|
|
|
|
|
|
|
ret = (int)DialogBoxParamW(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc, (LPARAM)ListEntry);
|
|
|
|
|
|
|
|
|
|
RemoveDialogListEntry(ListEntry);
|
|
|
|
|
|
|
|
|
|
return ret;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-08-02 21:01:37 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxDialogBoxIndirect(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
HANDLE hInst,
|
|
|
|
|
LPCDLGTEMPLATE hDialogTemplate,
|
|
|
|
|
HWND hwndOwner,
|
|
|
|
|
DLGPROC dlgprc)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxDialogBoxIndirect()\n");
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2014-01-11 16:20:31 +00:00
|
|
|
|
return (int)WlxDialogBoxIndirectParam(hWlx, hInst, hDialogTemplate, hwndOwner, dlgprc, 0);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-07-30 08:38:35 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxDialogBoxIndirectParam(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
HANDLE hInst,
|
|
|
|
|
LPCDLGTEMPLATE hDialogTemplate,
|
|
|
|
|
HWND hwndOwner,
|
|
|
|
|
DLGPROC dlgprc,
|
|
|
|
|
LPARAM dwInitParam)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2014-01-11 16:20:31 +00:00
|
|
|
|
PDIALOG_LIST_ENTRY ListEntry;
|
|
|
|
|
int ret;
|
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxDialogBoxIndirectParam()\n");
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2014-01-11 16:20:31 +00:00
|
|
|
|
ListEntry = AddDialogListEntry();
|
|
|
|
|
if (ListEntry == NULL)
|
2013-12-08 14:31:40 +00:00
|
|
|
|
return -1;
|
2014-01-11 16:20:31 +00:00
|
|
|
|
|
|
|
|
|
ListEntry->DlgProc = dlgprc;
|
|
|
|
|
ListEntry->lParam = dwInitParam;
|
|
|
|
|
|
|
|
|
|
ret = (int)DialogBoxIndirectParamW(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc, (LPARAM)ListEntry);
|
|
|
|
|
|
|
|
|
|
RemoveDialogListEntry(ListEntry);
|
|
|
|
|
|
|
|
|
|
return ret;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-08-02 21:01:37 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxSwitchDesktopToUser(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLSESSION Session = (PWLSESSION)hWlx;
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxSwitchDesktopToUser()\n");
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
return (int)SwitchDesktop(Session->ApplicationDesktop);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-08-02 21:01:37 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxSwitchDesktopToWinlogon(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLSESSION Session = (PWLSESSION)hWlx;
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
TRACE("WlxSwitchDesktopToWinlogon()\n");
|
2006-08-06 15:47:04 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
return (int)SwitchDesktop(Session->WinlogonDesktop);
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxChangePasswordNotify(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
PWLX_MPR_NOTIFY_INFO pMprInfo,
|
|
|
|
|
DWORD dwChangeInfo)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
|
|
|
|
UNREFERENCED_PARAMETER(pMprInfo);
|
|
|
|
|
UNREFERENCED_PARAMETER(dwChangeInfo);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return 0;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxGetSourceDesktop(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
PWLX_DESKTOP* ppDesktop)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
|
|
|
|
UNREFERENCED_PARAMETER(ppDesktop);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxSetReturnDesktop(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
PWLX_DESKTOP pDesktop)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
|
|
|
|
UNREFERENCED_PARAMETER(pDesktop);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxCreateUserDesktop(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
HANDLE hToken,
|
|
|
|
|
DWORD Flags,
|
|
|
|
|
PWSTR pszDesktopName,
|
|
|
|
|
PWLX_DESKTOP* ppDesktop)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
|
|
|
|
UNREFERENCED_PARAMETER(hToken);
|
|
|
|
|
UNREFERENCED_PARAMETER(Flags);
|
|
|
|
|
UNREFERENCED_PARAMETER(pszDesktopName);
|
|
|
|
|
UNREFERENCED_PARAMETER(ppDesktop);
|
|
|
|
|
|
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
int
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxChangePasswordNotifyEx(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
PWLX_MPR_NOTIFY_INFO pMprInfo,
|
|
|
|
|
DWORD dwChangeInfo,
|
|
|
|
|
PWSTR ProviderName,
|
|
|
|
|
PVOID Reserved)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
|
|
|
|
UNREFERENCED_PARAMETER(pMprInfo);
|
|
|
|
|
UNREFERENCED_PARAMETER(dwChangeInfo);
|
|
|
|
|
UNREFERENCED_PARAMETER(ProviderName);
|
|
|
|
|
UNREFERENCED_PARAMETER(Reserved);
|
|
|
|
|
|
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return 0;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxCloseUserDesktop(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
PWLX_DESKTOP pDesktop,
|
|
|
|
|
HANDLE hToken)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
|
|
|
|
UNREFERENCED_PARAMETER(pDesktop);
|
|
|
|
|
UNREFERENCED_PARAMETER(hToken);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-08-09 14:29:12 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxSetOption(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
DWORD Option,
|
|
|
|
|
ULONG_PTR Value,
|
|
|
|
|
ULONG_PTR* OldValue)
|
2006-08-02 21:01:37 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLSESSION Session = (PWLSESSION)hWlx;
|
|
|
|
|
|
|
|
|
|
TRACE("WlxSetOption(%lu)\n", Option);
|
|
|
|
|
|
|
|
|
|
switch (Option)
|
|
|
|
|
{
|
|
|
|
|
case WLX_OPTION_USE_CTRL_ALT_DEL:
|
|
|
|
|
*OldValue = (ULONG_PTR)Session->Gina.UseCtrlAltDelete;
|
|
|
|
|
Session->Gina.UseCtrlAltDelete = (BOOL)Value;
|
|
|
|
|
return TRUE;
|
|
|
|
|
case WLX_OPTION_CONTEXT_POINTER:
|
|
|
|
|
*OldValue = (ULONG_PTR)Session->Gina.Context;
|
|
|
|
|
Session->Gina.Context = (PVOID)Value;
|
|
|
|
|
return TRUE;
|
|
|
|
|
case WLX_OPTION_USE_SMART_CARD:
|
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2006-08-04 11:37:18 +00:00
|
|
|
|
* @implemented
|
2003-12-01 18:21:04 +00:00
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxGetOption(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
DWORD Option,
|
|
|
|
|
ULONG_PTR* Value)
|
2006-08-02 21:01:37 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLSESSION Session = (PWLSESSION)hWlx;
|
|
|
|
|
|
|
|
|
|
TRACE("WlxGetOption(%lu)\n", Option);
|
|
|
|
|
|
|
|
|
|
switch (Option)
|
|
|
|
|
{
|
|
|
|
|
case WLX_OPTION_USE_CTRL_ALT_DEL:
|
|
|
|
|
*Value = (ULONG_PTR)Session->Gina.UseCtrlAltDelete;
|
|
|
|
|
return TRUE;
|
|
|
|
|
case WLX_OPTION_CONTEXT_POINTER:
|
|
|
|
|
{
|
|
|
|
|
*Value = (ULONG_PTR)Session->Gina.Context;
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
case WLX_OPTION_USE_SMART_CARD:
|
|
|
|
|
case WLX_OPTION_SMART_CARD_PRESENT:
|
|
|
|
|
case WLX_OPTION_SMART_CARD_INFO:
|
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
|
|
|
|
case WLX_OPTION_DISPATCH_TABLE_SIZE:
|
|
|
|
|
{
|
|
|
|
|
switch (Session->Gina.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 FALSE;
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
VOID
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxWin31Migrate(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxQueryClientCredentials(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(pCred);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WlxQueryInetConnectorCredentials(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(pCred);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2006-08-02 21:01:37 +00:00
|
|
|
|
WlxDisconnect(VOID)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
DWORD
|
|
|
|
|
WINAPI
|
2006-08-02 21:01:37 +00:00
|
|
|
|
WlxQueryTerminalServicesData(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HANDLE hWlx,
|
|
|
|
|
PWLX_TERMINAL_SERVICES_DATA pTSData,
|
|
|
|
|
WCHAR* UserName,
|
|
|
|
|
WCHAR* Domain)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(hWlx);
|
|
|
|
|
UNREFERENCED_PARAMETER(pTSData);
|
|
|
|
|
UNREFERENCED_PARAMETER(UserName);
|
|
|
|
|
UNREFERENCED_PARAMETER(Domain);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return 0;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
DWORD
|
|
|
|
|
WINAPI
|
2006-08-02 21:01:37 +00:00
|
|
|
|
WlxQueryConsoleSwitchCredentials(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 pCred)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(pCred);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return 0;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @unimplemented
|
|
|
|
|
*/
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2006-08-02 21:01:37 +00:00
|
|
|
|
WlxQueryTsLogonCredentials(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
PWLX_CLIENT_CREDENTIALS_INFO_V2_0 pCred)
|
2003-12-01 18:21:04 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNREFERENCED_PARAMETER(pCred);
|
2006-09-26 19:18:02 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
|
return FALSE;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
2006-08-06 15:47:04 +00:00
|
|
|
|
static
|
2003-12-01 18:21:04 +00:00
|
|
|
|
WLX_DISPATCH_VERSION_1_4 FunctionTable = {
|
2013-12-08 14:31:40 +00:00
|
|
|
|
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
|
2003-12-01 18:21:04 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
static
|
|
|
|
|
BOOL
|
2006-08-02 21:01:37 +00:00
|
|
|
|
GetGinaPath(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
OUT LPWSTR Path,
|
|
|
|
|
IN DWORD Len)
|
2006-08-02 21:01:37 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
LONG Status;
|
|
|
|
|
DWORD Type, Size;
|
|
|
|
|
HKEY hKey;
|
|
|
|
|
|
|
|
|
|
Status = RegOpenKeyExW(
|
|
|
|
|
HKEY_LOCAL_MACHINE,
|
|
|
|
|
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
|
|
|
|
|
0,
|
|
|
|
|
KEY_QUERY_VALUE,
|
|
|
|
|
&hKey);
|
|
|
|
|
if (Status != ERROR_SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
/* Default value */
|
|
|
|
|
wcsncpy(Path, L"msgina.dll", Len);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Size = Len * sizeof(WCHAR);
|
|
|
|
|
Status = RegQueryValueExW(
|
|
|
|
|
hKey,
|
|
|
|
|
L"GinaDLL",
|
|
|
|
|
NULL,
|
|
|
|
|
&Type,
|
|
|
|
|
(LPBYTE)Path,
|
|
|
|
|
&Size);
|
|
|
|
|
if (Status != ERROR_SUCCESS || Type != REG_SZ || Size == 0)
|
|
|
|
|
wcsncpy(Path, L"msgina.dll", Len);
|
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
|
return TRUE;
|
2006-08-02 21:01:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
static
|
|
|
|
|
BOOL
|
|
|
|
|
WINAPI
|
2006-08-10 18:37:03 +00:00
|
|
|
|
DefaultWlxScreenSaverNotify(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
IN PVOID pWlxContext,
|
|
|
|
|
IN OUT BOOL *pSecure)
|
2006-08-10 18:37:03 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (*pSecure)
|
|
|
|
|
*pSecure = WLSession->Gina.Functions.WlxIsLogoffOk(pWlxContext);
|
|
|
|
|
return TRUE;
|
2006-08-10 18:37:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
static
|
|
|
|
|
BOOL
|
2006-08-02 21:01:37 +00:00
|
|
|
|
LoadGina(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
IN OUT PGINAFUNCTIONS Functions,
|
|
|
|
|
OUT DWORD *DllVersion,
|
|
|
|
|
OUT HMODULE *GinaInstance)
|
2006-08-02 21:01:37 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
HMODULE hGina = NULL;
|
|
|
|
|
WCHAR GinaDll[MAX_PATH + 1];
|
|
|
|
|
BOOL ret = FALSE;
|
|
|
|
|
|
|
|
|
|
GinaDll[0] = '\0';
|
|
|
|
|
if (!GetGinaPath(GinaDll, MAX_PATH))
|
|
|
|
|
goto cleanup;
|
|
|
|
|
/* Terminate string */
|
|
|
|
|
GinaDll[MAX_PATH] = '\0';
|
|
|
|
|
|
|
|
|
|
hGina = LoadLibraryW(GinaDll);
|
|
|
|
|
if (!hGina)
|
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
|
|
Functions->WlxNegotiate = (PFWLXNEGOTIATE)GetProcAddress(hGina, "WlxNegotiate");
|
|
|
|
|
Functions->WlxInitialize = (PFWLXINITIALIZE)GetProcAddress(hGina, "WlxInitialize");
|
|
|
|
|
|
|
|
|
|
if (!Functions->WlxInitialize)
|
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
|
|
if (!Functions->WlxNegotiate)
|
|
|
|
|
{
|
|
|
|
|
/* Assume current version */
|
|
|
|
|
*DllVersion = WLX_CURRENT_VERSION;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2016-11-05 14:55:55 +00:00
|
|
|
|
TRACE("About to negotiate with Gina %S. Winlogon uses version %x\n",
|
2013-12-08 14:31:40 +00:00
|
|
|
|
GinaDll, WLX_CURRENT_VERSION);
|
|
|
|
|
if (!Functions->WlxNegotiate(WLX_CURRENT_VERSION, DllVersion))
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TRACE("Gina uses WLX_VERSION %lx\n", *DllVersion);
|
|
|
|
|
|
|
|
|
|
if (*DllVersion >= WLX_VERSION_1_0)
|
|
|
|
|
{
|
|
|
|
|
Functions->WlxActivateUserShell = (PFWLXACTIVATEUSERSHELL)GetProcAddress(hGina, "WlxActivateUserShell");
|
|
|
|
|
if (!Functions->WlxActivateUserShell) goto cleanup;
|
|
|
|
|
Functions->WlxDisplayLockedNotice = (PFWLXDISPLAYLOCKEDNOTICE)GetProcAddress(hGina, "WlxDisplayLockedNotice");
|
|
|
|
|
if (!Functions->WlxDisplayLockedNotice) goto cleanup;
|
|
|
|
|
Functions->WlxDisplaySASNotice = (PFWLXDISPLAYSASNOTICE)GetProcAddress(hGina, "WlxDisplaySASNotice");
|
|
|
|
|
if (!Functions->WlxDisplaySASNotice) goto cleanup;
|
|
|
|
|
Functions->WlxIsLockOk = (PFWLXISLOCKOK)GetProcAddress(hGina, "WlxIsLockOk");
|
|
|
|
|
if (!Functions->WlxIsLockOk) goto cleanup;
|
|
|
|
|
Functions->WlxIsLogoffOk = (PFWLXISLOGOFFOK)GetProcAddress(hGina, "WlxIsLogoffOk");
|
|
|
|
|
if (!Functions->WlxIsLogoffOk) goto cleanup;
|
|
|
|
|
Functions->WlxLoggedOnSAS = (PFWLXLOGGEDONSAS)GetProcAddress(hGina, "WlxLoggedOnSAS");
|
|
|
|
|
if (!Functions->WlxLoggedOnSAS) goto cleanup;
|
|
|
|
|
Functions->WlxLoggedOutSAS = (PFWLXLOGGEDOUTSAS)GetProcAddress(hGina, "WlxLoggedOutSAS");
|
|
|
|
|
if (!Functions->WlxLoggedOutSAS) goto cleanup;
|
|
|
|
|
Functions->WlxLogoff = (PFWLXLOGOFF)GetProcAddress(hGina, "WlxLogoff");
|
|
|
|
|
if (!Functions->WlxLogoff) goto cleanup;
|
|
|
|
|
Functions->WlxShutdown = (PFWLXSHUTDOWN)GetProcAddress(hGina, "WlxShutdown");
|
|
|
|
|
if (!Functions->WlxShutdown) goto cleanup;
|
|
|
|
|
Functions->WlxWkstaLockedSAS = (PFWLXWKSTALOCKEDSAS)GetProcAddress(hGina, "WlxWkstaLockedSAS");
|
|
|
|
|
if (!Functions->WlxWkstaLockedSAS) goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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->WlxDisplayStatusMessage = (PFWLXDISPLAYSTATUSMESSAGE)GetProcAddress(hGina, "WlxDisplayStatusMessage");
|
|
|
|
|
if (!Functions->WlxDisplayStatusMessage) goto cleanup;
|
|
|
|
|
Functions->WlxGetStatusMessage = (PFWLXGETSTATUSMESSAGE)GetProcAddress(hGina, "WlxGetStatusMessage");
|
|
|
|
|
if (!Functions->WlxGetStatusMessage) goto cleanup;
|
|
|
|
|
Functions->WlxNetworkProviderLoad = (PFWLXNETWORKPROVIDERLOAD)GetProcAddress(hGina, "WlxNetworkProviderLoad");
|
|
|
|
|
if (!Functions->WlxNetworkProviderLoad) goto cleanup;
|
|
|
|
|
Functions->WlxRemoveStatusMessage = (PFWLXREMOVESTATUSMESSAGE)GetProcAddress(hGina, "WlxRemoveStatusMessage");
|
|
|
|
|
if (!Functions->WlxRemoveStatusMessage) goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Provide some default functions */
|
|
|
|
|
if (!Functions->WlxScreenSaverNotify)
|
|
|
|
|
Functions->WlxScreenSaverNotify = DefaultWlxScreenSaverNotify;
|
|
|
|
|
|
|
|
|
|
ret = TRUE;
|
2006-08-04 11:37:18 +00:00
|
|
|
|
|
|
|
|
|
cleanup:
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (!ret)
|
|
|
|
|
{
|
|
|
|
|
if (hGina)
|
|
|
|
|
FreeLibrary(hGina);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
*GinaInstance = hGina;
|
|
|
|
|
return ret;
|
2006-08-02 21:01:37 +00:00
|
|
|
|
}
|
2003-12-01 18:21:04 +00:00
|
|
|
|
|
|
|
|
|
BOOL
|
2006-08-02 21:01:37 +00:00
|
|
|
|
GinaInit(
|
2013-12-08 14:31:40 +00:00
|
|
|
|
IN OUT PWLSESSION Session)
|
2006-08-02 21:01:37 +00:00
|
|
|
|
{
|
2013-12-08 14:31:40 +00:00
|
|
|
|
DWORD GinaDllVersion;
|
|
|
|
|
|
|
|
|
|
if (!LoadGina(&Session->Gina.Functions, &GinaDllVersion, &Session->Gina.hDllInstance))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
Session->Gina.Context = NULL;
|
|
|
|
|
Session->Gina.Version = GinaDllVersion;
|
|
|
|
|
Session->Gina.UseCtrlAltDelete = FALSE;
|
|
|
|
|
Session->SuppressStatus = FALSE;
|
|
|
|
|
|
|
|
|
|
TRACE("Calling WlxInitialize(\"%S\")\n", Session->InteractiveWindowStationName);
|
|
|
|
|
return Session->Gina.Functions.WlxInitialize(
|
|
|
|
|
Session->InteractiveWindowStationName,
|
|
|
|
|
(HANDLE)Session,
|
|
|
|
|
NULL,
|
|
|
|
|
(PVOID)&FunctionTable,
|
|
|
|
|
&Session->Gina.Context);
|
2004-03-28 12:21:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL
|
2006-08-02 21:01:37 +00:00
|
|
|
|
CreateWindowStationAndDesktops(
|
2022-04-02 16:16:40 +00:00
|
|
|
|
_Inout_ PWLSESSION Session)
|
2006-08-02 21:01:37 +00:00
|
|
|
|
{
|
2022-04-02 16:16:40 +00:00
|
|
|
|
SECURITY_ATTRIBUTES WinstaSecurity;
|
|
|
|
|
SECURITY_ATTRIBUTES ApplicationDesktopSecurity;
|
|
|
|
|
SECURITY_ATTRIBUTES WinlogonDesktopSecurity;
|
|
|
|
|
SECURITY_ATTRIBUTES ScreenSaverDesktopSecurity;
|
|
|
|
|
PSECURITY_DESCRIPTOR WlWinstaSecurityDescriptor;
|
|
|
|
|
PSECURITY_DESCRIPTOR WlApplicationDesktopSecurityDescriptor;
|
|
|
|
|
PSECURITY_DESCRIPTOR WlWinlogonDesktopSecurityDescriptor;
|
|
|
|
|
PSECURITY_DESCRIPTOR WlScreenSaverDesktopSecurityDescriptor;
|
2013-12-08 14:31:40 +00:00
|
|
|
|
BOOL ret = FALSE;
|
|
|
|
|
|
2022-04-02 16:16:40 +00:00
|
|
|
|
if (!CreateWinstaSecurity(&WlWinstaSecurityDescriptor))
|
2013-12-08 14:31:40 +00:00
|
|
|
|
{
|
2022-04-02 16:16:40 +00:00
|
|
|
|
ERR("WL: Failed to create winsta security!\n");
|
|
|
|
|
return ret;
|
2013-12-08 14:31:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-04-02 16:16:40 +00:00
|
|
|
|
WinstaSecurity.nLength = sizeof(SECURITY_ATTRIBUTES);
|
|
|
|
|
WinstaSecurity.lpSecurityDescriptor = WlWinstaSecurityDescriptor;
|
|
|
|
|
WinstaSecurity.bInheritHandle = TRUE;
|
2013-12-08 14:31:40 +00:00
|
|
|
|
|
2022-04-02 16:16:40 +00:00
|
|
|
|
if (!CreateApplicationDesktopSecurity(&WlApplicationDesktopSecurityDescriptor))
|
2013-12-08 14:31:40 +00:00
|
|
|
|
{
|
2022-04-02 16:16:40 +00:00
|
|
|
|
ERR("WL: Failed to create application desktop security!\n");
|
2013-12-08 14:31:40 +00:00
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-02 16:16:40 +00:00
|
|
|
|
ApplicationDesktopSecurity.nLength = sizeof(SECURITY_ATTRIBUTES);
|
|
|
|
|
ApplicationDesktopSecurity.lpSecurityDescriptor = WlApplicationDesktopSecurityDescriptor;
|
|
|
|
|
ApplicationDesktopSecurity.bInheritHandle = TRUE;
|
2013-12-08 14:31:40 +00:00
|
|
|
|
|
2022-04-02 16:16:40 +00:00
|
|
|
|
if (!CreateWinlogonDesktopSecurity(&WlWinlogonDesktopSecurityDescriptor))
|
2013-12-08 14:31:40 +00:00
|
|
|
|
{
|
2022-04-02 16:16:40 +00:00
|
|
|
|
ERR("WL: Failed to create winlogon desktop security!\n");
|
2013-12-08 14:31:40 +00:00
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-02 16:16:40 +00:00
|
|
|
|
WinlogonDesktopSecurity.nLength = sizeof(SECURITY_ATTRIBUTES);
|
|
|
|
|
WinlogonDesktopSecurity.lpSecurityDescriptor = WlWinlogonDesktopSecurityDescriptor;
|
|
|
|
|
WinlogonDesktopSecurity.bInheritHandle = FALSE;
|
2013-12-08 14:31:40 +00:00
|
|
|
|
|
2022-04-02 16:16:40 +00:00
|
|
|
|
if (!CreateScreenSaverSecurity(&WlScreenSaverDesktopSecurityDescriptor))
|
2013-12-08 14:31:40 +00:00
|
|
|
|
{
|
2022-04-02 16:16:40 +00:00
|
|
|
|
ERR("WL: Failed to create winlogon desktop security!\n");
|
2013-12-08 14:31:40 +00:00
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-02 16:16:40 +00:00
|
|
|
|
ScreenSaverDesktopSecurity.nLength = sizeof(SECURITY_ATTRIBUTES);
|
|
|
|
|
ScreenSaverDesktopSecurity.lpSecurityDescriptor = WlScreenSaverDesktopSecurityDescriptor;
|
|
|
|
|
ScreenSaverDesktopSecurity.bInheritHandle = TRUE;
|
2013-12-08 14:31:40 +00:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Create the interactive window station
|
|
|
|
|
*/
|
|
|
|
|
Session->InteractiveWindowStationName = L"WinSta0";
|
|
|
|
|
Session->InteractiveWindowStation = CreateWindowStationW(
|
|
|
|
|
Session->InteractiveWindowStationName,
|
|
|
|
|
0,
|
2015-03-23 07:46:17 +00:00
|
|
|
|
MAXIMUM_ALLOWED,
|
2022-04-02 16:16:40 +00:00
|
|
|
|
&WinstaSecurity);
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (!Session->InteractiveWindowStation)
|
|
|
|
|
{
|
|
|
|
|
ERR("WL: Failed to create window station (%lu)\n", GetLastError());
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
2022-04-02 16:16:40 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (!SetProcessWindowStation(Session->InteractiveWindowStation))
|
|
|
|
|
{
|
|
|
|
|
ERR("WL: SetProcessWindowStation() failed (error %lu)\n", GetLastError());
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Create the application desktop
|
|
|
|
|
*/
|
|
|
|
|
Session->ApplicationDesktop = CreateDesktopW(
|
|
|
|
|
L"Default",
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
0, /* FIXME: Add DF_ALLOWOTHERACCOUNTHOOK flag? */
|
2015-03-23 07:46:17 +00:00
|
|
|
|
MAXIMUM_ALLOWED,
|
2022-04-02 16:16:40 +00:00
|
|
|
|
&ApplicationDesktopSecurity);
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (!Session->ApplicationDesktop)
|
|
|
|
|
{
|
|
|
|
|
ERR("WL: Failed to create Default desktop (%lu)\n", GetLastError());
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Create the winlogon desktop
|
|
|
|
|
*/
|
|
|
|
|
Session->WinlogonDesktop = CreateDesktopW(
|
|
|
|
|
L"Winlogon",
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
0,
|
2015-03-23 07:46:17 +00:00
|
|
|
|
MAXIMUM_ALLOWED,
|
2022-04-02 16:16:40 +00:00
|
|
|
|
&WinlogonDesktopSecurity);
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (!Session->WinlogonDesktop)
|
|
|
|
|
{
|
|
|
|
|
ERR("WL: Failed to create Winlogon desktop (%lu)\n", GetLastError());
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Create the screen saver desktop
|
|
|
|
|
*/
|
|
|
|
|
Session->ScreenSaverDesktop = CreateDesktopW(
|
|
|
|
|
L"Screen-Saver",
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
0,
|
2015-03-23 07:46:17 +00:00
|
|
|
|
MAXIMUM_ALLOWED,
|
2022-04-02 16:16:40 +00:00
|
|
|
|
&ScreenSaverDesktopSecurity);
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if(!Session->ScreenSaverDesktop)
|
|
|
|
|
{
|
|
|
|
|
ERR("WL: Failed to create Screen-Saver desktop (%lu)\n", GetLastError());
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Switch to winlogon desktop
|
|
|
|
|
*/
|
|
|
|
|
if (!SetThreadDesktop(Session->WinlogonDesktop) ||
|
|
|
|
|
!SwitchDesktop(Session->WinlogonDesktop))
|
|
|
|
|
{
|
|
|
|
|
ERR("WL: Cannot switch to Winlogon desktop (%lu)\n", GetLastError());
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-16 23:44:00 +00:00
|
|
|
|
SetWindowStationUser(Session->InteractiveWindowStation,
|
|
|
|
|
&LuidNone, NULL, 0);
|
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
ret = TRUE;
|
2006-08-07 17:18:58 +00:00
|
|
|
|
|
|
|
|
|
cleanup:
|
2013-12-08 14:31:40 +00:00
|
|
|
|
if (!ret)
|
|
|
|
|
{
|
|
|
|
|
if (Session->ApplicationDesktop)
|
|
|
|
|
{
|
|
|
|
|
CloseDesktop(Session->ApplicationDesktop);
|
|
|
|
|
Session->ApplicationDesktop = NULL;
|
|
|
|
|
}
|
|
|
|
|
if (Session->WinlogonDesktop)
|
|
|
|
|
{
|
|
|
|
|
CloseDesktop(Session->WinlogonDesktop);
|
|
|
|
|
Session->WinlogonDesktop = NULL;
|
|
|
|
|
}
|
|
|
|
|
if (Session->ScreenSaverDesktop)
|
|
|
|
|
{
|
|
|
|
|
CloseDesktop(Session->ScreenSaverDesktop);
|
|
|
|
|
Session->ScreenSaverDesktop = NULL;
|
|
|
|
|
}
|
|
|
|
|
if (Session->InteractiveWindowStation)
|
|
|
|
|
{
|
|
|
|
|
CloseWindowStation(Session->InteractiveWindowStation);
|
|
|
|
|
Session->InteractiveWindowStation = NULL;
|
|
|
|
|
}
|
2022-04-02 16:16:40 +00:00
|
|
|
|
if (WlWinstaSecurityDescriptor)
|
|
|
|
|
{
|
|
|
|
|
RtlFreeHeap(RtlGetProcessHeap(), 0, WlWinstaSecurityDescriptor);
|
|
|
|
|
}
|
|
|
|
|
if (WlApplicationDesktopSecurityDescriptor)
|
|
|
|
|
{
|
|
|
|
|
RtlFreeHeap(RtlGetProcessHeap(), 0, WlApplicationDesktopSecurityDescriptor);
|
|
|
|
|
}
|
|
|
|
|
if (WlWinlogonDesktopSecurityDescriptor)
|
|
|
|
|
{
|
|
|
|
|
RtlFreeHeap(RtlGetProcessHeap(), 0, WlWinlogonDesktopSecurityDescriptor);
|
|
|
|
|
}
|
|
|
|
|
if (WlScreenSaverDesktopSecurityDescriptor)
|
|
|
|
|
{
|
|
|
|
|
RtlFreeHeap(RtlGetProcessHeap(), 0, WlScreenSaverDesktopSecurityDescriptor);
|
|
|
|
|
}
|
2013-12-08 14:31:40 +00:00
|
|
|
|
}
|
2022-04-02 16:16:40 +00:00
|
|
|
|
|
2013-12-08 14:31:40 +00:00
|
|
|
|
return ret;
|
2003-12-01 18:21:04 +00:00
|
|
|
|
}
|