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;
262 LSA_STRING PackageName
;
263 HANDLE LsaHandle
= NULL
;
264 ULONG AuthenticationPackage
= 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 Status
= LsaConnectUntrusted(&LsaHandle
);
353 if (!NT_SUCCESS(Status
))
355 ERR("LsaConnectUntrusted failed (Status 0x%08lx)\n", Status
);
359 /* Get the authentication package */
360 RtlInitAnsiString((PANSI_STRING
)&PackageName
,
361 MSV1_0_PACKAGE_NAME
);
363 Status
= LsaLookupAuthenticationPackage(LsaHandle
,
365 &AuthenticationPackage
);
366 if (!NT_SUCCESS(Status
))
368 ERR("LsaLookupAuthenticationPackage failed (Status 0x%08lx)\n", Status
);
372 /* Call the authentication package */
373 Status
= LsaCallAuthenticationPackage(LsaHandle
,
374 AuthenticationPackage
,
377 (PVOID
*)&ResponseBuffer
,
380 if (!NT_SUCCESS(Status
))
382 ERR("LsaCallAuthenticationPackage failed (Status 0x%08lx)\n", Status
);
386 if (!NT_SUCCESS(ProtocolStatus
))
388 TRACE("LsaCallAuthenticationPackage failed (ProtocolStatus 0x%08lx)\n", ProtocolStatus
);
394 ResourceMessageBox(pgContext
,
396 MB_OK
| MB_ICONINFORMATION
,
398 IDS_PASSWORDCHANGED
);
401 if (RequestBuffer
!= NULL
)
402 HeapFree(GetProcessHeap(), 0, RequestBuffer
);
404 if (ResponseBuffer
!= NULL
)
405 LsaFreeReturnBuffer(ResponseBuffer
);
407 if (LsaHandle
!= NULL
)
414 static INT_PTR CALLBACK
415 ChangePasswordDialogProc(
421 PGINA_CONTEXT pgContext
;
423 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
428 pgContext
= (PGINA_CONTEXT
)lParam
;
429 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
431 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_USERNAME
, pgContext
->UserName
);
432 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_ADDSTRING
, 0, (LPARAM
)pgContext
->Domain
);
433 SendDlgItemMessageW(hwndDlg
, IDC_CHANGEPWD_DOMAIN
, CB_SETCURSEL
, 0, 0);
434 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
438 switch (LOWORD(wParam
))
441 if (DoChangePassword(pgContext
, hwndDlg
))
443 EndDialog(hwndDlg
, TRUE
);
447 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD1
, NULL
);
448 SetDlgItemTextW(hwndDlg
, IDC_CHANGEPWD_NEWPWD2
, NULL
);
449 SetFocus(GetDlgItem(hwndDlg
, IDC_CHANGEPWD_OLDPWD
));
454 EndDialog(hwndDlg
, FALSE
);
460 EndDialog(hwndDlg
, FALSE
);
469 OnInitSecurityDlg(HWND hwnd
,
470 PGINA_CONTEXT pgContext
)
477 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONMSG
, Buffer1
, 256);
479 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
480 wsprintfW(Buffer4
, Buffer1
, Buffer2
);
482 SetDlgItemTextW(hwnd
, IDC_LOGONMSG
, Buffer4
);
484 LoadStringW(pgContext
->hDllInstance
, IDS_LOGONDATE
, Buffer1
, 256);
486 GetDateFormatW(LOCALE_USER_DEFAULT
, DATE_SHORTDATE
,
487 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer2
, 256);
489 GetTimeFormatW(LOCALE_USER_DEFAULT
, 0,
490 (SYSTEMTIME
*)&pgContext
->LogonTime
, NULL
, Buffer3
, 256);
492 wsprintfW(Buffer4
, Buffer1
, Buffer2
, Buffer3
);
494 SetDlgItemTextW(hwnd
, IDC_LOGONDATE
, Buffer4
);
496 if (pgContext
->bAutoAdminLogon
== TRUE
)
497 EnableWindow(GetDlgItem(hwnd
, IDC_LOGOFF
), FALSE
);
504 IN PGINA_CONTEXT pgContext
)
508 TRACE("OnChangePassword()\n");
510 res
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
512 pgContext
->hDllInstance
,
513 MAKEINTRESOURCEW(IDD_CHANGE_PASSWORD
),
515 ChangePasswordDialogProc
,
518 TRACE("Result: %x\n", res
);
524 static INT_PTR CALLBACK
537 switch (LOWORD(wParam
))
540 EndDialog(hwndDlg
, IDYES
);
544 EndDialog(hwndDlg
, IDNO
);
550 EndDialog(hwndDlg
, IDNO
);
562 IN PGINA_CONTEXT pgContext
)
564 return pgContext
->pWlxFuncs
->WlxDialogBoxParam(
566 pgContext
->hDllInstance
,
567 MAKEINTRESOURCEW(IDD_LOGOFF_DLG
),
574 static INT_PTR CALLBACK
581 PGINA_CONTEXT pgContext
;
583 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
589 pgContext
= (PGINA_CONTEXT
)lParam
;
590 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
592 OnInitSecurityDlg(hwndDlg
, (PGINA_CONTEXT
)lParam
);
593 SetFocus(GetDlgItem(hwndDlg
, IDNO
));
599 switch (LOWORD(wParam
))
602 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOCK_WKSTA
);
605 if (OnLogOff(hwndDlg
, pgContext
) == IDYES
)
606 EndDialog(hwndDlg
, WLX_SAS_ACTION_LOGOFF
);
609 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
);
612 if (OnChangePassword(hwndDlg
, pgContext
))
613 EndDialog(hwndDlg
, WLX_SAS_ACTION_PWD_CHANGED
);
616 EndDialog(hwndDlg
, WLX_SAS_ACTION_TASKLIST
);
619 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
626 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
636 IN OUT PGINA_CONTEXT pgContext
,
641 TRACE("GUILoggedOnSAS()\n");
643 if (dwSasType
!= WLX_SAS_TYPE_CTRL_ALT_DEL
)
645 /* Nothing to do for WLX_SAS_TYPE_TIMEOUT ; the dialog will
646 * close itself thanks to the use of WlxDialogBoxParam */
647 return WLX_SAS_ACTION_NONE
;
650 pgContext
->pWlxFuncs
->WlxSwitchDesktopToWinlogon(
653 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
655 pgContext
->hDllInstance
,
656 MAKEINTRESOURCEW(IDD_LOGGEDON_DLG
),
661 if (result
< WLX_SAS_ACTION_LOGON
||
662 result
> WLX_SAS_ACTION_SWITCH_CONSOLE
)
664 result
= WLX_SAS_ACTION_NONE
;
667 if (result
== WLX_SAS_ACTION_NONE
)
669 pgContext
->pWlxFuncs
->WlxSwitchDesktopToUser(
676 static INT_PTR CALLBACK
683 PGINA_CONTEXT pgContext
;
685 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
691 /* FIXME: take care of NoDomainUI */
692 pgContext
= (PGINA_CONTEXT
)lParam
;
693 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
695 if (pgContext
->bDontDisplayLastUserName
== FALSE
)
696 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
698 if (pgContext
->bDisableCAD
== TRUE
)
699 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
701 if (pgContext
->bShutdownWithoutLogon
== FALSE
)
702 EnableWindow(GetDlgItem(hwndDlg
, IDC_SHUTDOWN
), FALSE
);
704 SetFocus(GetDlgItem(hwndDlg
, pgContext
->bDontDisplayLastUserName
? IDC_USERNAME
: IDC_PASSWORD
));
706 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
713 if (pgContext
->hBitmap
)
715 hdc
= BeginPaint(hwndDlg
, &ps
);
716 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
717 EndPaint(hwndDlg
, &ps
);
723 DeleteObject(pgContext
->hBitmap
);
728 switch (LOWORD(wParam
))
732 LPWSTR UserName
= NULL
, Password
= NULL
;
733 INT result
= WLX_SAS_ACTION_NONE
;
735 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
737 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
) &&
738 DoLoginTasks(pgContext
, UserName
, NULL
, Password
))
740 pgContext
->Password
= HeapAlloc(GetProcessHeap(),
742 (wcslen(Password
) + 1) * sizeof(WCHAR
));
743 if (pgContext
->Password
!= NULL
)
744 wcscpy(pgContext
->Password
, Password
);
746 result
= WLX_SAS_ACTION_LOGON
;
748 HeapFree(GetProcessHeap(), 0, UserName
);
749 HeapFree(GetProcessHeap(), 0, Password
);
750 EndDialog(hwndDlg
, result
);
755 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
760 EndDialog(hwndDlg
, WLX_SAS_ACTION_SHUTDOWN
);
773 IN OUT PGINA_CONTEXT pgContext
)
777 TRACE("GUILoggedOutSAS()\n");
779 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
781 pgContext
->hDllInstance
,
782 MAKEINTRESOURCEW(IDD_LOGGEDOUT_DLG
),
786 if (result
>= WLX_SAS_ACTION_LOGON
&&
787 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
789 WARN("WlxLoggedOutSAS() returns 0x%x\n", result
);
793 WARN("WlxDialogBoxParam() failed (0x%x)\n", result
);
794 return WLX_SAS_ACTION_NONE
;
799 SetLockMessage(HWND hwnd
,
801 PGINA_CONTEXT pgContext
)
807 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKMSG
, Buffer1
, 256);
809 wsprintfW(Buffer2
, L
"%s\\%s", pgContext
->Domain
, pgContext
->UserName
);
810 wsprintfW(Buffer3
, Buffer1
, Buffer2
);
812 SetDlgItemTextW(hwnd
, nDlgItem
, Buffer3
);
820 IN PGINA_CONTEXT pgContext
,
825 LPWSTR UserName
= NULL
;
826 LPWSTR Password
= NULL
;
829 if (GetTextboxText(hwndDlg
, IDC_USERNAME
, &UserName
) && *UserName
== '\0')
832 if (GetTextboxText(hwndDlg
, IDC_PASSWORD
, &Password
))
834 if (UserName
!= NULL
&& Password
!= NULL
&&
835 wcscmp(UserName
, pgContext
->UserName
) == 0 &&
836 wcscmp(Password
, pgContext
->Password
) == 0)
838 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
841 else if (wcscmp(UserName
, pgContext
->UserName
) == 0 &&
842 wcscmp(Password
, pgContext
->Password
) != 0)
845 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGPASSWORD
, Buffer2
, 256);
846 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
847 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
851 /* Wrong user name */
852 if (DoAdminUnlock(UserName
, NULL
, Password
))
854 *Action
= WLX_SAS_ACTION_UNLOCK_WKSTA
;
859 LoadStringW(pgContext
->hDllInstance
, IDS_LOCKEDWRONGUSER
, Buffer1
, 256);
860 wsprintfW(Buffer2
, Buffer1
, pgContext
->Domain
, pgContext
->UserName
);
861 LoadStringW(pgContext
->hDllInstance
, IDS_COMPUTERLOCKED
, Buffer1
, 256);
862 MessageBoxW(hwndDlg
, Buffer2
, Buffer1
, MB_OK
| MB_ICONERROR
);
867 if (UserName
!= NULL
)
868 HeapFree(GetProcessHeap(), 0, UserName
);
870 if (Password
!= NULL
)
871 HeapFree(GetProcessHeap(), 0, Password
);
886 PGINA_CONTEXT pgContext
;
887 INT result
= WLX_SAS_ACTION_NONE
;
889 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
894 pgContext
= (PGINA_CONTEXT
)lParam
;
895 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
897 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
899 SetDlgItemTextW(hwndDlg
, IDC_USERNAME
, pgContext
->UserName
);
900 SetFocus(GetDlgItem(hwndDlg
, IDC_PASSWORD
));
902 if (pgContext
->bDisableCAD
== TRUE
)
903 EnableWindow(GetDlgItem(hwndDlg
, IDCANCEL
), FALSE
);
905 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
912 if (pgContext
->hBitmap
)
914 hdc
= BeginPaint(hwndDlg
, &ps
);
915 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
916 EndPaint(hwndDlg
, &ps
);
921 DeleteObject(pgContext
->hBitmap
);
925 switch (LOWORD(wParam
))
928 if (DoUnlock(hwndDlg
, pgContext
, &result
))
929 EndDialog(hwndDlg
, result
);
933 EndDialog(hwndDlg
, WLX_SAS_ACTION_NONE
);
945 IN OUT PGINA_CONTEXT pgContext
)
949 TRACE("GUILockedSAS()\n");
951 result
= pgContext
->pWlxFuncs
->WlxDialogBoxParam(
953 pgContext
->hDllInstance
,
954 MAKEINTRESOURCEW(IDD_UNLOCK_DLG
),
958 if (result
>= WLX_SAS_ACTION_LOGON
&&
959 result
<= WLX_SAS_ACTION_SWITCH_CONSOLE
)
961 WARN("GUILockedSAS() returns 0x%x\n", result
);
965 WARN("GUILockedSAS() failed (0x%x)\n", result
);
966 return WLX_SAS_ACTION_NONE
;
970 static INT_PTR CALLBACK
977 PGINA_CONTEXT pgContext
;
979 pgContext
= (PGINA_CONTEXT
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
985 pgContext
= (PGINA_CONTEXT
)lParam
;
986 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)pgContext
);
988 pgContext
->hBitmap
= LoadImage(hDllInstance
, MAKEINTRESOURCE(IDI_ROSLOGO
), IMAGE_BITMAP
, 0, 0, LR_DEFAULTCOLOR
);
989 SetLockMessage(hwndDlg
, IDC_LOCKMSG
, pgContext
);
996 if (pgContext
->hBitmap
)
998 hdc
= BeginPaint(hwndDlg
, &ps
);
999 DrawStateW(hdc
, NULL
, NULL
, (LPARAM
)pgContext
->hBitmap
, (WPARAM
)0, 0, 0, 0, 0, DST_BITMAP
);
1000 EndPaint(hwndDlg
, &ps
);
1006 DeleteObject(pgContext
->hBitmap
);
1016 GUIDisplayLockedNotice(
1017 IN OUT PGINA_CONTEXT pgContext
)
1019 TRACE("GUIdisplayLockedNotice()\n");
1021 pgContext
->pWlxFuncs
->WlxDialogBoxParam(
1023 pgContext
->hDllInstance
,
1024 MAKEINTRESOURCEW(IDD_LOCKED_DLG
),
1030 GINA_UI GinaGraphicalUI
= {
1032 GUIDisplayStatusMessage
,
1033 GUIRemoveStatusMessage
,
1034 GUIDisplaySASNotice
,
1038 GUIDisplayLockedNotice
,