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
)
113 msg
= (PDISPLAYSTATUSMSG
)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(DISPLAYSTATUSMSG
));
117 msg
->Context
= pgContext
;
118 msg
->dwOptions
= dwOptions
;
119 msg
->pTitle
= pTitle
;
120 msg
->pMessage
= pMessage
;
121 msg
->hDesktop
= hDesktop
;
123 msg
->StartupEvent
= CreateEventW(
129 if (!msg
->StartupEvent
)
132 Thread
= CreateThread(
142 WaitForSingleObject(msg
->StartupEvent
, INFINITE
);
143 CloseHandle(msg
->StartupEvent
);
151 SetWindowTextW(pgContext
->hStatusWindow
, pTitle
);
153 SetDlgItemTextW(pgContext
->hStatusWindow
, IDC_STATUSLABEL
, pMessage
);
159 GUIRemoveStatusMessage(
160 IN PGINA_CONTEXT pgContext
)
162 if (pgContext
->hStatusWindow
)
164 EndDialog(pgContext
->hStatusWindow
, 0);
165 pgContext
->hStatusWindow
= NULL
;
171 static INT_PTR CALLBACK
178 UNREFERENCED_PARAMETER(hwndDlg
);
179 UNREFERENCED_PARAMETER(uMsg
);
180 UNREFERENCED_PARAMETER(wParam
);
181 UNREFERENCED_PARAMETER(lParam
);
188 IN OUT PGINA_CONTEXT pgContext
)
190 TRACE("GUIDisplaySASNotice()\n");
192 /* Display the notice window */
193 pgContext
->pWlxFuncs
->WlxDialogBoxParam(pgContext
->hWlx
,
194 pgContext
->hDllInstance
,
195 MAKEINTRESOURCEW(IDD_NOTICE_DLG
),
201 /* Get the text contained in a textbox. Allocates memory in pText
202 * to contain the text. Returns TRUE in case of success */
212 Count
= GetWindowTextLength(GetDlgItem(hwndDlg
, TextboxId
));
213 Text
= HeapAlloc(GetProcessHeap(), 0, (Count
+ 1) * sizeof(WCHAR
));
216 if (Count
!= GetWindowTextW(GetDlgItem(hwndDlg
, TextboxId
), Text
, Count
+ 1))
218 HeapFree(GetProcessHeap(), 0, Text
);
229 IN PGINA_CONTEXT pgContext
,
235 WCHAR szCaption
[256];
238 LoadStringW(pgContext
->hDllInstance
, uCaption
, szCaption
, 256);
239 LoadStringW(pgContext
->hDllInstance
, uText
, szText
, 256);
241 return pgContext
->pWlxFuncs
->WlxMessageBox(pgContext
->hWlx
,
252 IN PGINA_CONTEXT pgContext
,
256 WCHAR DomainName
[256];
257 WCHAR OldPassword
[256];
258 WCHAR NewPassword1
[256];
259 WCHAR NewPassword2
[256];
260 PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer
= NULL
;
261 PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer
= NULL
;
262 ULONG RequestBufferSize
;
263 ULONG ResponseBufferSize
= 0;
266 NTSTATUS ProtocolStatus
;
269 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_USERNAME
, UserName
, 256);
270 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, DomainName
, 256);
271 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_OLDPWD
, OldPassword
, 256);
272 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD1
, NewPassword1
, 256);
273 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD2
, NewPassword2
, 256);
275 /* Compare the two passwords and fail if they do not match */
276 if (wcscmp(NewPassword1
, NewPassword2
) != 0)
278 ResourceMessageBox(pgContext
,
280 MB_OK
| MB_ICONEXCLAMATION
,
282 IDS_NONMATCHINGPASSWORDS
);
286 /* Calculate the request buffer size */
287 RequestBufferSize
= sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
) +
288 ((wcslen(DomainName
) + 1) * sizeof(WCHAR
)) +
289 ((wcslen(UserName
) + 1) * sizeof(WCHAR
)) +
290 ((wcslen(OldPassword
) + 1) * sizeof(WCHAR
)) +
291 ((wcslen(NewPassword1
) + 1) * sizeof(WCHAR
));
293 /* Allocate the request buffer */
294 RequestBuffer
= HeapAlloc(GetProcessHeap(),
297 if (RequestBuffer
== NULL
)
299 ERR("HeapAlloc failed\n");
303 /* Initialize the request buffer */
304 RequestBuffer
->MessageType
= MsV1_0ChangePassword
;
305 RequestBuffer
->Impersonating
= TRUE
;
307 Ptr
= (LPWSTR
)((ULONG_PTR
)RequestBuffer
+ sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
));
309 /* Pack the domain name */
310 RequestBuffer
->DomainName
.Length
= wcslen(DomainName
) * sizeof(WCHAR
);
311 RequestBuffer
->DomainName
.MaximumLength
= RequestBuffer
->DomainName
.Length
+ sizeof(WCHAR
);
312 RequestBuffer
->DomainName
.Buffer
= Ptr
;
314 RtlCopyMemory(RequestBuffer
->DomainName
.Buffer
,
316 RequestBuffer
->DomainName
.MaximumLength
);
318 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->DomainName
.MaximumLength
);
320 /* Pack the user name */
321 RequestBuffer
->AccountName
.Length
= wcslen(UserName
) * sizeof(WCHAR
);
322 RequestBuffer
->AccountName
.MaximumLength
= RequestBuffer
->AccountName
.Length
+ sizeof(WCHAR
);
323 RequestBuffer
->AccountName
.Buffer
= Ptr
;
325 RtlCopyMemory(RequestBuffer
->AccountName
.Buffer
,
327 RequestBuffer
->AccountName
.MaximumLength
);
329 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->AccountName
.MaximumLength
);
331 /* Pack the old password */
332 RequestBuffer
->OldPassword
.Length
= wcslen(OldPassword
) * sizeof(WCHAR
);
333 RequestBuffer
->OldPassword
.MaximumLength
= RequestBuffer
->OldPassword
.Length
+ sizeof(WCHAR
);
334 RequestBuffer
->OldPassword
.Buffer
= Ptr
;
336 RtlCopyMemory(RequestBuffer
->OldPassword
.Buffer
,
338 RequestBuffer
->OldPassword
.MaximumLength
);
340 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->OldPassword
.MaximumLength
);
342 /* Pack the new password */
343 RequestBuffer
->NewPassword
.Length
= wcslen(NewPassword1
) * sizeof(WCHAR
);
344 RequestBuffer
->NewPassword
.MaximumLength
= RequestBuffer
->NewPassword
.Length
+ sizeof(WCHAR
);
345 RequestBuffer
->NewPassword
.Buffer
= Ptr
;
347 RtlCopyMemory(RequestBuffer
->NewPassword
.Buffer
,
349 RequestBuffer
->NewPassword
.MaximumLength
);
351 /* Connect to the LSA server */
352 if (!ConnectToLsa(pgContext
))
354 ERR("ConnectToLsa() failed\n");
358 /* Call the authentication package */
359 Status
= LsaCallAuthenticationPackage(pgContext
->LsaHandle
,
360 pgContext
->AuthenticationPackage
,
363 (PVOID
*)&ResponseBuffer
,
366 if (!NT_SUCCESS(Status
))
368 ERR("LsaCallAuthenticationPackage failed (Status 0x%08lx)\n", Status
);
372 if (!NT_SUCCESS(ProtocolStatus
))
374 TRACE("LsaCallAuthenticationPackage failed (ProtocolStatus 0x%08lx)\n", ProtocolStatus
);
380 ResourceMessageBox(pgContext
,
382 MB_OK
| MB_ICONINFORMATION
,
384 IDS_PASSWORDCHANGED
);
387 if (RequestBuffer
!= NULL
)
388 HeapFree(GetProcessHeap(), 0, RequestBuffer
);
390 if (ResponseBuffer
!= NULL
)
391 LsaFreeReturnBuffer(ResponseBuffer
);
397 static INT_PTR CALLBACK
398 ChangePasswordDialogProc(
404 PGINA_CONTEXT pgContext
;
406 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
411 pgContext
= (PGINA_CONTEXT
)lParam
;
412 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
414 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_USERNAME
, pgContext
->UserName
);
415 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_ADDSTRING
, 0, (LPARAM
)pgContext
->Domain
);
416 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_SETCURSEL
, 0, 0);
417 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
421 switch (LOWORD(wParam
))
424 if (DoChangePassword(pgContext
, hwndDlg
))
426 EndDialog(hwndDlg
, TRUE
);
430 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD1
, NULL
);
431 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD2
, NULL
);
432 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
437 EndDialog(hwndDlg
, FALSE
);
443 EndDialog(hwndDlg
, FALSE
);
452 OnInitSecurityDlg(HWND hwnd
,
453 PGINA_CONTEXT pgContext
)
460 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONMSG
, Buffer1
, 256);
462 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
463 wsprintfW(Buffer4
, Buffer1
, Buffer2
);
465 SetDlgItemTextW(hwnd
, IDC_LOGONMSG
, Buffer4
);
467 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONDATE
, Buffer1
, 256);
469 GetDateFormatW(LOCALE_USER_DEFAULT
, DATE_SHORTDATE
,
470 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer2
, 256);
472 GetTimeFormatW(LOCALE_USER_DEFAULT
, 0,
473 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer3
, 256);
475 wsprintfW(Buffer4
, Buffer1
, Buffer2
, Buffer3
);
477 SetDlgItemTextW(hwnd
, IDC_LOGONDATE
, Buffer4
);
479 if (pgContext
->bAutoAdminLogon
== TRUE
)
480 EnableWindow(GetDlgItem(hwnd
, IDC_LOGOFF
), FALSE
);
487 IN PGINA_CONTEXT pgContext
)
491 TRACE("OnChangePassword()\n");
493 res
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
495 pgContext
->hDllInstance
,
496 MAKEINTRESOURCEW(IDD_CHANGE_PASSWORD
),
498 ChangePasswordDialogProc
,
501 TRACE("Result: %x\n", res
);
507 static INT_PTR CALLBACK
520 switch (LOWORD(wParam
))
523 EndDialog(hwndDlg
, IDYES
);
527 EndDialog(hwndDlg
, IDNO
);
533 EndDialog(hwndDlg
, IDNO
);
545 IN PGINA_CONTEXT pgContext
)
547 return pgContext
->pWlxFuncs
->WlxDialogBoxParam(
549 pgContext
->hDllInstance
,
550 MAKEINTRESOURCEW(IDD_LOGOFF_DLG
),
557 static INT_PTR CALLBACK
564 PGINA_CONTEXT pgContext
;
566 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
572 pgContext
= (PGINA_CONTEXT
)lParam
;
573 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
575 OnInitSecurityDlg(hwndDlg
, (PGINA_CONTEXT
)lParam
);
576 SetFocus(GetDlgItem(hwndDlg
, IDNO
));
582 switch (LOWORD(wParam
))
585 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOCK_WKSTA
);
588 if (OnLogOff(hwndDlg
, pgContext
) == IDYES
)
589 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOGOFF
);
592 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
);
595 if (OnChangePassword(hwndDlg
, pgContext
))
596 EndDialog(hwndDlg
, WLX_SAS_ACTION_PWD_CHANGED
);
599 EndDialog(hwndDlg
, WLX_SAS_ACTION_TASKLIST
);
602 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
609 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
619 IN OUT PGINA_CONTEXT pgContext
,
624 TRACE("GUILoggedOnSAS()\n");
626 if (dwSasType
!= WLX_SAS_TYPE_CTRL_ALT_DEL
)
628 /* Nothing to do for WLX_SAS_TYPE_TIMEOUT ; the dialog will
629 * close itself thanks to the use of WlxDialogBoxParam */
630 return WLX_SAS_ACTION_NONE
;
633 pgContext
->pWlxFuncs
->WlxSwitchDesktopToWinlogon(
636 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
638 pgContext
->hDllInstance
,
639 MAKEINTRESOURCEW(IDD_LOGGEDON_DLG
),
644 if (result
< WLX_SAS_ACTION_LOGON
||
645 result
> WLX_SAS_ACTION_SWITCH_CONSOLE
)
647 result
= WLX_SAS_ACTION_NONE
;
650 if (result
== WLX_SAS_ACTION_NONE
)
652 pgContext
->pWlxFuncs
->WlxSwitchDesktopToUser(
659 static INT_PTR CALLBACK
666 PGINA_CONTEXT pgContext
;
668 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
674 /* FIXME: take care of NoDomainUI */
675 pgContext
= (PGINA_CONTEXT
)lParam
;
676 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
678 if (pgContext
->bDontDisplayLastUserName
== FALSE
)
679 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
681 if (pgContext
->bDisableCAD
== TRUE
)
682 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
684 if (pgContext
->bShutdownWithoutLogon
== FALSE
)
685 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHUTDOWN
), FALSE
);
687 SetFocus(GetDlgItem(hwndDlg
, pgContext
->bDontDisplayLastUserName
? IDC_USERNAME
: IDC_PASSWORD
));
689 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
696 if (pgContext
->hBitmap
)
698 hdc
= BeginPaint(hwndDlg
, &ps
);
699 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
700 EndPaint(hwndDlg
, &ps
);
706 DeleteObject(pgContext
->hBitmap
);
711 switch (LOWORD(wParam
))
715 LPWSTR UserName
= NULL
, Password
= NULL
;
716 INT result
= WLX_SAS_ACTION_NONE
;
718 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
720 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
) &&
721 DoLoginTasks(pgContext
, UserName
, NULL
, Password
))
723 pgContext
->Password
= HeapAlloc(GetProcessHeap(),
725 (wcslen(Password
) + 1) * sizeof(WCHAR
));
726 if (pgContext
->Password
!= NULL
)
727 wcscpy(pgContext
->Password
, Password
);
729 result
= WLX_SAS_ACTION_LOGON
;
731 HeapFree(GetProcessHeap(), 0, UserName
);
732 HeapFree(GetProcessHeap(), 0, Password
);
733 EndDialog(hwndDlg
, result
);
738 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
743 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN
);
756 IN OUT PGINA_CONTEXT pgContext
)
760 TRACE("GUILoggedOutSAS()\n");
762 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
764 pgContext
->hDllInstance
,
765 MAKEINTRESOURCEW(IDD_LOGGEDOUT_DLG
),
769 if (result
>= WLX_SAS_ACTION_LOGON
&&
770 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
772 WARN("WlxLoggedOutSAS() returns 0x%x\n", result
);
776 WARN("WlxDialogBoxParam() failed (0x%x)\n", result
);
777 return WLX_SAS_ACTION_NONE
;
782 SetLockMessage(HWND hwnd
,
784 PGINA_CONTEXT pgContext
)
790 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKMSG
, Buffer1
, 256);
792 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
793 wsprintfW(Buffer3
, Buffer1
, Buffer2
);
795 SetDlgItemTextW(hwnd
, nDlgItem
, Buffer3
);
803 IN PGINA_CONTEXT pgContext
,
808 LPWSTR UserName
= NULL
;
809 LPWSTR Password
= NULL
;
812 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
815 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
))
817 if (UserName
!= NULL
&& Password
!= NULL
&&
818 wcscmp(UserName
, pgContext
->UserName
) == 0 &&
819 wcscmp(Password
, pgContext
->Password
) == 0)
821 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
824 else if (wcscmp(UserName
, pgContext
->UserName
) == 0 &&
825 wcscmp(Password
, pgContext
->Password
) != 0)
828 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGPASSWORD
, Buffer2
, 256);
829 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
830 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
834 /* Wrong user name */
835 if (DoAdminUnlock(pgContext
, UserName
, NULL
, Password
))
837 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
842 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGUSER
, Buffer1
, 256);
843 wsprintfW(Buffer2
, Buffer1
, pgContext
->Domain
, pgContext
->UserName
);
844 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
845 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
850 if (UserName
!= NULL
)
851 HeapFree(GetProcessHeap(), 0, UserName
);
853 if (Password
!= NULL
)
854 HeapFree(GetProcessHeap(), 0, Password
);
869 PGINA_CONTEXT pgContext
;
870 INT result
= WLX_SAS_ACTION_NONE
;
872 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
877 pgContext
= (PGINA_CONTEXT
)lParam
;
878 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
880 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
882 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
883 SetFocus(GetDlgItem(hwndDlg
, IDC_PASSWORD
));
885 if (pgContext
->bDisableCAD
== TRUE
)
886 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
888 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
895 if (pgContext
->hBitmap
)
897 hdc
= BeginPaint(hwndDlg
, &ps
);
898 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
899 EndPaint(hwndDlg
, &ps
);
904 DeleteObject(pgContext
->hBitmap
);
908 switch (LOWORD(wParam
))
911 if (DoUnlock(hwndDlg
, pgContext
, &result
))
912 EndDialog(hwndDlg
, result
);
916 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
928 IN OUT PGINA_CONTEXT pgContext
)
932 TRACE("GUILockedSAS()\n");
934 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
936 pgContext
->hDllInstance
,
937 MAKEINTRESOURCEW(IDD_UNLOCK_DLG
),
941 if (result
>= WLX_SAS_ACTION_LOGON
&&
942 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
944 WARN("GUILockedSAS() returns 0x%x\n", result
);
948 WARN("GUILockedSAS() failed (0x%x)\n", result
);
949 return WLX_SAS_ACTION_NONE
;
953 static INT_PTR CALLBACK
960 PGINA_CONTEXT pgContext
;
962 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
968 pgContext
= (PGINA_CONTEXT
)lParam
;
969 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
971 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
972 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
979 if (pgContext
->hBitmap
)
981 hdc
= BeginPaint(hwndDlg
, &ps
);
982 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
983 EndPaint(hwndDlg
, &ps
);
989 DeleteObject(pgContext
->hBitmap
);
999 GUIDisplayLockedNotice(
1000 IN OUT PGINA_CONTEXT pgContext
)
1002 TRACE("GUIdisplayLockedNotice()\n");
1004 pgContext
->pWlxFuncs
->WlxDialogBoxParam(
1006 pgContext
->hDllInstance
,
1007 MAKEINTRESOURCEW(IDD_LOCKED_DLG
),
1013 GINA_UI GinaGraphicalUI
= {
1015 GUIDisplayStatusMessage
,
1016 GUIRemoveStatusMessage
,
1017 GUIDisplaySASNotice
,
1021 GUIDisplayLockedNotice
,