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
),
595 static INT_PTR CALLBACK
602 PGINA_CONTEXT pgContext
;
604 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
610 pgContext
= (PGINA_CONTEXT
)lParam
;
611 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
613 OnInitSecurityDlg(hwndDlg
, (PGINA_CONTEXT
)lParam
);
614 SetFocus(GetDlgItem(hwndDlg
, IDNO
));
620 switch (LOWORD(wParam
))
623 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOCK_WKSTA
);
626 if (OnLogOff(hwndDlg
, pgContext
) == IDYES
)
627 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOGOFF
);
630 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
);
633 if (OnChangePassword(hwndDlg
, pgContext
))
634 EndDialog(hwndDlg
, WLX_SAS_ACTION_PWD_CHANGED
);
637 EndDialog(hwndDlg
, WLX_SAS_ACTION_TASKLIST
);
640 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
647 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
657 IN OUT PGINA_CONTEXT pgContext
,
662 TRACE("GUILoggedOnSAS()\n");
664 if (dwSasType
!= WLX_SAS_TYPE_CTRL_ALT_DEL
)
666 /* Nothing to do for WLX_SAS_TYPE_TIMEOUT ; the dialog will
667 * close itself thanks to the use of WlxDialogBoxParam */
668 return WLX_SAS_ACTION_NONE
;
671 pgContext
->pWlxFuncs
->WlxSwitchDesktopToWinlogon(
674 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
676 pgContext
->hDllInstance
,
677 MAKEINTRESOURCEW(IDD_LOGGEDON_DLG
),
682 if (result
< WLX_SAS_ACTION_LOGON
||
683 result
> WLX_SAS_ACTION_SWITCH_CONSOLE
)
685 result
= WLX_SAS_ACTION_NONE
;
688 if (result
== WLX_SAS_ACTION_NONE
)
690 pgContext
->pWlxFuncs
->WlxSwitchDesktopToUser(
697 static INT_PTR CALLBACK
704 PGINA_CONTEXT pgContext
;
706 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
712 /* FIXME: take care of NoDomainUI */
713 pgContext
= (PGINA_CONTEXT
)lParam
;
714 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
716 if (pgContext
->bDontDisplayLastUserName
== FALSE
)
717 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
719 if (pgContext
->bDisableCAD
== TRUE
)
720 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
722 if (pgContext
->bShutdownWithoutLogon
== FALSE
)
723 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHUTDOWN
), FALSE
);
725 SendDlgItemMessageW(hwndDlg
, IDC_LOGON_TO
, CB_ADDSTRING
, 0, (LPARAM
)pgContext
->Domain
);
726 SendDlgItemMessageW(hwndDlg
, IDC_LOGON_TO
, CB_SETCURSEL
, 0, 0);
728 SetFocus(GetDlgItem(hwndDlg
, pgContext
->bDontDisplayLastUserName
? IDC_USERNAME
: IDC_PASSWORD
));
730 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
737 if (pgContext
->hBitmap
)
739 hdc
= BeginPaint(hwndDlg
, &ps
);
740 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
741 EndPaint(hwndDlg
, &ps
);
747 DeleteObject(pgContext
->hBitmap
);
752 switch (LOWORD(wParam
))
756 LPWSTR UserName
= NULL
, Password
= NULL
, Domain
= NULL
;
757 INT result
= WLX_SAS_ACTION_NONE
;
759 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
761 if (GetTextboxText(hwndDlg
, IDC_LOGON_TO
, &Domain
) && *Domain
== '\0')
763 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
) &&
764 DoLoginTasks(pgContext
, UserName
, Domain
, Password
))
766 ZeroMemory(pgContext
->Password
, 256 * sizeof(WCHAR
));
767 wcscpy(pgContext
->Password
, Password
);
769 result
= WLX_SAS_ACTION_LOGON
;
771 HeapFree(GetProcessHeap(), 0, UserName
);
772 HeapFree(GetProcessHeap(), 0, Password
);
773 HeapFree(GetProcessHeap(), 0, Domain
);
774 EndDialog(hwndDlg
, result
);
779 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
784 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN
);
797 IN OUT PGINA_CONTEXT pgContext
)
801 TRACE("GUILoggedOutSAS()\n");
803 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
805 pgContext
->hDllInstance
,
806 MAKEINTRESOURCEW(IDD_LOGGEDOUT_DLG
),
810 if (result
>= WLX_SAS_ACTION_LOGON
&&
811 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
813 WARN("WlxLoggedOutSAS() returns 0x%x\n", result
);
817 WARN("WlxDialogBoxParam() failed (0x%x)\n", result
);
818 return WLX_SAS_ACTION_NONE
;
823 SetLockMessage(HWND hwnd
,
825 PGINA_CONTEXT pgContext
)
831 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKMSG
, Buffer1
, 256);
833 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
834 wsprintfW(Buffer3
, Buffer1
, Buffer2
);
836 SetDlgItemTextW(hwnd
, nDlgItem
, Buffer3
);
844 IN PGINA_CONTEXT pgContext
,
849 LPWSTR UserName
= NULL
;
850 LPWSTR Password
= NULL
;
853 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
856 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
))
858 if (UserName
!= NULL
&& Password
!= NULL
&&
859 wcscmp(UserName
, pgContext
->UserName
) == 0 &&
860 wcscmp(Password
, pgContext
->Password
) == 0)
862 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
865 else if (wcscmp(UserName
, pgContext
->UserName
) == 0 &&
866 wcscmp(Password
, pgContext
->Password
) != 0)
869 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGPASSWORD
, Buffer2
, 256);
870 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
871 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
875 /* Wrong user name */
876 if (DoAdminUnlock(pgContext
, UserName
, NULL
, Password
))
878 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
883 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGUSER
, Buffer1
, 256);
884 wsprintfW(Buffer2
, Buffer1
, pgContext
->Domain
, pgContext
->UserName
);
885 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
886 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
891 if (UserName
!= NULL
)
892 HeapFree(GetProcessHeap(), 0, UserName
);
894 if (Password
!= NULL
)
895 HeapFree(GetProcessHeap(), 0, Password
);
910 PGINA_CONTEXT pgContext
;
911 INT result
= WLX_SAS_ACTION_NONE
;
913 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
918 pgContext
= (PGINA_CONTEXT
)lParam
;
919 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
921 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
923 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
924 SetFocus(GetDlgItem(hwndDlg
, IDC_PASSWORD
));
926 if (pgContext
->bDisableCAD
== TRUE
)
927 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
929 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
936 if (pgContext
->hBitmap
)
938 hdc
= BeginPaint(hwndDlg
, &ps
);
939 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
940 EndPaint(hwndDlg
, &ps
);
945 DeleteObject(pgContext
->hBitmap
);
949 switch (LOWORD(wParam
))
952 if (DoUnlock(hwndDlg
, pgContext
, &result
))
953 EndDialog(hwndDlg
, result
);
957 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
969 IN OUT PGINA_CONTEXT pgContext
)
973 TRACE("GUILockedSAS()\n");
975 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
977 pgContext
->hDllInstance
,
978 MAKEINTRESOURCEW(IDD_UNLOCK_DLG
),
982 if (result
>= WLX_SAS_ACTION_LOGON
&&
983 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
985 WARN("GUILockedSAS() returns 0x%x\n", result
);
989 WARN("GUILockedSAS() failed (0x%x)\n", result
);
990 return WLX_SAS_ACTION_NONE
;
994 static INT_PTR CALLBACK
1001 PGINA_CONTEXT pgContext
;
1003 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
1009 pgContext
= (PGINA_CONTEXT
)lParam
;
1010 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
1012 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
1013 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
1020 if (pgContext
->hBitmap
)
1022 hdc
= BeginPaint(hwndDlg
, &ps
);
1023 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
1024 EndPaint(hwndDlg
, &ps
);
1030 DeleteObject(pgContext
->hBitmap
);
1040 GUIDisplayLockedNotice(
1041 IN OUT PGINA_CONTEXT pgContext
)
1043 TRACE("GUIdisplayLockedNotice()\n");
1045 pgContext
->pWlxFuncs
->WlxDialogBoxParam(
1047 pgContext
->hDllInstance
,
1048 MAKEINTRESOURCEW(IDD_LOCKED_DLG
),
1054 GINA_UI GinaGraphicalUI
= {
1056 GUIDisplayStatusMessage
,
1057 GUIRemoveStatusMessage
,
1058 GUIDisplaySASNotice
,
1062 GUIDisplayLockedNotice
,