69 pDlgData->hLogoBitmap =
LoadImageW(pDlgData->pgContext->hDllInstance,
72 if (pDlgData->hLogoBitmap)
74 GetObject(pDlgData->hLogoBitmap,
sizeof(bm), &bm);
75 pDlgData->LogoWidth = bm.bmWidth;
76 pDlgData->LogoHeight = bm.bmHeight;
81 if (pDlgData->hBarBitmap)
83 GetObject(pDlgData->hBarBitmap,
sizeof(bm), &bm);
84 pDlgData->BarWidth = bm.bmWidth;
85 pDlgData->BarHeight = bm.bmHeight;
119 TRACE(
"GUIInitialize(%p)\n", pgContext);
136 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
142 WARN(
"RegOpenKeyExW() failed with error %lu\n", rc);
158 BufSize = dwWelcomeSize + ((dwTitleLength + 1) *
sizeof(
WCHAR));
188 INT xNew, yNew, cxNew, cyNew;
189 INT cxLabel, cyLabel, dyLabel;
190 RECT rc, rcBar, rcLabel, rcWnd;
217 dyLabel = bmLogo.bmHeight - rcBar.
top;
224 MoveWindow(hwndLogo, 0, 0, bmLogo.bmWidth, bmLogo.bmHeight,
TRUE);
225 MoveWindow(hwndBar, 0, bmLogo.bmHeight, bmLogo.bmWidth, bmBar.bmHeight,
TRUE);
243 xNew = xOld - (cxNew -
cxOld) / 2;
244 yNew = yOld - (cyNew -
cyOld) / 2;
268 msg->Context->hStatusWindow = hwndDlg;
276 if (pDlgData ==
NULL)
370 ERR(
"Duplicating handle failed!\n");
377 ERR(
"Setting thread desktop failed!\n");
405 TRACE(
"GUIDisplayStatusMessage(%ws)\n", pMessage);
407 if (!pgContext->hStatusWindow)
419 msg->Context = pgContext;
421 msg->pTitle = pTitle;
422 msg->pMessage = pMessage;
423 msg->hDesktop = hDesktop;
427 if (!
msg->StartupEvent)
472 if (pgContext->hStatusWindow)
475 pgContext->hStatusWindow =
NULL;
497 if (pDlgData ==
NULL)
528 TRACE(
"GUIDisplaySASNotice()\n");
531 pgContext->pWlxFuncs->WlxDialogBoxParam(pgContext->hWlx,
532 pgContext->hDllInstance,
573 WCHAR szCaption[256];
579 return pgContext->pWlxFuncs->WlxMessageBox(pgContext->hWlx,
595 WCHAR OldPassword[256];
596 WCHAR NewPassword1[256];
597 WCHAR NewPassword2[256];
600 ULONG RequestBufferSize;
601 ULONG ResponseBufferSize = 0;
614 if (
wcscmp(NewPassword1, NewPassword2) != 0)
635 if (RequestBuffer ==
NULL)
637 ERR(
"HeapAlloc failed\n");
692 ERR(
"ConnectToLsa() failed\n");
698 pgContext->AuthenticationPackage,
701 (
PVOID*)&ResponseBuffer,
706 ERR(
"LsaCallAuthenticationPackage failed (Status 0x%08lx)\n",
Status);
724 if ((
wcscmp(UserName, pgContext->UserName) == 0) &&
725 (
wcscmp(Domain, pgContext->DomainName) == 0) &&
726 (
wcscmp(OldPassword, pgContext->Password) == 0))
728 ZeroMemory(pgContext->Password,
sizeof(pgContext->Password));
729 wcscpy(pgContext->Password, NewPassword1);
733 if (RequestBuffer !=
NULL)
736 if (ResponseBuffer !=
NULL)
823 wsprintfW(Buffer4, Buffer1, Buffer2, Buffer3);
839 TRACE(
"OnChangePassword()\n");
841 res = pgContext->pWlxFuncs->WlxDialogBoxParam(
843 pgContext->hDllInstance,
895 return pgContext->pWlxFuncs->WlxDialogBoxParam(
897 pgContext->hDllInstance,
912 DWORD ShutdownOptions;
914 TRACE(
"OnShutDown(%p %p)\n", hwndDlg, pgContext);
919 if (pgContext->UserToken !=
NULL)
929 ERR(
"WL: ImpersonateLoggedOnUser() failed with error %lu\n",
GetLastError());
937 if (pgContext->UserToken !=
NULL)
946 ERR(
"WL: ImpersonateLoggedOnUser() failed with error %lu\n",
GetLastError());
1025 TRACE(
"GUILoggedOnSAS()\n");
1034 pgContext->pWlxFuncs->WlxSwitchDesktopToWinlogon(
1037 result = pgContext->pWlxFuncs->WlxDialogBoxParam(
1039 pgContext->hDllInstance,
1053 pgContext->pWlxFuncs->WlxSwitchDesktopToUser(
1107 TRACE(
"Account locked!\n");
1136 pgContext->UserName,
1137 pgContext->DomainName,
1138 pgContext->Password,
1142 TRACE(
"Login after password change failed! (Status 0x%08lx)\n",
Status);
1175 TRACE(
"Other error!\n");
1186 TRACE(
"DoLoginTasks failed! Status 0x%08lx\n",
Status);
1192 ERR(
"Failed to create the profile!\n");
1196 ZeroMemory(pgContext->Password,
sizeof(pgContext->Password));
1202 pgContext->bAutoAdminLogon =
FALSE;
1204 if (UserName !=
NULL)
1220 HWND hwndDomainComboBox,
1224 DWORD dwComputerNameLength;
1230 dwComputerNameLength =
_countof(szComputerName);
1239 if (lFindIndex ==
CB_ERR)
1245 lIndex = lFindIndex;
1270 if (pDlgData ==
NULL)
1386 TRACE(
"GUILoggedOutSAS()\n");
1389 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
1396 L"LegalNoticeCaption",
1409 pgContext->pWlxFuncs->WlxDialogBoxParam(pgContext->hWlx,
1410 pgContext->hDllInstance,
1423 result = pgContext->pWlxFuncs->WlxDialogBoxParam(
1425 pgContext->hDllInstance,
1433 WARN(
"WlxLoggedOutSAS() returns 0x%x\n",
result);
1437 WARN(
"WlxDialogBoxParam() failed (0x%x)\n",
result);
1482 wcscmp(UserName, pgContext->UserName) == 0 &&
1488 else if (
wcscmp(UserName, pgContext->UserName) == 0 &&
1507 wsprintfW(Buffer2, Buffer1, pgContext->DomainName, pgContext->UserName);
1514 if (UserName !=
NULL)
1543 if (pDlgData ==
NULL)
1600 TRACE(
"GUILockedSAS()\n");
1602 result = pgContext->pWlxFuncs->WlxDialogBoxParam(
1604 pgContext->hDllInstance,
1612 WARN(
"GUILockedSAS() returns 0x%x\n",
result);
1616 WARN(
"GUILockedSAS() failed (0x%x)\n",
result);
1637 if (pDlgData ==
NULL)
1673 TRACE(
"GUIdisplayLockedNotice()\n");
1675 pgContext->pWlxFuncs->WlxDialogBoxParam(
1677 pgContext->hDllInstance,
#define RegCloseKey(hKey)
static HINSTANCE hDllInstance
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
#define NT_SUCCESS(StatCode)
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)
BOOL WINAPI ImpersonateLoggedOnUser(HANDLE hToken)
#define GetCurrentProcess()
#define HeapFree(x, y, z)
BOOL WINAPI DuplicateHandle(IN HANDLE hSourceProcessHandle, IN HANDLE hSourceHandle, IN HANDLE hTargetProcessHandle, OUT LPHANDLE lpTargetHandle, IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwOptions)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
static VOID SetDomainComboBox(HWND hwndDomainComboBox, PGINA_CONTEXT pgContext)
static BOOL DoLogon(IN HWND hwndDlg, IN OUT PGINA_CONTEXT pgContext)
static INT_PTR CALLBACK LogonDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
static BOOL GetTextboxText(IN HWND hwndDlg, IN INT TextboxId, OUT LPWSTR *pText)
static INT_PTR CALLBACK LogOffDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
static DWORD WINAPI StartupWindowThread(LPVOID lpParam)
static INT OnShutDown(IN HWND hwndDlg, IN PGINA_CONTEXT pgContext)
static INT_PTR CALLBACK WelcomeDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
struct _DLG_DATA * PDLG_DATA
static INT_PTR CALLBACK UnlockDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
static INT_PTR CALLBACK StatusDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
static INT_PTR CALLBACK LegalNoticeDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
static PDLG_DATA DlgData_Create(HWND hwndDlg, PGINA_CONTEXT pgContext)
static INT GUILoggedOnSAS(IN OUT PGINA_CONTEXT pgContext, IN DWORD dwSasType)
static VOID DlgData_Destroy(_Inout_ HWND hwndDlg)
static INT_PTR CALLBACK SecurityDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
static VOID SetWelcomeText(HWND hWnd)
static INT_PTR CALLBACK LockedDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
struct _DISPLAYSTATUSMSG * PDISPLAYSTATUSMSG
static BOOL GUIInitialize(IN OUT PGINA_CONTEXT pgContext)
static INT GUILockedSAS(IN OUT PGINA_CONTEXT pgContext)
static INT GUILoggedOutSAS(IN OUT PGINA_CONTEXT pgContext)
struct _LEGALNOTICEDATA LEGALNOTICEDATA
static INT_PTR CALLBACK ChangePasswordDialogProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
static VOID AdjustStatusMessageWindow(HWND hwndDlg, PDLG_DATA pDlgData)
static BOOL DoChangePassword(IN PGINA_CONTEXT pgContext, IN HWND hwndDlg)
static BOOL GUIDisplayStatusMessage(IN PGINA_CONTEXT pgContext, IN HDESK hDesktop, IN DWORD dwOptions, IN PWSTR pTitle, IN PWSTR pMessage)
static VOID SetLockMessage(HWND hwnd, INT nDlgItem, PGINA_CONTEXT pgContext)
static VOID GUIDisplayLockedNotice(IN OUT PGINA_CONTEXT pgContext)
static INT ResourceMessageBox(IN PGINA_CONTEXT pgContext, IN HWND hwnd, IN UINT uType, IN UINT uCaption, IN UINT uText)
static BOOL GUIRemoveStatusMessage(IN PGINA_CONTEXT pgContext)
static BOOL OnChangePassword(IN HWND hwnd, IN PGINA_CONTEXT pgContext)
struct _DISPLAYSTATUSMSG DISPLAYSTATUSMSG
struct _LEGALNOTICEDATA * PLEGALNOTICEDATA
static VOID OnInitSecurityDlg(HWND hwnd, PGINA_CONTEXT pgContext)
static VOID GUIDisplaySASNotice(IN OUT PGINA_CONTEXT pgContext)
static INT OnLogOff(IN HWND hwndDlg, IN PGINA_CONTEXT pgContext)
static BOOL DoUnlock(IN HWND hwndDlg, IN PGINA_CONTEXT pgContext, OUT LPINT Action)
static VOID DlgData_LoadBitmaps(_Inout_ PDLG_DATA pDlgData)
struct _DLG_DATA DLG_DATA
NTSTATUS ConnectToLsa(PGINA_CONTEXT pgContext)
#define IDC_CHANGEPWD_USERNAME
#define IDS_COMPUTERLOCKED
#define IDS_ACCOUNTLOCKED
#define IDS_LOCKEDWRONGUSER
#define IDS_CHANGEPWDTITLE
#define IDS_INVALIDLOGONHOURS
#define IDC_CHANGEPWD_OLDPWD
#define IDC_STATUS_MESSAGE
#define IDC_CHANGEPWD_DOMAIN
#define IDS_LOGONWRONGUSERORPWD
#define IDC_UNLOCK_USERNAME
#define IDS_PASSWORDMUSTCHANGE
#define IDC_SECURITY_TASKMGR
#define IDC_CHANGEPWD_NEWPWD2
#define IDC_SECURITY_CHANGEPWD
#define IDC_CHANGEPWD_NEWPWD1
#define IDS_LOCKEDWRONGPASSWORD
#define IDS_NONMATCHINGPASSWORDS
#define IDC_LOCKED_MESSAGE
#define IDC_SECURITY_SHUTDOWN
#define IDC_SECURITY_MESSAGE
#define IDS_INVALIDWORKSTATION
#define IDC_SECURITY_LOGOFF
#define IDC_SECURITY_LOGONDATE
#define IDS_PASSWORDEXPIRED
#define IDC_UNLOCK_PASSWORD
#define IDS_PASSWORDCHANGED
#define IDC_LOGON_PASSWORD
#define IDC_LOGON_SHUTDOWN
#define IDS_LOGONUSERDISABLED
#define IDS_ACCOUNTEXPIRED
#define IDC_UNLOCK_MESSAGE
#define IDC_SECURITY_LOCK
#define IDC_LEGALNOTICE_TEXT
#define IDC_LOGON_USERNAME
#define IDS_ACCOUNTRESTRICTION
static VOID NTAPI BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
VOID NTAPI ProtocolStatus(NDIS_HANDLE BindingContext, NDIS_STATUS GenerelStatus, PVOID StatusBuffer, UINT StatusBufferSize)
Called by NDIS when the underlying driver has changed state.
LANGID WINAPI GetUserDefaultLangID(void)
#define ERROR_FILE_NOT_FOUND
LONG ReadRegSzValue(IN HKEY hKey, IN LPCWSTR pszValue, OUT LPWSTR *pValue)
BOOL CreateProfile(IN OUT PGINA_CONTEXT pgContext, IN PWSTR UserName, IN PWSTR Domain, IN PWSTR Password)
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)
DWORD GetAllowedShutdownOptions(VOID)
VOID SaveShutdownSelState(DWORD ShutdownCode)
DWORD LoadShutdownSelState(VOID)
DWORD GetDefaultShutdownSelState(VOID)
INT_PTR ShutdownDialog(IN HWND hwndDlg, IN DWORD ShutdownOptions, IN PGINA_CONTEXT pgContext)
DWORD GetDefaultShutdownOptions(VOID)
struct GINA_CONTEXT * PGINA_CONTEXT
#define LOCALE_USER_DEFAULT
#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
struct _MSV1_0_CHANGEPASSWORD_REQUEST MSV1_0_CHANGEPASSWORD_REQUEST
NTSTATUS NTAPI LsaCallAuthenticationPackage(HANDLE, ULONG, PVOID, ULONG, PVOID *, PULONG, PNTSTATUS)
NTSTATUS NTAPI LsaFreeReturnBuffer(PVOID)
#define STATUS_INVALID_LOGON_HOURS
#define STATUS_ACCOUNT_DISABLED
#define STATUS_PASSWORD_MUST_CHANGE
#define STATUS_PASSWORD_EXPIRED
#define STATUS_INVALID_WORKSTATION
#define STATUS_ACCOUNT_EXPIRED
#define STATUS_ACCOUNT_LOCKED_OUT
#define STATUS_LOGON_FAILURE
#define STATUS_ACCOUNT_RESTRICTION
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
BOOL bDontDisplayLastUserName
BOOL bShutdownWithoutLogon
MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType
UNICODE_STRING AccountName
UNICODE_STRING NewPassword
UNICODE_STRING OldPassword
UNICODE_STRING DomainName
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
#define RtlCopyMemory(Destination, Source, Length)
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
DWORD WINAPI GetLastError(void)
BOOL WINAPI RevertToSelf(void)
#define MAX_COMPUTERNAME_LENGTH
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI DeleteDC(_In_ HDC)
#define HKEY_LOCAL_MACHINE
struct tagDRAWITEMSTRUCT * LPDRAWITEMSTRUCT
#define GetWindowLongPtrW
BOOL WINAPI SetThreadDesktop(_In_ HDESK)
#define GetWindowTextLength
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
BOOL WINAPI AdjustWindowRectEx(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL, _In_ DWORD)
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define CB_FINDSTRINGEXACT
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HWND WINAPI GetDesktopWindow(void)
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
HWND WINAPI SetFocus(_In_opt_ HWND)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
BOOL WINAPI UpdateWindow(_In_ HWND)
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
int WINAPI GetWindowTextLengthW(_In_ HWND)
#define MB_ICONEXCLAMATION
#define MB_ICONINFORMATION
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SetWindowLongPtrW
BOOL WINAPI DrawStateW(_In_ HDC, _In_opt_ HBRUSH, _In_opt_ DRAWSTATEPROC, _In_ LPARAM, _In_ WPARAM, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
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_ACTION_NONE
#define WLX_SAS_ACTION_UNLOCK_WKSTA
#define WLX_SAS_TYPE_CTRL_ALT_DEL
#define WLX_SAS_ACTION_PWD_CHANGED
#define WLX_SAS_ACTION_SWITCH_CONSOLE
#define WLX_SAS_ACTION_LOGON
#define WLX_SAS_ACTION_TASKLIST
#define WLX_SAS_ACTION_LOCK_WKSTA
#define WLX_SAS_ACTION_LOGOFF
#define DUPLICATE_SAME_ACCESS