2 * PROJECT: ReactOS msgina.dll
3 * FILE: dll/win32/msgina/gui.c
4 * PURPOSE: ReactOS Logon GINA DLL
5 * PROGRAMMER: Hervé Poussineau (hpoussin@reactos.org)
13 typedef struct _DISPLAYSTATUSMSG
15 PGINA_CONTEXT Context
;
21 } DISPLAYSTATUSMSG
, *PDISPLAYSTATUSMSG
;
25 IN OUT PGINA_CONTEXT pgContext
)
27 TRACE("GUIInitialize(%p)\n", pgContext
);
31 static INT_PTR CALLBACK
32 StatusMessageWindowProc(
38 UNREFERENCED_PARAMETER(wParam
);
44 PDISPLAYSTATUSMSG msg
= (PDISPLAYSTATUSMSG
)lParam
;
48 msg
->Context
->hStatusWindow
= hwndDlg
;
51 SetWindowTextW(hwndDlg
, msg
->pTitle
);
52 SetDlgItemTextW(hwndDlg
, IDC_STATUSLABEL
, msg
->pMessage
);
53 SetEvent(msg
->StartupEvent
);
61 StartupWindowThread(LPVOID lpParam
)
64 PDISPLAYSTATUSMSG msg
= (PDISPLAYSTATUSMSG
)lpParam
;
66 /* When SetThreadDesktop is called the system closes the desktop handle when needed
67 so we have to create a new handle because this handle may still be in use by winlogon */
68 if (!DuplicateHandle ( GetCurrentProcess(),
74 DUPLICATE_SAME_ACCESS
))
76 HeapFree(GetProcessHeap(), 0, lpParam
);
80 if(!SetThreadDesktop(hDesk
))
82 HeapFree(GetProcessHeap(), 0, lpParam
);
88 MAKEINTRESOURCE(IDD_STATUSWINDOW_DLG
),
90 StatusMessageWindowProc
,
93 HeapFree(GetProcessHeap(), 0, lpParam
);
98 GUIDisplayStatusMessage(
99 IN PGINA_CONTEXT pgContext
,
105 PDISPLAYSTATUSMSG msg
;
109 TRACE("GUIDisplayStatusMessage(%ws)\n", pMessage
);
111 if (!pgContext
->hStatusWindow
)
114 * If everything goes correctly, 'msg' is freed
115 * by the 'StartupWindowThread' thread.
117 msg
= (PDISPLAYSTATUSMSG
)HeapAlloc(GetProcessHeap(),
119 sizeof(DISPLAYSTATUSMSG
));
123 msg
->Context
= pgContext
;
124 msg
->dwOptions
= dwOptions
;
125 msg
->pTitle
= pTitle
;
126 msg
->pMessage
= pMessage
;
127 msg
->hDesktop
= hDesktop
;
129 msg
->StartupEvent
= CreateEventW(NULL
,
134 if (!msg
->StartupEvent
)
136 HeapFree(GetProcessHeap(), 0, msg
);
140 Thread
= CreateThread(NULL
,
149 WaitForSingleObject(msg
->StartupEvent
, INFINITE
);
150 CloseHandle(msg
->StartupEvent
);
158 SetWindowTextW(pgContext
->hStatusWindow
, pTitle
);
160 SetDlgItemTextW(pgContext
->hStatusWindow
, IDC_STATUSLABEL
, pMessage
);
166 GUIRemoveStatusMessage(
167 IN PGINA_CONTEXT pgContext
)
169 if (pgContext
->hStatusWindow
)
171 EndDialog(pgContext
->hStatusWindow
, 0);
172 pgContext
->hStatusWindow
= NULL
;
178 static INT_PTR CALLBACK
185 PGINA_CONTEXT pgContext
;
187 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
193 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
199 if (pgContext
->hBitmap
)
201 hdc
= BeginPaint(hwndDlg
, &ps
);
202 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
203 EndPaint(hwndDlg
, &ps
);
209 DeleteObject(pgContext
->hBitmap
);
218 IN OUT PGINA_CONTEXT pgContext
)
220 TRACE("GUIDisplaySASNotice()\n");
222 /* Display the notice window */
223 pgContext
->pWlxFuncs
->WlxDialogBoxParam(pgContext
->hWlx
,
224 pgContext
->hDllInstance
,
225 MAKEINTRESOURCEW(IDD_NOTICE_DLG
),
231 /* Get the text contained in a textbox. Allocates memory in pText
232 * to contain the text. Returns TRUE in case of success */
242 Count
= GetWindowTextLength(GetDlgItem(hwndDlg
, TextboxId
));
243 Text
= HeapAlloc(GetProcessHeap(), 0, (Count
+ 1) * sizeof(WCHAR
));
246 if (Count
!= GetWindowTextW(GetDlgItem(hwndDlg
, TextboxId
), Text
, Count
+ 1))
248 HeapFree(GetProcessHeap(), 0, Text
);
259 IN PGINA_CONTEXT pgContext
,
265 WCHAR szCaption
[256];
268 LoadStringW(pgContext
->hDllInstance
, uCaption
, szCaption
, 256);
269 LoadStringW(pgContext
->hDllInstance
, uText
, szText
, 256);
271 return pgContext
->pWlxFuncs
->WlxMessageBox(pgContext
->hWlx
,
282 IN PGINA_CONTEXT pgContext
,
287 WCHAR OldPassword
[256];
288 WCHAR NewPassword1
[256];
289 WCHAR NewPassword2
[256];
290 PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer
= NULL
;
291 PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer
= NULL
;
292 ULONG RequestBufferSize
;
293 ULONG ResponseBufferSize
= 0;
296 NTSTATUS ProtocolStatus
;
299 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_USERNAME
, UserName
, 256);
300 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, Domain
, 256);
301 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_OLDPWD
, OldPassword
, 256);
302 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD1
, NewPassword1
, 256);
303 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD2
, NewPassword2
, 256);
305 /* Compare the two passwords and fail if they do not match */
306 if (wcscmp(NewPassword1
, NewPassword2
) != 0)
308 ResourceMessageBox(pgContext
,
310 MB_OK
| MB_ICONEXCLAMATION
,
312 IDS_NONMATCHINGPASSWORDS
);
316 /* Calculate the request buffer size */
317 RequestBufferSize
= sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
) +
318 ((wcslen(Domain
) + 1) * sizeof(WCHAR
)) +
319 ((wcslen(UserName
) + 1) * sizeof(WCHAR
)) +
320 ((wcslen(OldPassword
) + 1) * sizeof(WCHAR
)) +
321 ((wcslen(NewPassword1
) + 1) * sizeof(WCHAR
));
323 /* Allocate the request buffer */
324 RequestBuffer
= HeapAlloc(GetProcessHeap(),
327 if (RequestBuffer
== NULL
)
329 ERR("HeapAlloc failed\n");
333 /* Initialize the request buffer */
334 RequestBuffer
->MessageType
= MsV1_0ChangePassword
;
335 RequestBuffer
->Impersonating
= TRUE
;
337 Ptr
= (LPWSTR
)((ULONG_PTR
)RequestBuffer
+ sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
));
339 /* Pack the domain name */
340 RequestBuffer
->DomainName
.Length
= wcslen(Domain
) * sizeof(WCHAR
);
341 RequestBuffer
->DomainName
.MaximumLength
= RequestBuffer
->DomainName
.Length
+ sizeof(WCHAR
);
342 RequestBuffer
->DomainName
.Buffer
= Ptr
;
344 RtlCopyMemory(RequestBuffer
->DomainName
.Buffer
,
346 RequestBuffer
->DomainName
.MaximumLength
);
348 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->DomainName
.MaximumLength
);
350 /* Pack the user name */
351 RequestBuffer
->AccountName
.Length
= wcslen(UserName
) * sizeof(WCHAR
);
352 RequestBuffer
->AccountName
.MaximumLength
= RequestBuffer
->AccountName
.Length
+ sizeof(WCHAR
);
353 RequestBuffer
->AccountName
.Buffer
= Ptr
;
355 RtlCopyMemory(RequestBuffer
->AccountName
.Buffer
,
357 RequestBuffer
->AccountName
.MaximumLength
);
359 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->AccountName
.MaximumLength
);
361 /* Pack the old password */
362 RequestBuffer
->OldPassword
.Length
= wcslen(OldPassword
) * sizeof(WCHAR
);
363 RequestBuffer
->OldPassword
.MaximumLength
= RequestBuffer
->OldPassword
.Length
+ sizeof(WCHAR
);
364 RequestBuffer
->OldPassword
.Buffer
= Ptr
;
366 RtlCopyMemory(RequestBuffer
->OldPassword
.Buffer
,
368 RequestBuffer
->OldPassword
.MaximumLength
);
370 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->OldPassword
.MaximumLength
);
372 /* Pack the new password */
373 RequestBuffer
->NewPassword
.Length
= wcslen(NewPassword1
) * sizeof(WCHAR
);
374 RequestBuffer
->NewPassword
.MaximumLength
= RequestBuffer
->NewPassword
.Length
+ sizeof(WCHAR
);
375 RequestBuffer
->NewPassword
.Buffer
= Ptr
;
377 RtlCopyMemory(RequestBuffer
->NewPassword
.Buffer
,
379 RequestBuffer
->NewPassword
.MaximumLength
);
381 /* Connect to the LSA server */
382 if (!ConnectToLsa(pgContext
))
384 ERR("ConnectToLsa() failed\n");
388 /* Call the authentication package */
389 Status
= LsaCallAuthenticationPackage(pgContext
->LsaHandle
,
390 pgContext
->AuthenticationPackage
,
393 (PVOID
*)&ResponseBuffer
,
396 if (!NT_SUCCESS(Status
))
398 ERR("LsaCallAuthenticationPackage failed (Status 0x%08lx)\n", Status
);
402 if (!NT_SUCCESS(ProtocolStatus
))
404 TRACE("LsaCallAuthenticationPackage failed (ProtocolStatus 0x%08lx)\n", ProtocolStatus
);
410 ResourceMessageBox(pgContext
,
412 MB_OK
| MB_ICONINFORMATION
,
414 IDS_PASSWORDCHANGED
);
416 if ((wcscmp(UserName
, pgContext
->UserName
) == 0) &&
417 (wcscmp(Domain
, pgContext
->Domain
) == 0) &&
418 (wcscmp(OldPassword
, pgContext
->Password
) == 0))
420 ZeroMemory(pgContext
->Password
, 256 * sizeof(WCHAR
));
421 wcscpy(pgContext
->Password
, NewPassword1
);
425 if (RequestBuffer
!= NULL
)
426 HeapFree(GetProcessHeap(), 0, RequestBuffer
);
428 if (ResponseBuffer
!= NULL
)
429 LsaFreeReturnBuffer(ResponseBuffer
);
435 static INT_PTR CALLBACK
436 ChangePasswordDialogProc(
442 PGINA_CONTEXT pgContext
;
444 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
449 pgContext
= (PGINA_CONTEXT
)lParam
;
450 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
452 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_USERNAME
, pgContext
->UserName
);
453 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_ADDSTRING
, 0, (LPARAM
)pgContext
->Domain
);
454 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_SETCURSEL
, 0, 0);
455 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
459 switch (LOWORD(wParam
))
462 if (DoChangePassword(pgContext
, hwndDlg
))
464 EndDialog(hwndDlg
, TRUE
);
468 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD1
, NULL
);
469 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD2
, NULL
);
470 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
475 EndDialog(hwndDlg
, FALSE
);
481 EndDialog(hwndDlg
, FALSE
);
490 OnInitSecurityDlg(HWND hwnd
,
491 PGINA_CONTEXT pgContext
)
498 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONMSG
, Buffer1
, 256);
500 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
501 wsprintfW(Buffer4
, Buffer1
, Buffer2
);
503 SetDlgItemTextW(hwnd
, IDC_LOGONMSG
, Buffer4
);
505 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONDATE
, Buffer1
, 256);
507 GetDateFormatW(LOCALE_USER_DEFAULT
, DATE_SHORTDATE
,
508 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer2
, 256);
510 GetTimeFormatW(LOCALE_USER_DEFAULT
, 0,
511 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer3
, 256);
513 wsprintfW(Buffer4
, Buffer1
, Buffer2
, Buffer3
);
515 SetDlgItemTextW(hwnd
, IDC_LOGONDATE
, Buffer4
);
517 if (pgContext
->bAutoAdminLogon
== TRUE
)
518 EnableWindow(GetDlgItem(hwnd
, IDC_LOGOFF
), FALSE
);
525 IN PGINA_CONTEXT pgContext
)
529 TRACE("OnChangePassword()\n");
531 res
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
533 pgContext
->hDllInstance
,
534 MAKEINTRESOURCEW(IDD_CHANGE_PASSWORD
),
536 ChangePasswordDialogProc
,
539 TRACE("Result: %x\n", res
);
545 static INT_PTR CALLBACK
558 switch (LOWORD(wParam
))
561 EndDialog(hwndDlg
, IDYES
);
565 EndDialog(hwndDlg
, IDNO
);
571 EndDialog(hwndDlg
, IDNO
);
583 IN PGINA_CONTEXT pgContext
)
585 return pgContext
->pWlxFuncs
->WlxDialogBoxParam(
587 pgContext
->hDllInstance
,
588 MAKEINTRESOURCEW(IDD_LOGOFF_DLG
),
601 UINT shutdownDescId
= 0;
602 int shutdownCode
= 0;
604 shutdownCode
= SendDlgItemMessageW(hwnd
, IDC_SHUTDOWN_LIST
, CB_GETCURSEL
, 0, 0);
606 switch (shutdownCode
)
608 case 0: /* Log off */
609 shutdownDescId
= IDS_SHUTDOWN_LOGOFF_DESC
;
612 case 1: /* Shut down */
613 shutdownDescId
= IDS_SHUTDOWN_SHUTDOWN_DESC
;
616 case 2: /* Restart */
617 shutdownDescId
= IDS_SHUTDOWN_RESTART_DESC
;
621 shutdownDescId
= IDS_SHUTDOWN_SLEEP_DESC
;
624 case 4: /* Hibernate */
625 shutdownDescId
= IDS_SHUTDOWN_HIBERNATE_DESC
;
632 LoadStringW(hDllInstance
, shutdownDescId
, szBuffer
, sizeof(szBuffer
));
633 SetDlgItemTextW(hwnd
, IDC_SHUTDOWN_DESCRIPTION
, szBuffer
);
641 IN PGINA_CONTEXT pgContext
)
647 hwndList
= GetDlgItem(hwndDlg
, IDC_SHUTDOWN_LIST
);
649 /* Clears the content before it's used */
650 SendMessageW(hwndList
, CB_RESETCONTENT
, 0, 0);
653 LoadStringW(hDllInstance
, IDS_SHUTDOWN_LOGOFF
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
654 idx
= SendMessageW(hwndList
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
656 SendMessageW(hwndList
, CB_SETITEMDATA
, idx
, WLX_SAS_ACTION_LOGOFF
);
659 LoadStringW(hDllInstance
, IDS_SHUTDOWN_SHUTDOWN
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
660 idx
= SendMessageW(hwndList
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
662 SendMessageW(hwndList
, CB_SETITEMDATA
, idx
, WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
);
665 LoadStringW(hDllInstance
, IDS_SHUTDOWN_RESTART
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
666 idx
= SendMessageW(hwndList
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
668 SendMessageW(hwndList
, CB_SETITEMDATA
, idx
, WLX_SAS_ACTION_SHUTDOWN_REBOOT
);
672 LoadStringW(hDllInstance
, IDS_SHUTDOWN_SLEEP
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
673 idx
= SendMessageW(hwndList
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
675 SendMessageW(hwndList
, CB_SETITEMDATA
, idx
, WLX_SAS_ACTION_SHUTDOWN_SLEEP
);
680 LoadStringW(hDllInstance
, IDS_SHUTDOWN_HIBERNATE
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
681 idx
= SendMessageW(hwndList
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
683 SendMessageW(hwndList
, CB_SETITEMDATA
, idx
, WLX_SAS_ACTION_SHUTDOWN_HIBERNATE
);
686 /* Sets the default shut down selection */
687 count
= SendMessageW(hwndList
, CB_GETCOUNT
, 0, 0);
688 for (i
= 0; i
< count
; i
++)
690 if (pgContext
->nShutdownAction
== SendMessageW(hwndList
, CB_GETITEMDATA
, i
, 0))
692 SendMessageW(hwndList
, CB_SETCURSEL
, i
, 0);
697 /* Updates the choice description based on the current selection */
698 UpdateShutdownDesc(hwndDlg
);
706 IN PGINA_CONTEXT pgContext
)
710 idx
= SendDlgItemMessageW(hwndDlg
,
717 pgContext
->nShutdownAction
= SendDlgItemMessageW(hwndDlg
,
734 PGINA_CONTEXT pgContext
;
736 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwnd
, GWL_USERDATA
);
741 pgContext
= (PGINA_CONTEXT
)lParam
;
742 SetWindowLongPtr(hwnd
, GWL_USERDATA
, (INT_PTR
)pgContext
);
744 ShutDownOnInit(hwnd
, pgContext
);
746 /* Draw the logo graphic */
747 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
754 if (pgContext
->hBitmap
)
756 hdc
= BeginPaint(hwnd
, &ps
);
757 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
764 DeleteObject(pgContext
->hBitmap
);
768 switch(LOWORD(wParam
))
771 ShutDownOnOk(hwnd
, pgContext
);
772 EndDialog(hwnd
, IDOK
);
776 EndDialog(hwnd
, IDCANCEL
);
779 case IDC_SHUTDOWN_LIST
:
780 UpdateShutdownDesc(hwnd
);
796 IN PGINA_CONTEXT pgContext
)
798 return pgContext
->pWlxFuncs
->WlxDialogBoxParam(
800 pgContext
->hDllInstance
,
801 MAKEINTRESOURCEW(IDD_SHUTDOWN_DLG
),
808 static INT_PTR CALLBACK
815 PGINA_CONTEXT pgContext
;
817 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
823 pgContext
= (PGINA_CONTEXT
)lParam
;
824 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
826 OnInitSecurityDlg(hwndDlg
, (PGINA_CONTEXT
)lParam
);
827 SetFocus(GetDlgItem(hwndDlg
, IDNO
));
833 switch (LOWORD(wParam
))
836 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOCK_WKSTA
);
839 if (OnLogOff(hwndDlg
, pgContext
) == IDYES
)
840 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOGOFF
);
843 if (OnShutDown(hwndDlg
, pgContext
) == IDOK
)
844 EndDialog(hwndDlg
, pgContext
->nShutdownAction
);
847 if (OnChangePassword(hwndDlg
, pgContext
))
848 EndDialog(hwndDlg
, WLX_SAS_ACTION_PWD_CHANGED
);
851 EndDialog(hwndDlg
, WLX_SAS_ACTION_TASKLIST
);
854 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
861 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
871 IN OUT PGINA_CONTEXT pgContext
,
876 TRACE("GUILoggedOnSAS()\n");
878 if (dwSasType
!= WLX_SAS_TYPE_CTRL_ALT_DEL
)
880 /* Nothing to do for WLX_SAS_TYPE_TIMEOUT ; the dialog will
881 * close itself thanks to the use of WlxDialogBoxParam */
882 return WLX_SAS_ACTION_NONE
;
885 pgContext
->pWlxFuncs
->WlxSwitchDesktopToWinlogon(
888 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
890 pgContext
->hDllInstance
,
891 MAKEINTRESOURCEW(IDD_LOGGEDON_DLG
),
896 if (result
< WLX_SAS_ACTION_LOGON
||
897 result
> WLX_SAS_ACTION_SWITCH_CONSOLE
)
899 result
= WLX_SAS_ACTION_NONE
;
902 if (result
== WLX_SAS_ACTION_NONE
)
904 pgContext
->pWlxFuncs
->WlxSwitchDesktopToUser(
911 static INT_PTR CALLBACK
918 PGINA_CONTEXT pgContext
;
920 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
926 /* FIXME: take care of NoDomainUI */
927 pgContext
= (PGINA_CONTEXT
)lParam
;
928 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
930 if (pgContext
->bDontDisplayLastUserName
== FALSE
)
931 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
933 if (pgContext
->bDisableCAD
== TRUE
)
934 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
936 if (pgContext
->bShutdownWithoutLogon
== FALSE
)
937 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHUTDOWN
), FALSE
);
939 SendDlgItemMessageW(hwndDlg
, IDC_LOGON_TO
, CB_ADDSTRING
, 0, (LPARAM
)pgContext
->Domain
);
940 SendDlgItemMessageW(hwndDlg
, IDC_LOGON_TO
, CB_SETCURSEL
, 0, 0);
942 SetFocus(GetDlgItem(hwndDlg
, pgContext
->bDontDisplayLastUserName
? IDC_USERNAME
: IDC_PASSWORD
));
944 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
951 if (pgContext
->hBitmap
)
953 hdc
= BeginPaint(hwndDlg
, &ps
);
954 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
955 EndPaint(hwndDlg
, &ps
);
961 DeleteObject(pgContext
->hBitmap
);
966 switch (LOWORD(wParam
))
970 LPWSTR UserName
= NULL
, Password
= NULL
, Domain
= NULL
;
971 INT result
= WLX_SAS_ACTION_NONE
;
973 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
975 if (GetTextboxText(hwndDlg
, IDC_LOGON_TO
, &Domain
) && *Domain
== '\0')
977 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
) &&
978 DoLoginTasks(pgContext
, UserName
, Domain
, Password
))
980 ZeroMemory(pgContext
->Password
, 256 * sizeof(WCHAR
));
981 wcscpy(pgContext
->Password
, Password
);
983 result
= WLX_SAS_ACTION_LOGON
;
985 HeapFree(GetProcessHeap(), 0, UserName
);
986 HeapFree(GetProcessHeap(), 0, Password
);
987 HeapFree(GetProcessHeap(), 0, Domain
);
988 EndDialog(hwndDlg
, result
);
993 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
998 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN
);
1011 IN OUT PGINA_CONTEXT pgContext
)
1015 TRACE("GUILoggedOutSAS()\n");
1017 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
1019 pgContext
->hDllInstance
,
1020 MAKEINTRESOURCEW(IDD_LOGGEDOUT_DLG
),
1022 LoggedOutWindowProc
,
1024 if (result
>= WLX_SAS_ACTION_LOGON
&&
1025 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
1027 WARN("WlxLoggedOutSAS() returns 0x%x\n", result
);
1031 WARN("WlxDialogBoxParam() failed (0x%x)\n", result
);
1032 return WLX_SAS_ACTION_NONE
;
1037 SetLockMessage(HWND hwnd
,
1039 PGINA_CONTEXT pgContext
)
1045 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKMSG
, Buffer1
, 256);
1047 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
1048 wsprintfW(Buffer3
, Buffer1
, Buffer2
);
1050 SetDlgItemTextW(hwnd
, nDlgItem
, Buffer3
);
1058 IN PGINA_CONTEXT pgContext
,
1063 LPWSTR UserName
= NULL
;
1064 LPWSTR Password
= NULL
;
1067 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
1070 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
))
1072 if (UserName
!= NULL
&& Password
!= NULL
&&
1073 wcscmp(UserName
, pgContext
->UserName
) == 0 &&
1074 wcscmp(Password
, pgContext
->Password
) == 0)
1076 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
1079 else if (wcscmp(UserName
, pgContext
->UserName
) == 0 &&
1080 wcscmp(Password
, pgContext
->Password
) != 0)
1082 /* Wrong Password */
1083 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGPASSWORD
, Buffer2
, 256);
1084 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
1085 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
1089 /* Wrong user name */
1090 if (DoAdminUnlock(pgContext
, UserName
, NULL
, Password
))
1092 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
1097 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGUSER
, Buffer1
, 256);
1098 wsprintfW(Buffer2
, Buffer1
, pgContext
->Domain
, pgContext
->UserName
);
1099 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
1100 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
1105 if (UserName
!= NULL
)
1106 HeapFree(GetProcessHeap(), 0, UserName
);
1108 if (Password
!= NULL
)
1109 HeapFree(GetProcessHeap(), 0, Password
);
1124 PGINA_CONTEXT pgContext
;
1125 INT result
= WLX_SAS_ACTION_NONE
;
1127 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
1132 pgContext
= (PGINA_CONTEXT
)lParam
;
1133 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
1135 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
1137 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
1138 SetFocus(GetDlgItem(hwndDlg
, IDC_PASSWORD
));
1140 if (pgContext
->bDisableCAD
== TRUE
)
1141 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
1143 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
1150 if (pgContext
->hBitmap
)
1152 hdc
= BeginPaint(hwndDlg
, &ps
);
1153 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
1154 EndPaint(hwndDlg
, &ps
);
1159 DeleteObject(pgContext
->hBitmap
);
1163 switch (LOWORD(wParam
))
1166 if (DoUnlock(hwndDlg
, pgContext
, &result
))
1167 EndDialog(hwndDlg
, result
);
1171 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
1183 IN OUT PGINA_CONTEXT pgContext
)
1187 TRACE("GUILockedSAS()\n");
1189 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
1191 pgContext
->hDllInstance
,
1192 MAKEINTRESOURCEW(IDD_UNLOCK_DLG
),
1196 if (result
>= WLX_SAS_ACTION_LOGON
&&
1197 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
1199 WARN("GUILockedSAS() returns 0x%x\n", result
);
1203 WARN("GUILockedSAS() failed (0x%x)\n", result
);
1204 return WLX_SAS_ACTION_NONE
;
1208 static INT_PTR CALLBACK
1215 PGINA_CONTEXT pgContext
;
1217 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
1223 pgContext
= (PGINA_CONTEXT
)lParam
;
1224 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
1226 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
1227 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
1234 if (pgContext
->hBitmap
)
1236 hdc
= BeginPaint(hwndDlg
, &ps
);
1237 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
1238 EndPaint(hwndDlg
, &ps
);
1244 DeleteObject(pgContext
->hBitmap
);
1254 GUIDisplayLockedNotice(
1255 IN OUT PGINA_CONTEXT pgContext
)
1257 TRACE("GUIdisplayLockedNotice()\n");
1259 pgContext
->pWlxFuncs
->WlxDialogBoxParam(
1261 pgContext
->hDllInstance
,
1262 MAKEINTRESOURCEW(IDD_LOCKED_DLG
),
1268 GINA_UI GinaGraphicalUI
= {
1270 GUIDisplayStatusMessage
,
1271 GUIRemoveStatusMessage
,
1272 GUIDisplaySASNotice
,
1276 GUIDisplayLockedNotice
,