15 #define DESKTOP_ALL (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | \ 16 DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | \ 17 DESKTOP_JOURNALPLAYBACK | DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | \ 18 DESKTOP_SWITCHDESKTOP | STANDARD_RIGHTS_REQUIRED) 20 #define WINSTA_ALL (WINSTA_ENUMDESKTOPS | WINSTA_READATTRIBUTES | \ 21 WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | \ 22 WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | \ 23 WINSTA_EXITWINDOWS | WINSTA_ENUMERATE | WINSTA_READSCREEN | \ 24 STANDARD_RIGHTS_REQUIRED) 26 #define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | \ 27 GENERIC_EXECUTE | GENERIC_ALL) 58 if (ListEntry ==
NULL)
61 TRACE(
"Add entry %p\n", ListEntry);
74 TRACE(
"Remove entry %p\n", ListEntry);
94 if (Current->
hWnd == hwndDlg)
96 TRACE(
"Found entry: %p\n", Current);
100 ListEntry = ListEntry->
Flink;
103 TRACE(
"Found no entry!\n");
123 ListEntry = ListEntry->
Flink;
144 TRACE(
"Set dialog handle: %p\n", hwndDlg);
145 ListEntry->
hWnd = hwndDlg;
152 if (ListEntry ==
NULL)
202 TRACE(
"WlxUseCtrlAltDel()\n");
218 TRACE(
"WlxSetContextPointer(%p)\n", pWlxContext);
234 TRACE(
"WlxSasNotify(0x%lx)\n", dwSasType);
291 TRACE(
"WlxMessageBox()\n");
293 return MessageBoxW(hwndOwner, lpszText, lpszTitle, fuStyle);
310 TRACE(
"WlxDialogBox()\n");
333 TRACE(
"WlxDialogBoxParam()\n");
336 if (ListEntry ==
NULL)
340 ListEntry->
lParam = dwInitParam;
363 TRACE(
"WlxDialogBoxIndirect()\n");
386 TRACE(
"WlxDialogBoxIndirectParam()\n");
389 if (ListEntry ==
NULL)
393 ListEntry->
lParam = dwInitParam;
412 TRACE(
"WlxSwitchDesktopToUser()\n");
427 TRACE(
"WlxSwitchDesktopToWinlogon()\n");
491 PWSTR pszDesktopName,
557 TRACE(
"WlxSetOption(%lu)\n", Option);
589 TRACE(
"WlxGetOption(%lu)\n", Option);
780 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
841 if (!Functions->WlxInitialize)
844 if (!Functions->WlxNegotiate)
851 TRACE(
"About to negotiate with Gina %S. Winlogon uses version %x\n",
857 TRACE(
"Gina uses WLX_VERSION %lx\n", *DllVersion);
862 if (!Functions->WlxActivateUserShell)
goto cleanup;
864 if (!Functions->WlxDisplayLockedNotice)
goto cleanup;
866 if (!Functions->WlxDisplaySASNotice)
goto cleanup;
868 if (!Functions->WlxIsLockOk)
goto cleanup;
870 if (!Functions->WlxIsLogoffOk)
goto cleanup;
872 if (!Functions->WlxLoggedOnSAS)
goto cleanup;
874 if (!Functions->WlxLoggedOutSAS)
goto cleanup;
876 if (!Functions->WlxLogoff)
goto cleanup;
878 if (!Functions->WlxShutdown)
goto cleanup;
880 if (!Functions->WlxWkstaLockedSAS)
goto cleanup;
892 if (!Functions->WlxDisplayStatusMessage)
goto cleanup;
894 if (!Functions->WlxGetStatusMessage)
goto cleanup;
896 if (!Functions->WlxNetworkProviderLoad)
goto cleanup;
898 if (!Functions->WlxRemoveStatusMessage)
goto cleanup;
902 if (!Functions->WlxScreenSaverNotify)
914 *GinaInstance = hGina;
922 DWORD GinaDllVersion;
924 if (!
LoadGina(&Session->Gina.Functions, &GinaDllVersion, &Session->Gina.hDllInstance))
927 Session->Gina.Context =
NULL;
928 Session->Gina.Version = GinaDllVersion;
929 Session->Gina.UseCtrlAltDelete =
FALSE;
930 Session->SuppressStatus =
FALSE;
932 TRACE(
"Calling WlxInitialize(\"%S\")\n", Session->InteractiveWindowStationName);
933 return Session->Gina.Functions.WlxInitialize(
934 Session->InteractiveWindowStationName,
938 &Session->Gina.Context);
954 AclSize =
sizeof(
ACL)
959 ERR(
"WL: HeapAlloc() failed\n");
974 ERR(
"WL: InitializeSecurityDescriptor() failed (error %lu)\n",
GetLastError());
1014 ERR(
"WL: SetSecurityDescriptorDacl() failed (error %lu)\n",
GetLastError());
1022 ERR(
"WL: SetUserObjectSecurity() failed (error %lu)\n",
GetLastError());
1051 AclSize =
sizeof(
ACL)
1061 ERR(
"WL: HeapAlloc() failed\n");
1075 ERR(
"WL: AddAccessAllowedAce() failed (error %lu)\n",
GetLastError());
1082 ERR(
"WL: AddAccessAllowedAce() failed (error %lu)\n",
GetLastError());
1090 ERR(
"WL: InitializeSecurityDescriptor() failed (error %lu)\n",
GetLastError());
1097 ERR(
"WL: SetSecurityDescriptorDacl() failed (error %lu)\n",
GetLastError());
1105 ERR(
"WL: SetUserObjectSecurity() failed (error %lu)\n",
GetLastError());
1127 PSID pInteractiveSid = (
PSID)InteractiveBuffer;
1128 DWORD SidSize, AclSize;
1153 AclSize =
sizeof(
ACL)
1158 if (!pDefaultAcl || !pUserDesktopAcl)
1160 ERR(
"WL: HeapAlloc() failed\n");
1177 ERR(
"WL: AddAccessAllowedAce() failed (error %lu)\n",
GetLastError());
1186 ERR(
"WL: InitializeSecurityDescriptor() failed (error %lu)\n",
GetLastError());
1192 ERR(
"WL: SetSecurityDescriptorDacl() failed (error %lu)\n",
GetLastError());
1206 ERR(
"WL: AddAccessAllowedAce() failed (error %lu)\n",
GetLastError());
1215 ERR(
"WL: InitializeSecurityDescriptor() failed (error %lu)\n",
GetLastError());
1221 ERR(
"WL: SetSecurityDescriptorDacl() failed (error %lu)\n",
GetLastError());
1232 Session->InteractiveWindowStationName =
L"WinSta0";
1234 Session->InteractiveWindowStationName,
1238 if (!Session->InteractiveWindowStation)
1245 ERR(
"WL: SetProcessWindowStation() failed (error %lu)\n",
GetLastError());
1258 &UserDesktopSecurity);
1259 if (!Session->ApplicationDesktop)
1275 if (!Session->WinlogonDesktop)
1291 if(!Session->ScreenSaverDesktop)
1293 ERR(
"WL: Failed to create Screen-Saver desktop (%lu)\n",
GetLastError());
1315 if (Session->ApplicationDesktop)
1318 Session->ApplicationDesktop =
NULL;
1320 if (Session->WinlogonDesktop)
1323 Session->WinlogonDesktop =
NULL;
1325 if (Session->ScreenSaverDesktop)
1328 Session->ScreenSaverDesktop =
NULL;
1330 if (Session->InteractiveWindowStation)
1333 Session->InteractiveWindowStation =
NULL;
int WINAPI WlxDialogBoxIndirectParam(HANDLE hWlx, HANDLE hInst, LPCDLGTEMPLATE hDialogTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM dwInitParam)
BOOL WINAPI SetWindowStationUser(IN HWINSTA hWindowStation, IN PLUID pluid, IN PSID psid OPTIONAL, IN DWORD size)
int WINAPI WlxDialogBoxIndirect(HANDLE hWlx, HANDLE hInst, LPCDLGTEMPLATE hDialogTemplate, HWND hwndOwner, DLGPROC dlgprc)
struct _WLSESSION * PWLSESSION
PFWLXISLOGOFFOK WlxIsLogoffOk
struct _WLX_DISPATCH_VERSION_1_0 WLX_DISPATCH_VERSION_1_0
BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, BOOL bDaclPresent, PACL pDacl, BOOL bDaclDefaulted)
static VOID RemoveDialogListEntry(PDIALOG_LIST_ENTRY ListEntry)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
VOID WINAPI WlxWin31Migrate(HANDLE hWlx)
BOOL WINAPI WlxSetTimeout(HANDLE hWlx, DWORD Timeout)
#define SECURITY_MAX_SID_SIZE
static BOOL WINAPI DefaultWlxScreenSaverNotify(IN PVOID pWlxContext, IN OUT BOOL *pSecure)
BOOL WINAPI InitializeAcl(PACL pAcl, DWORD nAclLength, DWORD dwAclRevision)
#define SECURITY_DESCRIPTOR_MIN_LENGTH
#define UNREFERENCED_PARAMETER(P)
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision)
BOOL(WINAPI * PFWLXSCREENSAVERNOTIFY)(PVOID, BOOL *)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
BOOL WINAPI AddAccessAllowedAce(PACL pAcl, DWORD dwAceRevision, DWORD AccessMask, PSID pSid)
BOOL(WINAPI * PFWLXDISPLAYSTATUSMESSAGE)(PVOID, HDESK, DWORD, PWSTR, PWSTR)
IN PVOID IN PVOID IN USHORT IN USHORT Size
DWORD WINAPI GetLastError(VOID)
struct _ACCESS_ALLOWED_ACE ACCESS_ALLOWED_ACE
int WINAPI WlxAssignShellProtection(HANDLE hWlx, HANDLE hToken, HANDLE hProcess, HANDLE hThread)
_In_ BOOL _In_ HANDLE hProcess
#define WLX_OPTION_DISPATCH_TABLE_SIZE
BOOL WINAPI SetProcessWindowStation(_In_ HWINSTA)
#define NO_PROPAGATE_INHERIT_ACE
static INT_PTR CALLBACK DefaultWlxWindowProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
int(WINAPI * PFWLXLOGGEDONSAS)(PVOID, DWORD, PVOID)
int(WINAPI * PFWLXWKSTALOCKEDSAS)(PVOID, DWORD)
BOOL AddAceToWindowStation(IN HWINSTA WinSta, IN PSID Sid)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
VOID WINAPI WlxSetContextPointer(HANDLE hWlx, PVOID pWlxContext)
BOOL(WINAPI * PFWLXINITIALIZE)(LPWSTR, HANDLE, PVOID, PVOID, PVOID *)
BOOL WINAPI SetThreadDesktop(_In_ HDESK)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
#define SECURITY_DESCRIPTOR_REVISION
LONG WINAPI RegCloseKey(HKEY hKey)
DWORD SECURITY_INFORMATION
int WINAPI WlxDialogBox(HANDLE hWlx, HANDLE hInst, LPWSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc)
BOOL(WINAPI * PFWLXREMOVESTATUSMESSAGE)(PVOID)
VOID(WINAPI * PFWLXSHUTDOWN)(PVOID, DWORD)
VOID WINAPI WlxSasNotify(HANDLE hWlx, DWORD dwSasType)
BOOL WINAPI WlxCloseUserDesktop(HANDLE hWlx, PWLX_DESKTOP pDesktop, HANDLE hToken)
BOOL WINAPI WlxGetSourceDesktop(HANDLE hWlx, PWLX_DESKTOP *ppDesktop)
#define WLX_OPTION_SMART_CARD_INFO
BOOL WINAPI WlxCreateUserDesktop(HANDLE hWlx, HANDLE hToken, DWORD Flags, PWSTR pszDesktopName, PWLX_DESKTOP *ppDesktop)
_In_ ULONG _In_ ACCESS_MASK _In_ PSID Sid
BOOL WINAPI SetUserObjectSecurity(_In_ HANDLE, _In_ PSECURITY_INFORMATION, _In_ PSECURITY_DESCRIPTOR)
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION SecurityInformation
_Reserved_ PVOID Reserved
int WINAPI WlxChangePasswordNotifyEx(HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo, PWSTR ProviderName, PVOID Reserved)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
DWORD WINAPI WlxQueryTerminalServicesData(HANDLE hWlx, PWLX_TERMINAL_SERVICES_DATA pTSData, WCHAR *UserName, WCHAR *Domain)
BOOL AddAceToDesktop(IN HDESK Desktop, IN PSID WinlogonSid, IN PSID UserSid)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
static LIST_ENTRY DialogListHead
int WINAPI WlxMessageBox(HANDLE hWlx, HWND hwndOwner, LPWSTR lpszText, LPWSTR lpszTitle, UINT fuStyle)
#define CONTAINER_INHERIT_ACE
BOOL(WINAPI * PFWLXNETWORKPROVIDERLOAD)(PVOID, PWLX_MPR_NOTIFY_INFO)
#define WLX_OPTION_SMART_CARD_PRESENT
#define WLX_OPTION_CONTEXT_POINTER
struct _LIST_ENTRY * Flink
VOID(WINAPI * PFWLXDISPLAYLOCKEDNOTICE)(PVOID)
#define WLX_OPTION_USE_CTRL_ALT_DEL
_Must_inspect_result_ _In_ ULONG Flags
#define WLX_OPTION_USE_SMART_CARD
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
DWORD WINAPI GetLengthSid(PSID pSid)
BOOL WINAPI WlxQueryClientCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred)
DWORD WINAPI WlxQueryConsoleSwitchCredentials(PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 pCred)
#define ACCESS_ALLOWED_ACE_TYPE
static BOOL GetGinaPath(OUT LPWSTR Path, IN DWORD Len)
BOOL WINAPI SwitchDesktop(_In_ HDESK)
BOOL WINAPI WlxQueryTsLogonCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V2_0 pCred)
VOID(WINAPI * PFWLXLOGOFF)(PVOID)
struct _WLX_DISPATCH_VERSION_1_4 WLX_DISPATCH_VERSION_1_4
BOOL(WINAPI * PFWLXACTIVATEUSERSHELL)(PVOID, PWSTR, PWSTR, PVOID)
#define WLX_SAS_TYPE_CTRL_ALT_DEL
VOID(WINAPI * PFWLXDISPLAYSASNOTICE)(PVOID)
int(WINAPI * PFWLXLOGGEDOUTSAS)(PVOID, DWORD, PLUID, PSID, PDWORD, PHANDLE, PWLX_MPR_NOTIFY_INFO, PVOID *)
BOOL(WINAPI * PFWLXSTARTAPPLICATION)(PVOID, PWSTR, PVOID, PWSTR)
BOOL(WINAPI * PFWLXISLOCKOK)(PVOID)
struct _WLX_DISPATCH_VERSION_1_1 WLX_DISPATCH_VERSION_1_1
INT_PTR(CALLBACK * DLGPROC)(HWND, UINT, WPARAM, LPARAM)
BOOL CreateWindowStationAndDesktops(IN OUT PWLSESSION Session)
int WINAPI WlxSwitchDesktopToWinlogon(HANDLE hWlx)
static BOOL LoadGina(IN OUT PGINAFUNCTIONS Functions, OUT DWORD *DllVersion, OUT HMODULE *GinaInstance)
#define WLX_CURRENT_VERSION
static PSID pLocalSystemSid
PRTL_UNICODE_STRING_BUFFER Path
#define WLX_SAS_TYPE_MAX_MSFT_VALUE
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
LPVOID lpSecurityDescriptor
struct _WLX_DISPATCH_VERSION_1_3 WLX_DISPATCH_VERSION_1_3
static PDIALOG_LIST_ENTRY GetDialogListEntry(HWND hwndDlg)
#define InitializeListHead(ListHead)
#define FIELD_OFFSET(t, f)
INT_PTR WINAPI DialogBoxIndirectParamW(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
VOID InitDialogListHead(VOID)
struct _DIALOG_LIST_ENTRY * PDIALOG_LIST_ENTRY
BOOL WINAPI AddAce(PACL pAcl, DWORD dwAceRevision, DWORD dwStartingAceIndex, LPVOID pAceList, DWORD nAceListLength)
struct _WLX_DISPATCH_VERSION_1_2 WLX_DISPATCH_VERSION_1_2
BOOL(WINAPI * PFWLXISLOGOFFOK)(PVOID)
BOOL WINAPI WlxDisconnect(VOID)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI WlxSetOption(HANDLE hWlx, DWORD Option, ULONG_PTR Value, ULONG_PTR *OldValue)
HWINSTA WINAPI CreateWindowStationW(_In_opt_ LPCWSTR lpwinsta, _In_ DWORD dwFlags, _In_ ACCESS_MASK dwDesiredAccess, _In_opt_ LPSECURITY_ATTRIBUTES lpsa)
BOOL WINAPI CloseDesktop(_In_ HDESK)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
static PDIALOG_LIST_ENTRY AddDialogListEntry(VOID)
BOOL GinaInit(IN OUT PWLSESSION Session)
char * cleanup(char *str)
static WLX_DISPATCH_VERSION_1_4 FunctionTable
#define GetProcAddress(x, y)
BOOL(WINAPI * PFWLXNEGOTIATE)(DWORD, DWORD *)
VOID WINAPI WlxUseCtrlAltDel(HANDLE hWlx)
int WINAPI WlxChangePasswordNotify(HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo)
HDESK WINAPI CreateDesktopW(LPCWSTR lpszDesktop, LPCWSTR lpszDevice, LPDEVMODEW pDevmode, DWORD dwFlags, ACCESS_MASK dwDesiredAccess, LPSECURITY_ATTRIBUTES lpsa)
BOOL WINAPI CopySid(DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid)
BOOL WINAPI CreateWellKnownSid(IN WELL_KNOWN_SID_TYPE WellKnownSidType, IN PSID DomainSid OPTIONAL, OUT PSID pSid, IN OUT DWORD *cbSid)
BOOL WINAPI WlxQueryInetConnectorCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred)
VOID CloseAllDialogWindows(VOID)
#define HeapFree(x, y, z)
#define OBJECT_INHERIT_ACE
base of all file and directory entries
#define DACL_SECURITY_INFORMATION
BOOL WINAPI WlxSetReturnDesktop(HANDLE hWlx, PWLX_DESKTOP pDesktop)
BOOL WINAPI CloseWindowStation(_In_ HWINSTA)
BOOL WINAPI WlxGetOption(HANDLE hWlx, DWORD Option, ULONG_PTR *Value)
int WINAPI WlxDialogBoxParam(HANDLE hWlx, HANDLE hInst, LPWSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM dwInitParam)
struct _DIALOG_LIST_ENTRY DIALOG_LIST_ENTRY
struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES
BOOL(WINAPI * PFWLXGETSTATUSMESSAGE)(PVOID, DWORD *, PWSTR, DWORD)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
#define HKEY_LOCAL_MACHINE
int WINAPI WlxSwitchDesktopToUser(HANDLE hWlx)