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)
188 TRACE(
"WlxUseCtrlAltDel()\n");
204 TRACE(
"WlxSetContextPointer(%p)\n", pWlxContext);
220 TRACE(
"WlxSasNotify(0x%lx)\n", dwSasType);
277 TRACE(
"WlxMessageBox()\n");
279 return MessageBoxW(hwndOwner, lpszText, lpszTitle, fuStyle);
296 TRACE(
"WlxDialogBox()\n");
319 TRACE(
"WlxDialogBoxParam()\n");
322 if (ListEntry ==
NULL)
326 ListEntry->
lParam = dwInitParam;
349 TRACE(
"WlxDialogBoxIndirect()\n");
372 TRACE(
"WlxDialogBoxIndirectParam()\n");
375 if (ListEntry ==
NULL)
379 ListEntry->
lParam = dwInitParam;
398 TRACE(
"WlxSwitchDesktopToUser()\n");
413 TRACE(
"WlxSwitchDesktopToWinlogon()\n");
477 PWSTR pszDesktopName,
543 TRACE(
"WlxSetOption(%lu)\n", Option);
575 TRACE(
"WlxGetOption(%lu)\n", Option);
766 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
827 if (!Functions->WlxInitialize)
830 if (!Functions->WlxNegotiate)
837 TRACE(
"About to negotiate with Gina %S. Winlogon uses version %x\n",
843 TRACE(
"Gina uses WLX_VERSION %lx\n", *DllVersion);
848 if (!Functions->WlxActivateUserShell)
goto cleanup;
850 if (!Functions->WlxDisplayLockedNotice)
goto cleanup;
852 if (!Functions->WlxDisplaySASNotice)
goto cleanup;
854 if (!Functions->WlxIsLockOk)
goto cleanup;
856 if (!Functions->WlxIsLogoffOk)
goto cleanup;
858 if (!Functions->WlxLoggedOnSAS)
goto cleanup;
860 if (!Functions->WlxLoggedOutSAS)
goto cleanup;
862 if (!Functions->WlxLogoff)
goto cleanup;
864 if (!Functions->WlxShutdown)
goto cleanup;
866 if (!Functions->WlxWkstaLockedSAS)
goto cleanup;
878 if (!Functions->WlxDisplayStatusMessage)
goto cleanup;
880 if (!Functions->WlxGetStatusMessage)
goto cleanup;
882 if (!Functions->WlxNetworkProviderLoad)
goto cleanup;
884 if (!Functions->WlxRemoveStatusMessage)
goto cleanup;
888 if (!Functions->WlxScreenSaverNotify)
900 *GinaInstance = hGina;
908 DWORD GinaDllVersion;
910 if (!
LoadGina(&Session->Gina.Functions, &GinaDllVersion, &Session->Gina.hDllInstance))
913 Session->Gina.Context =
NULL;
914 Session->Gina.Version = GinaDllVersion;
915 Session->Gina.UseCtrlAltDelete =
FALSE;
916 Session->SuppressStatus =
FALSE;
918 TRACE(
"Calling WlxInitialize(\"%S\")\n", Session->InteractiveWindowStationName);
919 return Session->Gina.Functions.WlxInitialize(
920 Session->InteractiveWindowStationName,
924 &Session->Gina.Context);
943 ERR(
"WL: Failed to create winsta security!\n");
953 ERR(
"WL: Failed to create application desktop security!\n");
963 ERR(
"WL: Failed to create winlogon desktop security!\n");
973 ERR(
"WL: Failed to create winlogon desktop security!\n");
984 Session->InteractiveWindowStationName =
L"WinSta0";
986 Session->InteractiveWindowStationName,
990 if (!Session->InteractiveWindowStation)
998 ERR(
"WL: SetProcessWindowStation() failed (error %lu)\n",
GetLastError());
1011 &ApplicationDesktopSecurity);
1012 if (!Session->ApplicationDesktop)
1027 &WinlogonDesktopSecurity);
1028 if (!Session->WinlogonDesktop)
1043 &ScreenSaverDesktopSecurity);
1044 if(!Session->ScreenSaverDesktop)
1046 ERR(
"WL: Failed to create Screen-Saver desktop (%lu)\n",
GetLastError());
1068 if (Session->ApplicationDesktop)
1071 Session->ApplicationDesktop =
NULL;
1073 if (Session->WinlogonDesktop)
1076 Session->WinlogonDesktop =
NULL;
1078 if (Session->ScreenSaverDesktop)
1081 Session->ScreenSaverDesktop =
NULL;
1083 if (Session->InteractiveWindowStation)
1086 Session->InteractiveWindowStation =
NULL;
1088 if (WlWinstaSecurityDescriptor)
1090 RtlFreeHeap(RtlGetProcessHeap(), 0, WlWinstaSecurityDescriptor);
1092 if (WlApplicationDesktopSecurityDescriptor)
1094 RtlFreeHeap(RtlGetProcessHeap(), 0, WlApplicationDesktopSecurityDescriptor);
1096 if (WlWinlogonDesktopSecurityDescriptor)
1098 RtlFreeHeap(RtlGetProcessHeap(), 0, WlWinlogonDesktopSecurityDescriptor);
1100 if (WlScreenSaverDesktopSecurityDescriptor)
1102 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_OPTION_USE_CTRL_ALT_DEL
#define WLX_SAS_TYPE_CTRL_ALT_DEL
#define WLX_CURRENT_VERSION
struct _WLX_DISPATCH_VERSION_1_3 WLX_DISPATCH_VERSION_1_3
#define WLX_OPTION_USE_SMART_CARD
#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_SAS_TYPE_MAX_MSFT_VALUE
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