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)
10 typedef struct _DISPLAYSTATUSMSG
12 PGINA_CONTEXT Context
;
18 } DISPLAYSTATUSMSG
, *PDISPLAYSTATUSMSG
;
22 IN OUT PGINA_CONTEXT pgContext
)
24 TRACE("GUIInitialize(%p)\n", pgContext
);
28 static INT_PTR CALLBACK
29 StatusMessageWindowProc(
35 UNREFERENCED_PARAMETER(wParam
);
41 PDISPLAYSTATUSMSG msg
= (PDISPLAYSTATUSMSG
)lParam
;
45 msg
->Context
->hStatusWindow
= hwndDlg
;
48 SetWindowTextW(hwndDlg
, msg
->pTitle
);
49 SetDlgItemTextW(hwndDlg
, IDC_STATUSLABEL
, msg
->pMessage
);
50 SetEvent(msg
->StartupEvent
);
58 StartupWindowThread(LPVOID lpParam
)
61 PDISPLAYSTATUSMSG msg
= (PDISPLAYSTATUSMSG
)lpParam
;
63 /* When SetThreadDesktop is called the system closes the desktop handle when needed
64 so we have to create a new handle because this handle may still be in use by winlogon */
65 if (!DuplicateHandle ( GetCurrentProcess(),
71 DUPLICATE_SAME_ACCESS
))
73 HeapFree(GetProcessHeap(), 0, lpParam
);
77 if(!SetThreadDesktop(hDesk
))
79 HeapFree(GetProcessHeap(), 0, lpParam
);
85 MAKEINTRESOURCE(IDD_STATUSWINDOW_DLG
),
87 StatusMessageWindowProc
,
90 HeapFree(GetProcessHeap(), 0, lpParam
);
95 GUIDisplayStatusMessage(
96 IN PGINA_CONTEXT pgContext
,
102 PDISPLAYSTATUSMSG msg
;
106 TRACE("GUIDisplayStatusMessage(%ws)\n", pMessage
);
108 if (!pgContext
->hStatusWindow
)
110 msg
= (PDISPLAYSTATUSMSG
)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(DISPLAYSTATUSMSG
));
114 msg
->Context
= pgContext
;
115 msg
->dwOptions
= dwOptions
;
116 msg
->pTitle
= pTitle
;
117 msg
->pMessage
= pMessage
;
118 msg
->hDesktop
= hDesktop
;
120 msg
->StartupEvent
= CreateEventW(
126 if (!msg
->StartupEvent
)
129 Thread
= CreateThread(
139 WaitForSingleObject(msg
->StartupEvent
, INFINITE
);
140 CloseHandle(msg
->StartupEvent
);
148 SetWindowTextW(pgContext
->hStatusWindow
, pTitle
);
150 SetDlgItemTextW(pgContext
->hStatusWindow
, IDC_STATUSLABEL
, pMessage
);
156 GUIRemoveStatusMessage(
157 IN PGINA_CONTEXT pgContext
)
159 if (pgContext
->hStatusWindow
)
161 EndDialog(pgContext
->hStatusWindow
, 0);
162 pgContext
->hStatusWindow
= NULL
;
168 static INT_PTR CALLBACK
175 UNREFERENCED_PARAMETER(hwndDlg
);
176 UNREFERENCED_PARAMETER(uMsg
);
177 UNREFERENCED_PARAMETER(wParam
);
178 UNREFERENCED_PARAMETER(lParam
);
185 IN OUT PGINA_CONTEXT pgContext
)
187 TRACE("GUIDisplaySASNotice()\n");
189 /* Display the notice window */
190 pgContext
->pWlxFuncs
->WlxDialogBoxParam(pgContext
->hWlx
,
191 pgContext
->hDllInstance
,
192 MAKEINTRESOURCEW(IDD_NOTICE_DLG
),
198 /* Get the text contained in a textbox. Allocates memory in pText
199 * to contain the text. Returns TRUE in case of success */
209 Count
= GetWindowTextLength(GetDlgItem(hwndDlg
, TextboxId
));
210 Text
= HeapAlloc(GetProcessHeap(), 0, (Count
+ 1) * sizeof(WCHAR
));
213 if (Count
!= GetWindowTextW(GetDlgItem(hwndDlg
, TextboxId
), Text
, Count
+ 1))
215 HeapFree(GetProcessHeap(), 0, Text
);
226 IN PGINA_CONTEXT pgContext
,
232 WCHAR szCaption
[256];
235 LoadStringW(pgContext
->hDllInstance
, uCaption
, szCaption
, 256);
236 LoadStringW(pgContext
->hDllInstance
, uText
, szText
, 256);
238 return pgContext
->pWlxFuncs
->WlxMessageBox(pgContext
->hWlx
,
249 IN PGINA_CONTEXT pgContext
,
253 WCHAR DomainName
[256];
254 WCHAR OldPassword
[256];
255 WCHAR NewPassword1
[256];
256 WCHAR NewPassword2
[256];
257 PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer
= NULL
;
258 PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer
= NULL
;
259 ULONG RequestBufferSize
;
260 ULONG ResponseBufferSize
= 0;
263 NTSTATUS ProtocolStatus
;
266 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_USERNAME
, UserName
, 256);
267 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, DomainName
, 256);
268 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_OLDPWD
, OldPassword
, 256);
269 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD1
, NewPassword1
, 256);
270 GetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD2
, NewPassword2
, 256);
272 /* Compare the two passwords and fail if they do not match */
273 if (wcscmp(NewPassword1
, NewPassword2
) != 0)
275 ResourceMessageBox(pgContext
,
277 MB_OK
| MB_ICONEXCLAMATION
,
279 IDS_NONMATCHINGPASSWORDS
);
283 /* Calculate the request buffer size */
284 RequestBufferSize
= sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
) +
285 ((wcslen(DomainName
) + 1) * sizeof(WCHAR
)) +
286 ((wcslen(UserName
) + 1) * sizeof(WCHAR
)) +
287 ((wcslen(OldPassword
) + 1) * sizeof(WCHAR
)) +
288 ((wcslen(NewPassword1
) + 1) * sizeof(WCHAR
));
290 /* Allocate the request buffer */
291 RequestBuffer
= HeapAlloc(GetProcessHeap(),
294 if (RequestBuffer
== NULL
)
296 ERR("HeapAlloc failed\n");
300 /* Initialize the request buffer */
301 RequestBuffer
->MessageType
= MsV1_0ChangePassword
;
302 RequestBuffer
->Impersonating
= TRUE
;
304 Ptr
= (LPWSTR
)((ULONG_PTR
)RequestBuffer
+ sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
));
306 /* Pack the domain name */
307 RequestBuffer
->DomainName
.Length
= wcslen(DomainName
) * sizeof(WCHAR
);
308 RequestBuffer
->DomainName
.MaximumLength
= RequestBuffer
->DomainName
.Length
+ sizeof(WCHAR
);
309 RequestBuffer
->DomainName
.Buffer
= Ptr
;
311 RtlCopyMemory(RequestBuffer
->DomainName
.Buffer
,
313 RequestBuffer
->DomainName
.MaximumLength
);
315 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->DomainName
.MaximumLength
);
317 /* Pack the user name */
318 RequestBuffer
->AccountName
.Length
= wcslen(UserName
) * sizeof(WCHAR
);
319 RequestBuffer
->AccountName
.MaximumLength
= RequestBuffer
->AccountName
.Length
+ sizeof(WCHAR
);
320 RequestBuffer
->AccountName
.Buffer
= Ptr
;
322 RtlCopyMemory(RequestBuffer
->AccountName
.Buffer
,
324 RequestBuffer
->AccountName
.MaximumLength
);
326 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->AccountName
.MaximumLength
);
328 /* Pack the old password */
329 RequestBuffer
->OldPassword
.Length
= wcslen(OldPassword
) * sizeof(WCHAR
);
330 RequestBuffer
->OldPassword
.MaximumLength
= RequestBuffer
->OldPassword
.Length
+ sizeof(WCHAR
);
331 RequestBuffer
->OldPassword
.Buffer
= Ptr
;
333 RtlCopyMemory(RequestBuffer
->OldPassword
.Buffer
,
335 RequestBuffer
->OldPassword
.MaximumLength
);
337 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->OldPassword
.MaximumLength
);
339 /* Pack the new password */
340 RequestBuffer
->NewPassword
.Length
= wcslen(NewPassword1
) * sizeof(WCHAR
);
341 RequestBuffer
->NewPassword
.MaximumLength
= RequestBuffer
->NewPassword
.Length
+ sizeof(WCHAR
);
342 RequestBuffer
->NewPassword
.Buffer
= Ptr
;
344 RtlCopyMemory(RequestBuffer
->NewPassword
.Buffer
,
346 RequestBuffer
->NewPassword
.MaximumLength
);
348 /* Call the authentication package */
349 Status
= LsaCallAuthenticationPackage(pgContext
->LsaHandle
,
350 pgContext
->AuthenticationPackage
,
353 (PVOID
*)&ResponseBuffer
,
356 if (!NT_SUCCESS(Status
))
358 ERR("LsaCallAuthenticationPackage failed (Status 0x%08lx)\n", Status
);
362 if (!NT_SUCCESS(ProtocolStatus
))
364 TRACE("LsaCallAuthenticationPackage failed (ProtocolStatus 0x%08lx)\n", ProtocolStatus
);
370 ResourceMessageBox(pgContext
,
372 MB_OK
| MB_ICONINFORMATION
,
374 IDS_PASSWORDCHANGED
);
377 if (RequestBuffer
!= NULL
)
378 HeapFree(GetProcessHeap(), 0, RequestBuffer
);
380 if (ResponseBuffer
!= NULL
)
381 LsaFreeReturnBuffer(ResponseBuffer
);
387 static INT_PTR CALLBACK
388 ChangePasswordDialogProc(
394 PGINA_CONTEXT pgContext
;
396 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
401 pgContext
= (PGINA_CONTEXT
)lParam
;
402 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
404 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_USERNAME
, pgContext
->UserName
);
405 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_ADDSTRING
, 0, (LPARAM
)pgContext
->Domain
);
406 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_SETCURSEL
, 0, 0);
407 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
411 switch (LOWORD(wParam
))
414 if (DoChangePassword(pgContext
, hwndDlg
))
416 EndDialog(hwndDlg
, TRUE
);
420 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD1
, NULL
);
421 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD2
, NULL
);
422 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
427 EndDialog(hwndDlg
, FALSE
);
433 EndDialog(hwndDlg
, FALSE
);
442 OnInitSecurityDlg(HWND hwnd
,
443 PGINA_CONTEXT pgContext
)
450 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONMSG
, Buffer1
, 256);
452 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
453 wsprintfW(Buffer4
, Buffer1
, Buffer2
);
455 SetDlgItemTextW(hwnd
, IDC_LOGONMSG
, Buffer4
);
457 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONDATE
, Buffer1
, 256);
459 GetDateFormatW(LOCALE_USER_DEFAULT
, DATE_SHORTDATE
,
460 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer2
, 256);
462 GetTimeFormatW(LOCALE_USER_DEFAULT
, 0,
463 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer3
, 256);
465 wsprintfW(Buffer4
, Buffer1
, Buffer2
, Buffer3
);
467 SetDlgItemTextW(hwnd
, IDC_LOGONDATE
, Buffer4
);
469 if (pgContext
->bAutoAdminLogon
== TRUE
)
470 EnableWindow(GetDlgItem(hwnd
, IDC_LOGOFF
), FALSE
);
477 IN PGINA_CONTEXT pgContext
)
481 TRACE("OnChangePassword()\n");
483 res
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
485 pgContext
->hDllInstance
,
486 MAKEINTRESOURCEW(IDD_CHANGE_PASSWORD
),
488 ChangePasswordDialogProc
,
491 TRACE("Result: %x\n", res
);
497 static INT_PTR CALLBACK
510 switch (LOWORD(wParam
))
513 EndDialog(hwndDlg
, IDYES
);
517 EndDialog(hwndDlg
, IDNO
);
523 EndDialog(hwndDlg
, IDNO
);
535 IN PGINA_CONTEXT pgContext
)
537 return pgContext
->pWlxFuncs
->WlxDialogBoxParam(
539 pgContext
->hDllInstance
,
540 MAKEINTRESOURCEW(IDD_LOGOFF_DLG
),
547 static INT_PTR CALLBACK
554 PGINA_CONTEXT pgContext
;
556 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
562 pgContext
= (PGINA_CONTEXT
)lParam
;
563 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
565 OnInitSecurityDlg(hwndDlg
, (PGINA_CONTEXT
)lParam
);
566 SetFocus(GetDlgItem(hwndDlg
, IDNO
));
572 switch (LOWORD(wParam
))
575 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOCK_WKSTA
);
578 if (OnLogOff(hwndDlg
, pgContext
) == IDYES
)
579 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOGOFF
);
582 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
);
585 if (OnChangePassword(hwndDlg
, pgContext
))
586 EndDialog(hwndDlg
, WLX_SAS_ACTION_PWD_CHANGED
);
589 EndDialog(hwndDlg
, WLX_SAS_ACTION_TASKLIST
);
592 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
599 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
609 IN OUT PGINA_CONTEXT pgContext
,
614 TRACE("GUILoggedOnSAS()\n");
616 if (dwSasType
!= WLX_SAS_TYPE_CTRL_ALT_DEL
)
618 /* Nothing to do for WLX_SAS_TYPE_TIMEOUT ; the dialog will
619 * close itself thanks to the use of WlxDialogBoxParam */
620 return WLX_SAS_ACTION_NONE
;
623 pgContext
->pWlxFuncs
->WlxSwitchDesktopToWinlogon(
626 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
628 pgContext
->hDllInstance
,
629 MAKEINTRESOURCEW(IDD_LOGGEDON_DLG
),
634 if (result
< WLX_SAS_ACTION_LOGON
||
635 result
> WLX_SAS_ACTION_SWITCH_CONSOLE
)
637 result
= WLX_SAS_ACTION_NONE
;
640 if (result
== WLX_SAS_ACTION_NONE
)
642 pgContext
->pWlxFuncs
->WlxSwitchDesktopToUser(
649 static INT_PTR CALLBACK
656 PGINA_CONTEXT pgContext
;
658 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
664 /* FIXME: take care of NoDomainUI */
665 pgContext
= (PGINA_CONTEXT
)lParam
;
666 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
668 if (pgContext
->bDontDisplayLastUserName
== FALSE
)
669 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
671 if (pgContext
->bDisableCAD
== TRUE
)
672 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
674 if (pgContext
->bShutdownWithoutLogon
== FALSE
)
675 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHUTDOWN
), FALSE
);
677 SetFocus(GetDlgItem(hwndDlg
, pgContext
->bDontDisplayLastUserName
? IDC_USERNAME
: IDC_PASSWORD
));
679 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
686 if (pgContext
->hBitmap
)
688 hdc
= BeginPaint(hwndDlg
, &ps
);
689 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
690 EndPaint(hwndDlg
, &ps
);
696 DeleteObject(pgContext
->hBitmap
);
701 switch (LOWORD(wParam
))
705 LPWSTR UserName
= NULL
, Password
= NULL
;
706 INT result
= WLX_SAS_ACTION_NONE
;
708 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
710 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
) &&
711 DoLoginTasks(pgContext
, UserName
, NULL
, Password
))
713 pgContext
->Password
= HeapAlloc(GetProcessHeap(),
715 (wcslen(Password
) + 1) * sizeof(WCHAR
));
716 if (pgContext
->Password
!= NULL
)
717 wcscpy(pgContext
->Password
, Password
);
719 result
= WLX_SAS_ACTION_LOGON
;
721 HeapFree(GetProcessHeap(), 0, UserName
);
722 HeapFree(GetProcessHeap(), 0, Password
);
723 EndDialog(hwndDlg
, result
);
728 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
733 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN
);
746 IN OUT PGINA_CONTEXT pgContext
)
750 TRACE("GUILoggedOutSAS()\n");
752 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
754 pgContext
->hDllInstance
,
755 MAKEINTRESOURCEW(IDD_LOGGEDOUT_DLG
),
759 if (result
>= WLX_SAS_ACTION_LOGON
&&
760 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
762 WARN("WlxLoggedOutSAS() returns 0x%x\n", result
);
766 WARN("WlxDialogBoxParam() failed (0x%x)\n", result
);
767 return WLX_SAS_ACTION_NONE
;
772 SetLockMessage(HWND hwnd
,
774 PGINA_CONTEXT pgContext
)
780 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKMSG
, Buffer1
, 256);
782 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
783 wsprintfW(Buffer3
, Buffer1
, Buffer2
);
785 SetDlgItemTextW(hwnd
, nDlgItem
, Buffer3
);
793 IN PGINA_CONTEXT pgContext
,
798 LPWSTR UserName
= NULL
;
799 LPWSTR Password
= NULL
;
802 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
805 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
))
807 if (UserName
!= NULL
&& Password
!= NULL
&&
808 wcscmp(UserName
, pgContext
->UserName
) == 0 &&
809 wcscmp(Password
, pgContext
->Password
) == 0)
811 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
814 else if (wcscmp(UserName
, pgContext
->UserName
) == 0 &&
815 wcscmp(Password
, pgContext
->Password
) != 0)
818 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGPASSWORD
, Buffer2
, 256);
819 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
820 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
824 /* Wrong user name */
825 if (DoAdminUnlock(UserName
, NULL
, Password
))
827 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
832 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGUSER
, Buffer1
, 256);
833 wsprintfW(Buffer2
, Buffer1
, pgContext
->Domain
, pgContext
->UserName
);
834 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
835 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
840 if (UserName
!= NULL
)
841 HeapFree(GetProcessHeap(), 0, UserName
);
843 if (Password
!= NULL
)
844 HeapFree(GetProcessHeap(), 0, Password
);
859 PGINA_CONTEXT pgContext
;
860 INT result
= WLX_SAS_ACTION_NONE
;
862 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
867 pgContext
= (PGINA_CONTEXT
)lParam
;
868 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
870 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
872 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
873 SetFocus(GetDlgItem(hwndDlg
, IDC_PASSWORD
));
875 if (pgContext
->bDisableCAD
== TRUE
)
876 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
878 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
885 if (pgContext
->hBitmap
)
887 hdc
= BeginPaint(hwndDlg
, &ps
);
888 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
889 EndPaint(hwndDlg
, &ps
);
894 DeleteObject(pgContext
->hBitmap
);
898 switch (LOWORD(wParam
))
901 if (DoUnlock(hwndDlg
, pgContext
, &result
))
902 EndDialog(hwndDlg
, result
);
906 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
918 IN OUT PGINA_CONTEXT pgContext
)
922 TRACE("GUILockedSAS()\n");
924 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
926 pgContext
->hDllInstance
,
927 MAKEINTRESOURCEW(IDD_UNLOCK_DLG
),
931 if (result
>= WLX_SAS_ACTION_LOGON
&&
932 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
934 WARN("GUILockedSAS() returns 0x%x\n", result
);
938 WARN("GUILockedSAS() failed (0x%x)\n", result
);
939 return WLX_SAS_ACTION_NONE
;
943 static INT_PTR CALLBACK
950 PGINA_CONTEXT pgContext
;
952 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
958 pgContext
= (PGINA_CONTEXT
)lParam
;
959 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
961 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
962 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
969 if (pgContext
->hBitmap
)
971 hdc
= BeginPaint(hwndDlg
, &ps
);
972 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
973 EndPaint(hwndDlg
, &ps
);
979 DeleteObject(pgContext
->hBitmap
);
989 GUIDisplayLockedNotice(
990 IN OUT PGINA_CONTEXT pgContext
)
992 TRACE("GUIdisplayLockedNotice()\n");
994 pgContext
->pWlxFuncs
->WlxDialogBoxParam(
996 pgContext
->hDllInstance
,
997 MAKEINTRESOURCEW(IDD_LOCKED_DLG
),
1003 GINA_UI GinaGraphicalUI
= {
1005 GUIDisplayStatusMessage
,
1006 GUIRemoveStatusMessage
,
1007 GUIDisplaySASNotice
,
1011 GUIDisplayLockedNotice
,