Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygengui.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS msgina.dll 00003 * FILE: dll/win32/msgina/gui.c 00004 * PURPOSE: ReactOS Logon GINA DLL 00005 * PROGRAMMER: Hervé Poussineau (hpoussin@reactos.org) 00006 */ 00007 00008 #include "msgina.h" 00009 00010 WINE_DEFAULT_DEBUG_CHANNEL(msgina); 00011 00012 typedef struct _DISPLAYSTATUSMSG 00013 { 00014 PGINA_CONTEXT Context; 00015 HDESK hDesktop; 00016 DWORD dwOptions; 00017 PWSTR pTitle; 00018 PWSTR pMessage; 00019 HANDLE StartupEvent; 00020 } DISPLAYSTATUSMSG, *PDISPLAYSTATUSMSG; 00021 00022 static BOOL 00023 GUIInitialize( 00024 IN OUT PGINA_CONTEXT pgContext) 00025 { 00026 TRACE("GUIInitialize(%p)\n", pgContext); 00027 return TRUE; 00028 } 00029 00030 static INT_PTR CALLBACK 00031 StatusMessageWindowProc( 00032 IN HWND hwndDlg, 00033 IN UINT uMsg, 00034 IN WPARAM wParam, 00035 IN LPARAM lParam) 00036 { 00037 UNREFERENCED_PARAMETER(wParam); 00038 00039 switch (uMsg) 00040 { 00041 case WM_INITDIALOG: 00042 { 00043 PDISPLAYSTATUSMSG msg = (PDISPLAYSTATUSMSG)lParam; 00044 if (!msg) 00045 return FALSE; 00046 00047 msg->Context->hStatusWindow = hwndDlg; 00048 00049 if (msg->pTitle) 00050 SetWindowTextW(hwndDlg, msg->pTitle); 00051 SetDlgItemTextW(hwndDlg, IDC_STATUSLABEL, msg->pMessage); 00052 SetEvent(msg->StartupEvent); 00053 return TRUE; 00054 } 00055 } 00056 return FALSE; 00057 } 00058 00059 static DWORD WINAPI 00060 StartupWindowThread(LPVOID lpParam) 00061 { 00062 HDESK OldDesk; 00063 PDISPLAYSTATUSMSG msg = (PDISPLAYSTATUSMSG)lpParam; 00064 00065 OldDesk = GetThreadDesktop(GetCurrentThreadId()); 00066 00067 if(!SetThreadDesktop(msg->hDesktop)) 00068 { 00069 HeapFree(GetProcessHeap(), 0, lpParam); 00070 return FALSE; 00071 } 00072 DialogBoxParam( 00073 hDllInstance, 00074 MAKEINTRESOURCE(IDD_STATUSWINDOW_DLG), 00075 GetDesktopWindow(), 00076 StatusMessageWindowProc, 00077 (LPARAM)lpParam); 00078 SetThreadDesktop(OldDesk); 00079 00080 HeapFree(GetProcessHeap(), 0, lpParam); 00081 return TRUE; 00082 } 00083 00084 static BOOL 00085 GUIDisplayStatusMessage( 00086 IN PGINA_CONTEXT pgContext, 00087 IN HDESK hDesktop, 00088 IN DWORD dwOptions, 00089 IN PWSTR pTitle, 00090 IN PWSTR pMessage) 00091 { 00092 PDISPLAYSTATUSMSG msg; 00093 HANDLE Thread; 00094 DWORD ThreadId; 00095 00096 TRACE("GUIDisplayStatusMessage(%ws)\n", pMessage); 00097 00098 if (!pgContext->hStatusWindow) 00099 { 00100 msg = (PDISPLAYSTATUSMSG)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DISPLAYSTATUSMSG)); 00101 if(!msg) 00102 return FALSE; 00103 00104 msg->Context = pgContext; 00105 msg->dwOptions = dwOptions; 00106 msg->pTitle = pTitle; 00107 msg->pMessage = pMessage; 00108 msg->hDesktop = hDesktop; 00109 00110 msg->StartupEvent = CreateEventW( 00111 NULL, 00112 TRUE, 00113 FALSE, 00114 NULL); 00115 00116 if (!msg->StartupEvent) 00117 return FALSE; 00118 00119 Thread = CreateThread( 00120 NULL, 00121 0, 00122 StartupWindowThread, 00123 (PVOID)msg, 00124 0, 00125 &ThreadId); 00126 if (Thread) 00127 { 00128 CloseHandle(Thread); 00129 WaitForSingleObject(msg->StartupEvent, INFINITE); 00130 CloseHandle(msg->StartupEvent); 00131 return TRUE; 00132 } 00133 00134 return FALSE; 00135 } 00136 00137 if (pTitle) 00138 SetWindowTextW(pgContext->hStatusWindow, pTitle); 00139 00140 SetDlgItemTextW(pgContext->hStatusWindow, IDC_STATUSLABEL, pMessage); 00141 00142 return TRUE; 00143 } 00144 00145 static BOOL 00146 GUIRemoveStatusMessage( 00147 IN PGINA_CONTEXT pgContext) 00148 { 00149 if (pgContext->hStatusWindow) 00150 { 00151 EndDialog(pgContext->hStatusWindow, 0); 00152 pgContext->hStatusWindow = NULL; 00153 } 00154 00155 return TRUE; 00156 } 00157 00158 static INT_PTR CALLBACK 00159 EmptyWindowProc( 00160 IN HWND hwndDlg, 00161 IN UINT uMsg, 00162 IN WPARAM wParam, 00163 IN LPARAM lParam) 00164 { 00165 UNREFERENCED_PARAMETER(hwndDlg); 00166 UNREFERENCED_PARAMETER(uMsg); 00167 UNREFERENCED_PARAMETER(wParam); 00168 UNREFERENCED_PARAMETER(lParam); 00169 00170 return FALSE; 00171 } 00172 00173 static VOID 00174 GUIDisplaySASNotice( 00175 IN OUT PGINA_CONTEXT pgContext) 00176 { 00177 INT result; 00178 00179 TRACE("GUIDisplaySASNotice()\n"); 00180 00181 /* Display the notice window */ 00182 result = DialogBoxParam( 00183 pgContext->hDllInstance, 00184 MAKEINTRESOURCE(IDD_NOTICE_DLG), 00185 GetDesktopWindow(), 00186 EmptyWindowProc, 00187 (LPARAM)NULL); 00188 if (result == -1) 00189 { 00190 /* Failed to display the window. Do as if the user 00191 * already has pressed CTRL+ALT+DELETE */ 00192 pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx, WLX_SAS_TYPE_CTRL_ALT_DEL); 00193 } 00194 } 00195 00196 /* Get the text contained in a textbox. Allocates memory in pText 00197 * to contain the text. Returns TRUE in case of success */ 00198 static BOOL 00199 GetTextboxText( 00200 IN HWND hwndDlg, 00201 IN INT TextboxId, 00202 OUT LPWSTR *pText) 00203 { 00204 LPWSTR Text; 00205 int Count; 00206 00207 Count = GetWindowTextLength(GetDlgItem(hwndDlg, TextboxId)); 00208 Text = HeapAlloc(GetProcessHeap(), 0, (Count + 1) * sizeof(WCHAR)); 00209 if (!Text) 00210 return FALSE; 00211 if (Count != GetWindowTextW(GetDlgItem(hwndDlg, TextboxId), Text, Count + 1)) 00212 { 00213 HeapFree(GetProcessHeap(), 0, Text); 00214 return FALSE; 00215 } 00216 *pText = Text; 00217 return TRUE; 00218 } 00219 00220 static INT_PTR CALLBACK 00221 LoggedOnWindowProc( 00222 IN HWND hwndDlg, 00223 IN UINT uMsg, 00224 IN WPARAM wParam, 00225 IN LPARAM lParam) 00226 { 00227 UNREFERENCED_PARAMETER(lParam); 00228 00229 switch (uMsg) 00230 { 00231 case WM_COMMAND: 00232 { 00233 switch (LOWORD(wParam)) 00234 { 00235 case IDC_LOCK: 00236 EndDialog(hwndDlg, WLX_SAS_ACTION_LOCK_WKSTA); 00237 return TRUE; 00238 case IDC_LOGOFF: 00239 EndDialog(hwndDlg, WLX_SAS_ACTION_LOGOFF); 00240 return TRUE; 00241 case IDC_SHUTDOWN: 00242 EndDialog(hwndDlg, WLX_SAS_ACTION_SHUTDOWN_POWER_OFF); 00243 return TRUE; 00244 case IDC_TASKMGR: 00245 EndDialog(hwndDlg, WLX_SAS_ACTION_TASKLIST); 00246 return TRUE; 00247 case IDCANCEL: 00248 EndDialog(hwndDlg, WLX_SAS_ACTION_NONE); 00249 return TRUE; 00250 } 00251 break; 00252 } 00253 case WM_INITDIALOG: 00254 { 00255 SetFocus(GetDlgItem(hwndDlg, IDNO)); 00256 return TRUE; 00257 } 00258 case WM_CLOSE: 00259 { 00260 EndDialog(hwndDlg, WLX_SAS_ACTION_NONE); 00261 return TRUE; 00262 } 00263 } 00264 00265 return FALSE; 00266 } 00267 00268 static INT 00269 GUILoggedOnSAS( 00270 IN OUT PGINA_CONTEXT pgContext, 00271 IN DWORD dwSasType) 00272 { 00273 INT result; 00274 00275 TRACE("GUILoggedOnSAS()\n"); 00276 00277 if (dwSasType != WLX_SAS_TYPE_CTRL_ALT_DEL) 00278 { 00279 /* Nothing to do for WLX_SAS_TYPE_TIMEOUT ; the dialog will 00280 * close itself thanks to the use of WlxDialogBoxParam */ 00281 return WLX_SAS_ACTION_NONE; 00282 } 00283 00284 result = pgContext->pWlxFuncs->WlxDialogBoxParam( 00285 pgContext->hWlx, 00286 pgContext->hDllInstance, 00287 MAKEINTRESOURCEW(IDD_LOGGEDON_DLG), 00288 GetDesktopWindow(), 00289 LoggedOnWindowProc, 00290 (LPARAM)pgContext); 00291 if (result >= WLX_SAS_ACTION_LOGON && 00292 result <= WLX_SAS_ACTION_SWITCH_CONSOLE) 00293 { 00294 return result; 00295 } 00296 return WLX_SAS_ACTION_NONE; 00297 } 00298 00299 static INT_PTR CALLBACK 00300 LoggedOutWindowProc( 00301 IN HWND hwndDlg, 00302 IN UINT uMsg, 00303 IN WPARAM wParam, 00304 IN LPARAM lParam) 00305 { 00306 PGINA_CONTEXT pgContext; 00307 00308 pgContext = (PGINA_CONTEXT)GetWindowLongPtr(hwndDlg, GWL_USERDATA); 00309 00310 switch (uMsg) 00311 { 00312 case WM_INITDIALOG: 00313 { 00314 /* FIXME: take care of DontDisplayLastUserName, NoDomainUI, ShutdownWithoutLogon */ 00315 pgContext = (PGINA_CONTEXT)lParam; 00316 SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)pgContext); 00317 SetFocus(GetDlgItem(hwndDlg, IDC_USERNAME)); 00318 00319 pgContext->hBitmap = LoadImage(hDllInstance, MAKEINTRESOURCE(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); 00320 return TRUE; 00321 } 00322 case WM_PAINT: 00323 { 00324 PAINTSTRUCT ps; 00325 HDC hdc; 00326 if (pgContext->hBitmap) 00327 { 00328 hdc = BeginPaint(hwndDlg, &ps); 00329 DrawStateW(hdc, NULL, NULL, (LPARAM)pgContext->hBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP); 00330 EndPaint(hwndDlg, &ps); 00331 } 00332 return TRUE; 00333 } 00334 case WM_DESTROY: 00335 { 00336 DeleteObject(pgContext->hBitmap); 00337 return TRUE; 00338 } 00339 case WM_COMMAND: 00340 { 00341 switch (LOWORD(wParam)) 00342 { 00343 case IDOK: 00344 { 00345 LPWSTR UserName = NULL, Password = NULL; 00346 INT result = WLX_SAS_ACTION_NONE; 00347 00348 if (GetTextboxText(hwndDlg, IDC_USERNAME, &UserName) && *UserName == '\0') 00349 break; 00350 if (GetTextboxText(hwndDlg, IDC_PASSWORD, &Password) && 00351 DoLoginTasks(pgContext, UserName, NULL, Password)) 00352 { 00353 result = WLX_SAS_ACTION_LOGON; 00354 } 00355 HeapFree(GetProcessHeap(), 0, UserName); 00356 HeapFree(GetProcessHeap(), 0, Password); 00357 EndDialog(hwndDlg, result); 00358 return TRUE; 00359 } 00360 case IDCANCEL: 00361 { 00362 EndDialog(hwndDlg, WLX_SAS_ACTION_NONE); 00363 return TRUE; 00364 } 00365 case IDC_SHUTDOWN: 00366 { 00367 EndDialog(hwndDlg, WLX_SAS_ACTION_SHUTDOWN); 00368 return TRUE; 00369 } 00370 } 00371 break; 00372 } 00373 } 00374 00375 return FALSE; 00376 } 00377 00378 static INT 00379 GUILoggedOutSAS( 00380 IN OUT PGINA_CONTEXT pgContext) 00381 { 00382 int result; 00383 00384 TRACE("GUILoggedOutSAS()\n"); 00385 00386 result = pgContext->pWlxFuncs->WlxDialogBoxParam( 00387 pgContext->hWlx, 00388 pgContext->hDllInstance, 00389 MAKEINTRESOURCEW(IDD_LOGGEDOUT_DLG), 00390 GetDesktopWindow(), 00391 LoggedOutWindowProc, 00392 (LPARAM)pgContext); 00393 if (result >= WLX_SAS_ACTION_LOGON && 00394 result <= WLX_SAS_ACTION_SWITCH_CONSOLE) 00395 { 00396 WARN("WlxLoggedOutSAS() returns 0x%x\n", result); 00397 return result; 00398 } 00399 00400 WARN("WlxDialogBoxParam() failed (0x%x)\n", result); 00401 return WLX_SAS_ACTION_NONE; 00402 } 00403 00404 static INT 00405 GUILockedSAS( 00406 IN OUT PGINA_CONTEXT pgContext) 00407 { 00408 TRACE("GUILockedSAS()\n"); 00409 00410 UNREFERENCED_PARAMETER(pgContext); 00411 00412 UNIMPLEMENTED; 00413 return WLX_SAS_ACTION_UNLOCK_WKSTA; 00414 } 00415 00416 GINA_UI GinaGraphicalUI = { 00417 GUIInitialize, 00418 GUIDisplayStatusMessage, 00419 GUIRemoveStatusMessage, 00420 GUIDisplaySASNotice, 00421 GUILoggedOnSAS, 00422 GUILoggedOutSAS, 00423 GUILockedSAS, 00424 }; Generated on Sat May 26 2012 04:18:04 for ReactOS by
1.7.6.1
|