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 /* Connect to the LSA server */
349 if (!ConnectToLsa(pgContext
))
351 ERR("ConnectToLsa() failed\n");
355 /* Call the authentication package */
356 Status
= LsaCallAuthenticationPackage(pgContext
->LsaHandle
,
357 pgContext
->AuthenticationPackage
,
360 (PVOID
*)&ResponseBuffer
,
363 if (!NT_SUCCESS(Status
))
365 ERR("LsaCallAuthenticationPackage failed (Status 0x%08lx)\n", Status
);
369 if (!NT_SUCCESS(ProtocolStatus
))
371 TRACE("LsaCallAuthenticationPackage failed (ProtocolStatus 0x%08lx)\n", ProtocolStatus
);
377 ResourceMessageBox(pgContext
,
379 MB_OK
| MB_ICONINFORMATION
,
381 IDS_PASSWORDCHANGED
);
384 if (RequestBuffer
!= NULL
)
385 HeapFree(GetProcessHeap(), 0, RequestBuffer
);
387 if (ResponseBuffer
!= NULL
)
388 LsaFreeReturnBuffer(ResponseBuffer
);
394 static INT_PTR CALLBACK
395 ChangePasswordDialogProc(
401 PGINA_CONTEXT pgContext
;
403 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
408 pgContext
= (PGINA_CONTEXT
)lParam
;
409 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
411 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_USERNAME
, pgContext
->UserName
);
412 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_ADDSTRING
, 0, (LPARAM
)pgContext
->Domain
);
413 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_SETCURSEL
, 0, 0);
414 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
418 switch (LOWORD(wParam
))
421 if (DoChangePassword(pgContext
, hwndDlg
))
423 EndDialog(hwndDlg
, TRUE
);
427 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD1
, NULL
);
428 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD2
, NULL
);
429 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
434 EndDialog(hwndDlg
, FALSE
);
440 EndDialog(hwndDlg
, FALSE
);
449 OnInitSecurityDlg(HWND hwnd
,
450 PGINA_CONTEXT pgContext
)
457 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONMSG
, Buffer1
, 256);
459 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
460 wsprintfW(Buffer4
, Buffer1
, Buffer2
);
462 SetDlgItemTextW(hwnd
, IDC_LOGONMSG
, Buffer4
);
464 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONDATE
, Buffer1
, 256);
466 GetDateFormatW(LOCALE_USER_DEFAULT
, DATE_SHORTDATE
,
467 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer2
, 256);
469 GetTimeFormatW(LOCALE_USER_DEFAULT
, 0,
470 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer3
, 256);
472 wsprintfW(Buffer4
, Buffer1
, Buffer2
, Buffer3
);
474 SetDlgItemTextW(hwnd
, IDC_LOGONDATE
, Buffer4
);
476 if (pgContext
->bAutoAdminLogon
== TRUE
)
477 EnableWindow(GetDlgItem(hwnd
, IDC_LOGOFF
), FALSE
);
484 IN PGINA_CONTEXT pgContext
)
488 TRACE("OnChangePassword()\n");
490 res
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
492 pgContext
->hDllInstance
,
493 MAKEINTRESOURCEW(IDD_CHANGE_PASSWORD
),
495 ChangePasswordDialogProc
,
498 TRACE("Result: %x\n", res
);
504 static INT_PTR CALLBACK
517 switch (LOWORD(wParam
))
520 EndDialog(hwndDlg
, IDYES
);
524 EndDialog(hwndDlg
, IDNO
);
530 EndDialog(hwndDlg
, IDNO
);
542 IN PGINA_CONTEXT pgContext
)
544 return pgContext
->pWlxFuncs
->WlxDialogBoxParam(
546 pgContext
->hDllInstance
,
547 MAKEINTRESOURCEW(IDD_LOGOFF_DLG
),
554 static INT_PTR CALLBACK
561 PGINA_CONTEXT pgContext
;
563 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
569 pgContext
= (PGINA_CONTEXT
)lParam
;
570 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
572 OnInitSecurityDlg(hwndDlg
, (PGINA_CONTEXT
)lParam
);
573 SetFocus(GetDlgItem(hwndDlg
, IDNO
));
579 switch (LOWORD(wParam
))
582 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOCK_WKSTA
);
585 if (OnLogOff(hwndDlg
, pgContext
) == IDYES
)
586 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOGOFF
);
589 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
);
592 if (OnChangePassword(hwndDlg
, pgContext
))
593 EndDialog(hwndDlg
, WLX_SAS_ACTION_PWD_CHANGED
);
596 EndDialog(hwndDlg
, WLX_SAS_ACTION_TASKLIST
);
599 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
606 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
616 IN OUT PGINA_CONTEXT pgContext
,
621 TRACE("GUILoggedOnSAS()\n");
623 if (dwSasType
!= WLX_SAS_TYPE_CTRL_ALT_DEL
)
625 /* Nothing to do for WLX_SAS_TYPE_TIMEOUT ; the dialog will
626 * close itself thanks to the use of WlxDialogBoxParam */
627 return WLX_SAS_ACTION_NONE
;
630 pgContext
->pWlxFuncs
->WlxSwitchDesktopToWinlogon(
633 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
635 pgContext
->hDllInstance
,
636 MAKEINTRESOURCEW(IDD_LOGGEDON_DLG
),
641 if (result
< WLX_SAS_ACTION_LOGON
||
642 result
> WLX_SAS_ACTION_SWITCH_CONSOLE
)
644 result
= WLX_SAS_ACTION_NONE
;
647 if (result
== WLX_SAS_ACTION_NONE
)
649 pgContext
->pWlxFuncs
->WlxSwitchDesktopToUser(
656 static INT_PTR CALLBACK
663 PGINA_CONTEXT pgContext
;
665 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
671 /* FIXME: take care of NoDomainUI */
672 pgContext
= (PGINA_CONTEXT
)lParam
;
673 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
675 if (pgContext
->bDontDisplayLastUserName
== FALSE
)
676 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
678 if (pgContext
->bDisableCAD
== TRUE
)
679 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
681 if (pgContext
->bShutdownWithoutLogon
== FALSE
)
682 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHUTDOWN
), FALSE
);
684 SetFocus(GetDlgItem(hwndDlg
, pgContext
->bDontDisplayLastUserName
? IDC_USERNAME
: IDC_PASSWORD
));
686 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
693 if (pgContext
->hBitmap
)
695 hdc
= BeginPaint(hwndDlg
, &ps
);
696 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
697 EndPaint(hwndDlg
, &ps
);
703 DeleteObject(pgContext
->hBitmap
);
708 switch (LOWORD(wParam
))
712 LPWSTR UserName
= NULL
, Password
= NULL
;
713 INT result
= WLX_SAS_ACTION_NONE
;
715 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
717 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
) &&
718 DoLoginTasks(pgContext
, UserName
, NULL
, Password
))
720 pgContext
->Password
= HeapAlloc(GetProcessHeap(),
722 (wcslen(Password
) + 1) * sizeof(WCHAR
));
723 if (pgContext
->Password
!= NULL
)
724 wcscpy(pgContext
->Password
, Password
);
726 result
= WLX_SAS_ACTION_LOGON
;
728 HeapFree(GetProcessHeap(), 0, UserName
);
729 HeapFree(GetProcessHeap(), 0, Password
);
730 EndDialog(hwndDlg
, result
);
735 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
740 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN
);
753 IN OUT PGINA_CONTEXT pgContext
)
757 TRACE("GUILoggedOutSAS()\n");
759 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
761 pgContext
->hDllInstance
,
762 MAKEINTRESOURCEW(IDD_LOGGEDOUT_DLG
),
766 if (result
>= WLX_SAS_ACTION_LOGON
&&
767 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
769 WARN("WlxLoggedOutSAS() returns 0x%x\n", result
);
773 WARN("WlxDialogBoxParam() failed (0x%x)\n", result
);
774 return WLX_SAS_ACTION_NONE
;
779 SetLockMessage(HWND hwnd
,
781 PGINA_CONTEXT pgContext
)
787 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKMSG
, Buffer1
, 256);
789 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
790 wsprintfW(Buffer3
, Buffer1
, Buffer2
);
792 SetDlgItemTextW(hwnd
, nDlgItem
, Buffer3
);
800 IN PGINA_CONTEXT pgContext
,
805 LPWSTR UserName
= NULL
;
806 LPWSTR Password
= NULL
;
809 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
812 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
))
814 if (UserName
!= NULL
&& Password
!= NULL
&&
815 wcscmp(UserName
, pgContext
->UserName
) == 0 &&
816 wcscmp(Password
, pgContext
->Password
) == 0)
818 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
821 else if (wcscmp(UserName
, pgContext
->UserName
) == 0 &&
822 wcscmp(Password
, pgContext
->Password
) != 0)
825 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGPASSWORD
, Buffer2
, 256);
826 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
827 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
831 /* Wrong user name */
832 if (DoAdminUnlock(pgContext
, UserName
, NULL
, Password
))
834 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
839 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGUSER
, Buffer1
, 256);
840 wsprintfW(Buffer2
, Buffer1
, pgContext
->Domain
, pgContext
->UserName
);
841 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
842 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
847 if (UserName
!= NULL
)
848 HeapFree(GetProcessHeap(), 0, UserName
);
850 if (Password
!= NULL
)
851 HeapFree(GetProcessHeap(), 0, Password
);
866 PGINA_CONTEXT pgContext
;
867 INT result
= WLX_SAS_ACTION_NONE
;
869 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
874 pgContext
= (PGINA_CONTEXT
)lParam
;
875 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
877 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
879 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
880 SetFocus(GetDlgItem(hwndDlg
, IDC_PASSWORD
));
882 if (pgContext
->bDisableCAD
== TRUE
)
883 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
885 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
892 if (pgContext
->hBitmap
)
894 hdc
= BeginPaint(hwndDlg
, &ps
);
895 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
896 EndPaint(hwndDlg
, &ps
);
901 DeleteObject(pgContext
->hBitmap
);
905 switch (LOWORD(wParam
))
908 if (DoUnlock(hwndDlg
, pgContext
, &result
))
909 EndDialog(hwndDlg
, result
);
913 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
925 IN OUT PGINA_CONTEXT pgContext
)
929 TRACE("GUILockedSAS()\n");
931 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
933 pgContext
->hDllInstance
,
934 MAKEINTRESOURCEW(IDD_UNLOCK_DLG
),
938 if (result
>= WLX_SAS_ACTION_LOGON
&&
939 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
941 WARN("GUILockedSAS() returns 0x%x\n", result
);
945 WARN("GUILockedSAS() failed (0x%x)\n", result
);
946 return WLX_SAS_ACTION_NONE
;
950 static INT_PTR CALLBACK
957 PGINA_CONTEXT pgContext
;
959 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
965 pgContext
= (PGINA_CONTEXT
)lParam
;
966 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
968 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
969 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
976 if (pgContext
->hBitmap
)
978 hdc
= BeginPaint(hwndDlg
, &ps
);
979 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
980 EndPaint(hwndDlg
, &ps
);
986 DeleteObject(pgContext
->hBitmap
);
996 GUIDisplayLockedNotice(
997 IN OUT PGINA_CONTEXT pgContext
)
999 TRACE("GUIdisplayLockedNotice()\n");
1001 pgContext
->pWlxFuncs
->WlxDialogBoxParam(
1003 pgContext
->hDllInstance
,
1004 MAKEINTRESOURCEW(IDD_LOCKED_DLG
),
1010 GINA_UI GinaGraphicalUI
= {
1012 GUIDisplayStatusMessage
,
1013 GUIRemoveStatusMessage
,
1014 GUIDisplaySASNotice
,
1018 GUIDisplayLockedNotice
,