49 TRACE(
"WlxNegotiate(%lx, %p)\n", dwWinlogonVersion, pdwDllVersion);
70 L"SYSTEM\\CurrentControlSet\\Control",
75 rc =
ReadRegSzValue(ControlKey,
L"SystemStartOptions", &SystemStartOptions);
80 CurrentOption = SystemStartOptions;
86 if (
_wcsicmp(CurrentOption,
L"CONSOLE") == 0)
88 TRACE(
"Found %S. Switching to console boot\n", CurrentOption);
101 if (ControlKey !=
NULL)
114 pInput->Buffer, pInput->Length,
157 DWORD dwDisableCAD = 0;
161 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
167 WARN(
"RegOpenKeyExW() failed with error %lu\n", rc);
180 if (dwDisableCAD != 0)
210 L"DefaultDomainName",
248 if(themeWait && themeWatch)
263 PVOID pWinlogonFunctions,
275 WARN(
"LocalAlloc() failed\n");
281 WARN(
"GetRegistrySettings() failed\n");
287 *pWlxContext = (
PVOID)pgContext;
294 pgContext->
hWlx = hWlx;
331 TRACE(
"(%p %p)\n", pWlxContext, pSecure);
344 ERR(
"WL: ImpersonateLoggedOnUser() failed with error %lu\n",
GetLastError());
351 TRACE(
"RegOpenCurrentUser: %ld\n", rc);
356 L"Control Panel\\Desktop",
360 TRACE(
"RegOpenKeyExW: %ld\n", rc);
368 L"ScreenSaverIsSecure",
374 TRACE(
"RegQueryValueExW: %ld\n", rc);
378 TRACE(
"szBuffer: \"%S\"\n", szBuffer);
379 *pSecure =
_wtoi(szBuffer);
388 TRACE(
"*pSecure: %ld\n", *pSecure);
402 PWSTR pszDesktopName,
417 ERR(
"GetWindowsDirectoryW() failed\n");
428 ZeroMemory(&StartupInfo,
sizeof(StartupInfo));
429 ZeroMemory(&ProcessInformation,
sizeof(ProcessInformation));
430 StartupInfo.
cb =
sizeof(StartupInfo);
431 StartupInfo.
lpTitle = pszCmdLine;
439 ERR(
"GetWindowsDirectoryW() failed\n");
453 &ProcessInformation);
482 TRACE(
"WlxActivateUserShell()\n");
488 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
494 WARN(
"RegOpenKeyExW() failed with error %lu\n", rc);
503 (
PBYTE)pszUserInitApp,
508 WARN(
"RegQueryValueExW() failed with error %lu\n", rc);
516 WARN(
"ExpandEnvironmentStringsW() failed. Required size %lu\n",
len);
535 ERR(
"RegOpenLoggedOnHKCU() failed with error %ld\n", rc);
541 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
573 TRACE(
"WlxLoggedOnSAS(0x%lx)\n", dwSasType);
587 FIXME(
"WlxLoggedOnSAS: SasType WLX_SAS_TYPE_SC_INSERT not supported!\n");
592 FIXME(
"WlxLoggedOnSAS: SasType WLX_SAS_TYPE_SC_REMOVE not supported!\n");
597 WARN(
"WlxLoggedOnSAS: Unknown SasType: 0x%x\n", dwSasType);
618 TRACE(
"WlxDisplayStatusMessage(\"%S\")\n", pMessage);
632 TRACE(
"WlxRemoveStatusMessage()\n");
658 WARN(
"ConnectToLsa() failed\n");
663 pgContext->AuthenticationPackage,
667 &pgContext->UserToken,
671 WARN(
"MyLogonUser() failed\n");
682 TRACE(
"NtQueryInformationToken() failed (Status 0x%08lx)\n",
Status);
689 TRACE(
"HeapAlloc() failed\n");
700 TRACE(
"NtQueryInformationToken() failed (Status 0x%08lx)\n",
Status);
708 TRACE(
"Member of Admins group\n");
738 WARN(
"ConnectToLsa() failed (Status 0x%08lx)\n",
Status);
743 pgContext->AuthenticationPackage,
747 &pgContext->UserToken,
751 WARN(
"MyLogonUser() failed (Status 0x%08lx)\n",
Status);
768 DWORD cbStats, cbSize;
779 wcscpy(pgContext->UserName, UserName);
780 if (Domain ==
NULL || !Domain[0])
787 wcscpy(pgContext->DomainName, Domain);
790 UserName = pgContext->UserName;
791 Domain = pgContext->DomainName;
798 bIsDomainLogon = (
_wcsicmp(ComputerName, Domain) != 0);
805 WARN(
"HeapAlloc() failed\n");
845 cbSize =
sizeof(
L"\\\\") +
wcslen(Domain) *
sizeof(
WCHAR);
848 WARN(
"HeapAlloc() failed\n");
862 cbSize =
sizeof(
L"LOGONSERVER=\\\\") +
868 WARN(
"LocalAlloc() failed\n");
885 WARN(
"Couldn't get Authentication Id from user token!\n");
893 pgContext->pMprNotifyInfo->pszOldPassword =
NULL;
894 *pgContext->pdwOptions = 0;
895 *pgContext->pProfile = pProfile;
916 TRACE(
"WlxDisplaySASNotice(%p)\n", pWlxContext);
946 TRACE(
"WlxDisplaySASNotice() done\n");
966 TRACE(
"WlxLoggedOutSAS()\n");
995 TRACE(
"WlxWkstaLockedSAS()\n");
1012 TRACE(
"WlxDisplayLockedNotice()\n");
1031 TRACE(
"WlxIsLogoffOk()\n");
1046 TRACE(
"WlxLogoff(%p)\n", pWlxContext);
1082 TRACE(
"WlxShutdown(%p %lx)\n", pWlxContext, ShutdownType);
1089 ERR(
"LsaDeregisterLogonProcess failed (Status 0x%08lx)\n",
Status);
WCHAR CurrentDirectory[1024]
#define RegCloseKey(hKey)
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessAsUserW(_In_opt_ HANDLE hToken, _In_opt_ LPCWSTR lpApplicationName, _Inout_opt_ LPWSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCWSTR lpCurrentDirectory, _In_ LPSTARTUPINFOW lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LONG WINAPI RegOpenCurrentUser(IN REGSAM samDesired, OUT PHKEY phkResult)
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
NTSTATUS WINAPI LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL, IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle)
NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer)
NTSTATUS WINAPI LsaRetrievePrivateData(IN LSA_HANDLE PolicyHandle, IN PLSA_UNICODE_STRING KeyName, OUT PLSA_UNICODE_STRING *PrivateData)
NTSTATUS WINAPI LsaClose(IN LSA_HANDLE ObjectHandle)
BOOL WINAPI ImpersonateLoggedOnUser(HANDLE hToken)
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
BOOL WINAPI DuplicateTokenEx(IN HANDLE ExistingTokenHandle, IN DWORD dwDesiredAccess, IN LPSECURITY_ATTRIBUTES lpTokenAttributes OPTIONAL, IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, IN TOKEN_TYPE TokenType, OUT PHANDLE DuplicateTokenHandle)
#define DLL_PROCESS_ATTACH
#define DLL_PROCESS_DETACH
#define GetProcAddress(x, y)
#define HeapFree(x, y, z)
static DWORD DWORD * dwLength
static void cleanup(void)
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
BOOL WINAPI RevertToSelf(void)
NTSTATUS MyLogonUser(HANDLE LsaHandle, ULONG AuthenticationPackage, LPWSTR lpszUsername, LPWSTR lpszDomain, LPWSTR lpszPassword, PHANDLE phToken, PNTSTATUS SubStatus)
NTSTATUS ConnectToLsa(PGINA_CONTEXT pgContext)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
HLOCAL NTAPI LocalFree(HLOCAL hMem)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static IN DWORD IN LPVOID lpvReserved
static char * NextOption(const char *const ostr)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
static LPCWSTR LPVOID pvReserved
BOOL WINAPI WlxNegotiate(IN DWORD dwWinlogonVersion, OUT PDWORD pdwDllVersion)
static SID_IDENTIFIER_AUTHORITY SystemAuthority
VOID WINAPI WlxDisplaySASNotice(IN PVOID pWlxContext)
BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, HANDLE hWlx, PVOID pvReserved, PVOID pWinlogonFunctions, PVOID *pWlxContext)
static BOOL GetLsaDefaultPassword(_Inout_ PGINA_CONTEXT pgContext)
static BOOL GetRegistrySettings(PGINA_CONTEXT pgContext)
static VOID ChooseGinaUI(VOID)
int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
DWORD(WINAPI * pThemeWait)(DWORD dwTimeout)
BOOL CreateProfile(IN OUT PGINA_CONTEXT pgContext, IN PWSTR UserName, IN PWSTR Domain, IN PWSTR Password)
BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, IN LPVOID lpvReserved)
VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
INT WINAPI WlxLoggedOutSAS(IN PVOID pWlxContext, IN DWORD dwSasType, OUT PLUID pAuthenticationId, IN OUT PSID pLogonSid, OUT PDWORD pdwOptions, OUT PHANDLE phToken, OUT PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, OUT PVOID *pProfile)
static BOOL SafeGetUnicodeString(_In_ const LSA_UNICODE_STRING *pInput, _Out_ PWSTR pszOutput, _In_ SIZE_T cchMax)
static void InitThemeSupport(VOID)
BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure)
BOOL WINAPI WlxActivateUserShell(_In_ PVOID pWlxContext, _In_ PWSTR pszDesktopName, _In_ PWSTR pszMprLogonScript, _In_ PVOID pEnvironment)
VOID WINAPI WlxLogoff(PVOID pWlxContext)
BOOL(WINAPI * pThemeWatch)(void)
VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
BOOL WINAPI WlxRemoveStatusMessage(IN PVOID pWlxContext)
BOOL DoAdminUnlock(IN PGINA_CONTEXT pgContext, IN PWSTR UserName, IN PWSTR Domain, IN PWSTR Password)
NTSTATUS DoLoginTasks(IN OUT PGINA_CONTEXT pgContext, IN PWSTR UserName, IN PWSTR Domain, IN PWSTR Password, OUT PNTSTATUS SubStatus)
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
BOOL WINAPI WlxStartApplication(PVOID pWlxContext, PWSTR pszDesktopName, PVOID pEnvironment, PWSTR pszCmdLine)
BOOL WINAPI WlxDisplayStatusMessage(IN PVOID pWlxContext, IN HDESK hDesktop, IN DWORD dwOptions, IN PWSTR pTitle, IN PWSTR pMessage)
LONG ReadRegDwordValue(_In_ HKEY hKey, _In_ PCWSTR pszValue, _Out_ PDWORD pValue)
struct GINA_CONTEXT * PGINA_CONTEXT
LONG RegOpenLoggedOnHKCU(_In_opt_ HANDLE hUserToken, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Opens and retrieves a handle to the HKEY_CURRENT_USER corresponding to the specified logged-on user.
LONG ReadRegSzValue(_In_ HKEY hKey, _In_ PCWSTR pszValue, _Out_ PWSTR *pValue)
NTSYSAPI PVOID NTAPI RtlFreeSid(_In_ _Post_invalid_ PSID Sid)
NTSYSAPI BOOLEAN NTAPI RtlEqualSid(_In_ PSID Sid1, _In_ PSID Sid2)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define UNREFERENCED_PARAMETER(P)
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID _Out_ PHANDLE _Out_ PQUOTA_LIMITS _Out_ PNTSTATUS SubStatus
NTSYSAPI NTSTATUS NTAPI RtlAllocateAndInitializeSid(IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, IN UCHAR SubAuthorityCount, IN ULONG SubAuthority0, IN ULONG SubAuthority1, IN ULONG SubAuthority2, IN ULONG SubAuthority3, IN ULONG SubAuthority4, IN ULONG SubAuthority5, IN ULONG SubAuthority6, IN ULONG SubAuthority7, OUT PSID *Sid)
#define POLICY_GET_PRIVATE_INFORMATION
NTSTATUS NTAPI LsaDeregisterLogonProcess(HANDLE)
#define STRSAFE_NULL_ON_FAILURE
#define STRSAFE_NO_TRUNCATION
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define STATUS_BUFFER_TOO_SMALL
#define DuplicateString(x)
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
STRSAFEAPI StringCbCopyNExW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc, size_t cbToCopy, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags)
BOOL bIgnoreShiftOverride
BOOL bDontDisplayLastUserName
BOOL bShutdownWithoutLogon
ULONG AuthenticationPackage
PWLX_MPR_NOTIFY_INFO pMprNotifyInfo
PWLX_DISPATCH_VERSION_1_3 pWlxFuncs
PFGINA_LOGGEDOUTSAS LoggedOutSAS
PFGINA_LOCKEDSAS LockedSAS
PFGINA_DISPLAYLOCKEDNOTICE DisplayLockedNotice
PFGINA_DISPLAYSASNOTICE DisplaySASNotice
PFGINA_LOGGEDONSAS LoggedOnSAS
PFGINA_REMOVESTATUSMESSAGE RemoveStatusMessage
PFGINA_DISPLAYSTATUSMESSAGE DisplayStatusMessage
PFGINA_INITIALIZE Initialize
SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]
PWLX_SAS_NOTIFY WlxSasNotify
PWLX_USE_CTRL_ALT_DEL WlxUseCtrlAltDel
PWSTR pszNetworkDefaultUserProfile
_Must_inspect_result_ __kernel_entry NTSTATUS NTAPI NtQueryInformationToken(_In_ HANDLE TokenHandle, _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, _Out_writes_bytes_to_opt_(TokenInformationLength, *ReturnLength) PVOID TokenInformation, _In_ ULONG TokenInformationLength, _Out_ PULONG ReturnLength)
Queries a specific type of information in regard of an access token based upon the information class....
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
_In_opt_ LPSTR _In_opt_ LPSTR _In_ DWORD _In_ DWORD _Out_opt_ PHANDLE phToken
DWORD WINAPI GetLastError(void)
#define STARTF_USESHOWWINDOW
#define CREATE_UNICODE_ENVIRONMENT
#define MAX_COMPUTERNAME_LENGTH
#define HKEY_LOCAL_MACHINE
int WINAPI GetSystemMetrics(_In_ int)
SHORT WINAPI GetKeyState(_In_ int)
#define WLX_SAS_TYPE_TIMEOUT
#define WLX_SAS_ACTION_NONE
#define WLX_SAS_TYPE_CTRL_ALT_DEL
#define WLX_PROFILE_TYPE_V2_0
struct _WLX_DISPATCH_VERSION_1_3 * PWLX_DISPATCH_VERSION_1_3
#define WLX_SAS_ACTION_LOGON
#define WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
#define WLX_SAS_TYPE_SC_INSERT
#define WLX_SAS_TYPE_SC_REMOVE
#define SECURITY_BUILTIN_DOMAIN_RID
#define SECURITY_NULL_RID
#define SECURITY_NT_AUTHORITY
#define DOMAIN_ALIAS_RID_ADMINS