44 if (ListEntry ==
NULL)
47 TRACE(
"Add entry %p\n", ListEntry);
60 TRACE(
"Remove entry %p\n", ListEntry);
80 if (Current->
hWnd == hwndDlg)
82 TRACE(
"Found entry: %p\n", Current);
86 ListEntry = ListEntry->
Flink;
89 TRACE(
"Found no entry!\n");
109 ListEntry = ListEntry->
Flink;
130 TRACE(
"Set dialog handle: %p\n", hwndDlg);
131 ListEntry->
hWnd = hwndDlg;
138 if (ListEntry ==
NULL)
205 TRACE(
"WlxUseCtrlAltDel()\n");
221 TRACE(
"WlxSetContextPointer(%p)\n", pWlxContext);
237 TRACE(
"WlxSasNotify(0x%lx)\n", dwSasType);
294 TRACE(
"WlxMessageBox()\n");
296 return MessageBoxW(hwndOwner, lpszText, lpszTitle, fuStyle);
313 TRACE(
"WlxDialogBox()\n");
336 TRACE(
"WlxDialogBoxParam()\n");
339 if (ListEntry ==
NULL)
343 ListEntry->
lParam = dwInitParam;
366 TRACE(
"WlxDialogBoxIndirect()\n");
389 TRACE(
"WlxDialogBoxIndirectParam()\n");
392 if (ListEntry ==
NULL)
396 ListEntry->
lParam = dwInitParam;
416 TRACE(
"WlxSwitchDesktopToUser()\n");
435 TRACE(
"WlxSwitchDesktopToWinlogon()\n");
502 PWSTR pszDesktopName,
568 TRACE(
"WlxSetOption(%lu)\n", Option);
600 TRACE(
"WlxGetOption(%lu)\n", Option);
791 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
852 if (!Functions->WlxInitialize)
855 if (!Functions->WlxNegotiate)
862 TRACE(
"About to negotiate with Gina %S. Winlogon uses version %x\n",
868 TRACE(
"Gina uses WLX_VERSION %lx\n", *DllVersion);
873 if (!Functions->WlxActivateUserShell)
goto cleanup;
875 if (!Functions->WlxDisplayLockedNotice)
goto cleanup;
877 if (!Functions->WlxDisplaySASNotice)
goto cleanup;
879 if (!Functions->WlxIsLockOk)
goto cleanup;
881 if (!Functions->WlxIsLogoffOk)
goto cleanup;
883 if (!Functions->WlxLoggedOnSAS)
goto cleanup;
885 if (!Functions->WlxLoggedOutSAS)
goto cleanup;
887 if (!Functions->WlxLogoff)
goto cleanup;
889 if (!Functions->WlxShutdown)
goto cleanup;
891 if (!Functions->WlxWkstaLockedSAS)
goto cleanup;
903 if (!Functions->WlxDisplayStatusMessage)
goto cleanup;
905 if (!Functions->WlxGetStatusMessage)
goto cleanup;
907 if (!Functions->WlxNetworkProviderLoad)
goto cleanup;
909 if (!Functions->WlxRemoveStatusMessage)
goto cleanup;
913 if (!Functions->WlxScreenSaverNotify)
925 *GinaInstance = hGina;
933 DWORD GinaDllVersion;
935 if (!
LoadGina(&Session->Gina.Functions, &GinaDllVersion, &Session->Gina.hDllInstance))
938 Session->Gina.Context =
NULL;
939 Session->Gina.Version = GinaDllVersion;
940 Session->Gina.UseCtrlAltDelete =
FALSE;
941 Session->SuppressStatus =
FALSE;
943 TRACE(
"Calling WlxInitialize(\"%S\")\n", Session->InteractiveWindowStationName);
944 return Session->Gina.Functions.WlxInitialize(
945 Session->InteractiveWindowStationName,
949 &Session->Gina.Context);
968 ERR(
"WL: Failed to create winsta security!\n");
978 ERR(
"WL: Failed to create application desktop security!\n");
988 ERR(
"WL: Failed to create winlogon desktop security!\n");
998 ERR(
"WL: Failed to create winlogon desktop security!\n");
1009 Session->InteractiveWindowStationName =
L"WinSta0";
1011 Session->InteractiveWindowStationName,
1015 if (!Session->InteractiveWindowStation)
1023 ERR(
"WL: SetProcessWindowStation() failed (error %lu)\n",
GetLastError());
1036 &ApplicationDesktopSecurity);
1037 if (!Session->ApplicationDesktop)
1052 &WinlogonDesktopSecurity);
1053 if (!Session->WinlogonDesktop)
1068 &ScreenSaverDesktopSecurity);
1069 if(!Session->ScreenSaverDesktop)
1071 ERR(
"WL: Failed to create Screen-Saver desktop (%lu)\n",
GetLastError());
1093 if (Session->ApplicationDesktop)
1096 Session->ApplicationDesktop =
NULL;
1098 if (Session->WinlogonDesktop)
1101 Session->WinlogonDesktop =
NULL;
1103 if (Session->ScreenSaverDesktop)
1106 Session->ScreenSaverDesktop =
NULL;
1108 if (Session->InteractiveWindowStation)
1111 Session->InteractiveWindowStation =
NULL;
1113 if (WlWinstaSecurityDescriptor)
1115 RtlFreeHeap(RtlGetProcessHeap(), 0, WlWinstaSecurityDescriptor);
1117 if (WlApplicationDesktopSecurityDescriptor)
1119 RtlFreeHeap(RtlGetProcessHeap(), 0, WlApplicationDesktopSecurityDescriptor);
1121 if (WlWinlogonDesktopSecurityDescriptor)
1123 RtlFreeHeap(RtlGetProcessHeap(), 0, WlWinlogonDesktopSecurityDescriptor);
1125 if (WlScreenSaverDesktopSecurityDescriptor)
1127 RtlFreeHeap(RtlGetProcessHeap(), 0, WlScreenSaverDesktopSecurityDescriptor);
PRTL_UNICODE_STRING_BUFFER Path
BOOL CreateApplicationDesktopSecurity(_Out_ PSECURITY_DESCRIPTOR *ApplicationDesktopSd)
Creates a security descriptor for the default application desktop upon its creation.
BOOL CreateWinstaSecurity(_Out_ PSECURITY_DESCRIPTOR *WinstaSd)
Creates a security descriptor for the default window station upon its creation.
BOOL CreateWinlogonDesktopSecurity(_Out_ PSECURITY_DESCRIPTOR *WinlogonDesktopSd)
Creates a security descriptor for the default Winlogon desktop. This descriptor serves as a security ...
BOOL CreateScreenSaverSecurity(_Out_ PSECURITY_DESCRIPTOR *ScreenSaverDesktopSd)
Creates a security descriptor for the screen saver desktop.
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define RegCloseKey(hKey)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES
#define GetProcAddress(x, y)
static void cleanup(void)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
#define RemoveEntryList(Entry)
#define InsertHeadList(ListHead, Entry)
#define InitializeListHead(ListHead)
_In_ BOOL _In_ HANDLE hProcess
#define UNREFERENCED_PARAMETER(P)
base of all file and directory entries
PFWLXISLOGOFFOK WlxIsLogoffOk
struct _LIST_ENTRY * Flink
LPVOID lpSecurityDescriptor
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
HDESK WINAPI CreateDesktopW(LPCWSTR lpszDesktop, LPCWSTR lpszDevice, LPDEVMODEW pDevmode, DWORD dwFlags, ACCESS_MASK dwDesiredAccess, LPSECURITY_ATTRIBUTES lpsa)
DWORD WINAPI GetLastError(void)
_Reserved_ PVOID Reserved
int(WINAPI * PFWLXWKSTALOCKEDSAS)(PVOID, DWORD)
VOID(WINAPI * PFWLXDISPLAYLOCKEDNOTICE)(PVOID)
int(WINAPI * PFWLXLOGGEDOUTSAS)(PVOID, DWORD, PLUID, PSID, PDWORD, PHANDLE, PWLX_MPR_NOTIFY_INFO, PVOID *)
BOOL(WINAPI * PFWLXNEGOTIATE)(DWORD, DWORD *)
VOID(WINAPI * PFWLXSHUTDOWN)(PVOID, DWORD)
BOOL WINAPI SetWindowStationUser(IN HWINSTA hWindowStation, IN PLUID pluid, IN PSID psid OPTIONAL, IN DWORD size)
BOOL(WINAPI * PFWLXISLOGOFFOK)(PVOID)
VOID(WINAPI * PFWLXLOGOFF)(PVOID)
BOOL(WINAPI * PFWLXREMOVESTATUSMESSAGE)(PVOID)
BOOL(WINAPI * PFWLXSTARTAPPLICATION)(PVOID, PWSTR, PVOID, PWSTR)
BOOL(WINAPI * PFWLXINITIALIZE)(LPWSTR, HANDLE, PVOID, PVOID, PVOID *)
BOOL(WINAPI * PFWLXSCREENSAVERNOTIFY)(PVOID, BOOL *)
struct _WLSESSION * PWLSESSION
BOOL(WINAPI * PFWLXNETWORKPROVIDERLOAD)(PVOID, PWLX_MPR_NOTIFY_INFO)
BOOL(WINAPI * PFWLXGETSTATUSMESSAGE)(PVOID, DWORD *, PWSTR, DWORD)
BOOL(WINAPI * PFWLXISLOCKOK)(PVOID)
BOOL(WINAPI * PFWLXDISPLAYSTATUSMESSAGE)(PVOID, HDESK, DWORD, PWSTR, PWSTR)
VOID(WINAPI * PFWLXDISPLAYSASNOTICE)(PVOID)
int(WINAPI * PFWLXLOGGEDONSAS)(PVOID, DWORD, PVOID)
BOOL(WINAPI * PFWLXACTIVATEUSERSHELL)(PVOID, PWSTR, PWSTR, PVOID)
#define HKEY_LOCAL_MACHINE
INT_PTR WINAPI DialogBoxIndirectParamW(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
BOOL WINAPI SwitchDesktop(_In_ HDESK)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI SetThreadDesktop(_In_ HDESK)
HWINSTA WINAPI CreateWindowStationW(_In_opt_ LPCWSTR lpwinsta, _In_ DWORD dwFlags, _In_ ACCESS_MASK dwDesiredAccess, _In_opt_ LPSECURITY_ATTRIBUTES lpsa)
BOOL WINAPI CloseWindowStation(_In_ HWINSTA)
BOOL WINAPI SetProcessWindowStation(_In_ HWINSTA)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
BOOL WINAPI CloseDesktop(_In_ HDESK)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define WLX_SAS_TYPE_TIMEOUT
#define WLX_OPTION_USE_CTRL_ALT_DEL
#define WLX_SAS_TYPE_CTRL_ALT_DEL
#define WLX_SAS_TYPE_SCRNSVR_TIMEOUT
#define WLX_CURRENT_VERSION
struct _WLX_DISPATCH_VERSION_1_3 WLX_DISPATCH_VERSION_1_3
#define WLX_OPTION_USE_SMART_CARD
#define WLX_SAS_TYPE_USER_LOGOFF
#define WLX_DLG_USER_LOGOFF
#define WLX_OPTION_SMART_CARD_PRESENT
#define WLX_OPTION_DISPATCH_TABLE_SIZE
struct _WLX_DISPATCH_VERSION_1_0 WLX_DISPATCH_VERSION_1_0
struct _WLX_DISPATCH_VERSION_1_1 WLX_DISPATCH_VERSION_1_1
struct _WLX_DISPATCH_VERSION_1_2 WLX_DISPATCH_VERSION_1_2
#define WLX_OPTION_CONTEXT_POINTER
#define WLX_OPTION_SMART_CARD_INFO
struct _WLX_DISPATCH_VERSION_1_4 WLX_DISPATCH_VERSION_1_4
#define WLX_DLG_SCREEN_SAVER_TIMEOUT
#define WLX_SAS_TYPE_MAX_MSFT_VALUE
#define WLX_DLG_INPUT_TIMEOUT
static VOID RemoveDialogListEntry(PDIALOG_LIST_ENTRY ListEntry)
BOOL WINAPI WlxCloseUserDesktop(HANDLE hWlx, PWLX_DESKTOP pDesktop, HANDLE hToken)
DWORD WINAPI WlxQueryConsoleSwitchCredentials(PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 pCred)
int WINAPI WlxDialogBoxParam(HANDLE hWlx, HANDLE hInst, LPWSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM dwInitParam)
BOOL WINAPI WlxCreateUserDesktop(HANDLE hWlx, HANDLE hToken, DWORD Flags, PWSTR pszDesktopName, PWLX_DESKTOP *ppDesktop)
int WINAPI WlxAssignShellProtection(HANDLE hWlx, HANDLE hToken, HANDLE hProcess, HANDLE hThread)
static PDIALOG_LIST_ENTRY AddDialogListEntry(VOID)
int WINAPI WlxDialogBoxIndirectParam(HANDLE hWlx, HANDLE hInst, LPCDLGTEMPLATE hDialogTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM dwInitParam)
struct _DIALOG_LIST_ENTRY * PDIALOG_LIST_ENTRY
BOOL WINAPI WlxSetTimeout(HANDLE hWlx, DWORD Timeout)
BOOL WINAPI WlxSetOption(HANDLE hWlx, DWORD Option, ULONG_PTR Value, ULONG_PTR *OldValue)
static WLX_DISPATCH_VERSION_1_4 FunctionTable
DWORD WINAPI WlxQueryTerminalServicesData(HANDLE hWlx, PWLX_TERMINAL_SERVICES_DATA pTSData, WCHAR *UserName, WCHAR *Domain)
struct _DIALOG_LIST_ENTRY DIALOG_LIST_ENTRY
int WINAPI WlxSwitchDesktopToUser(HANDLE hWlx)
BOOL WINAPI WlxQueryClientCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred)
static PDIALOG_LIST_ENTRY GetDialogListEntry(HWND hwndDlg)
int WINAPI WlxChangePasswordNotifyEx(HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo, PWSTR ProviderName, PVOID Reserved)
VOID WINAPI WlxSasNotify(HANDLE hWlx, DWORD dwSasType)
static BOOL LoadGina(IN OUT PGINAFUNCTIONS Functions, OUT DWORD *DllVersion, OUT HMODULE *GinaInstance)
int WINAPI WlxDialogBoxIndirect(HANDLE hWlx, HANDLE hInst, LPCDLGTEMPLATE hDialogTemplate, HWND hwndOwner, DLGPROC dlgprc)
BOOL GinaInit(IN OUT PWLSESSION Session)
VOID WINAPI WlxWin31Migrate(HANDLE hWlx)
VOID WINAPI WlxUseCtrlAltDel(HANDLE hWlx)
int WINAPI WlxChangePasswordNotify(HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo)
BOOL WINAPI WlxQueryTsLogonCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V2_0 pCred)
BOOL WINAPI WlxDisconnect(VOID)
BOOL WINAPI WlxGetOption(HANDLE hWlx, DWORD Option, ULONG_PTR *Value)
VOID WINAPI WlxSetContextPointer(HANDLE hWlx, PVOID pWlxContext)
static LIST_ENTRY DialogListHead
static BOOL GetGinaPath(OUT LPWSTR Path, IN DWORD Len)
static BOOL WINAPI DefaultWlxScreenSaverNotify(IN PVOID pWlxContext, IN OUT BOOL *pSecure)
VOID InitDialogListHead(VOID)
int WINAPI WlxSwitchDesktopToWinlogon(HANDLE hWlx)
int WINAPI WlxDialogBox(HANDLE hWlx, HANDLE hInst, LPWSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc)
static INT_PTR CALLBACK DefaultWlxWindowProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
BOOL WINAPI WlxGetSourceDesktop(HANDLE hWlx, PWLX_DESKTOP *ppDesktop)
BOOL CreateWindowStationAndDesktops(_Inout_ PWLSESSION Session)
VOID CloseAllDialogWindows(VOID)
int WINAPI WlxMessageBox(HANDLE hWlx, HWND hwndOwner, LPWSTR lpszText, LPWSTR lpszTitle, UINT fuStyle)
BOOL WINAPI WlxQueryInetConnectorCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred)
BOOL WINAPI WlxSetReturnDesktop(HANDLE hWlx, PWLX_DESKTOP pDesktop)
_Must_inspect_result_ _In_ ULONG Flags