ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

gui.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.