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

tui.c
Go to the documentation of this file.
00001 /*
00002  * PROJECT:         ReactOS msgina.dll
00003  * FILE:            dll/win32/msgina/tui.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 static BOOL
00013 TUIInitialize(
00014     IN OUT PGINA_CONTEXT pgContext)
00015 {
00016     TRACE("TUIInitialize(%p)\n", pgContext);
00017 
00018     return AllocConsole();
00019 }
00020 
00021 static BOOL
00022 TUIDisplayStatusMessage(
00023     IN PGINA_CONTEXT pgContext,
00024     IN HDESK hDesktop,
00025     IN DWORD dwOptions,
00026     IN PWSTR pTitle,
00027     IN PWSTR pMessage)
00028 {
00029     static LPCWSTR newLine = L"\n";
00030     DWORD result;
00031 
00032     TRACE("TUIDisplayStatusMessage(%ws)\n", pMessage);
00033 
00034     UNREFERENCED_PARAMETER(pgContext);
00035     UNREFERENCED_PARAMETER(hDesktop);
00036     UNREFERENCED_PARAMETER(dwOptions);
00037     UNREFERENCED_PARAMETER(pTitle);
00038 
00039     return
00040         WriteConsoleW(
00041             GetStdHandle(STD_OUTPUT_HANDLE),
00042             pMessage,
00043             wcslen(pMessage),
00044             &result,
00045             NULL) &&
00046         WriteConsoleW(
00047             GetStdHandle(STD_OUTPUT_HANDLE),
00048             newLine,
00049             wcslen(newLine),
00050             &result,
00051             NULL);
00052 }
00053 
00054 static BOOL
00055 TUIRemoveStatusMessage(
00056     IN PGINA_CONTEXT pgContext)
00057 {
00058     UNREFERENCED_PARAMETER(pgContext);
00059 
00060     /* Nothing to do */
00061     return TRUE;
00062 }
00063 
00064 static BOOL
00065 DisplayResourceText(
00066     IN UINT uIdResourceText,
00067     IN BOOL AddNewLine)
00068 {
00069     WCHAR Prompt[256];
00070     static LPCWSTR newLine = L"\n";
00071     DWORD count;
00072 
00073     if (0 == LoadStringW(hDllInstance, uIdResourceText, Prompt, 256))
00074         return FALSE;
00075     if (!WriteConsoleW(
00076         GetStdHandle(STD_OUTPUT_HANDLE),
00077         Prompt, wcslen(Prompt),
00078         &count, NULL))
00079     {
00080         return FALSE;
00081     }
00082     if (AddNewLine)
00083     {
00084         if (!WriteConsoleW(
00085             GetStdHandle(STD_OUTPUT_HANDLE),
00086             newLine, wcslen(newLine),
00087             &count, NULL))
00088         {
00089             return FALSE;
00090         }
00091     }
00092     return TRUE;
00093 }
00094 
00095 static VOID
00096 TUIDisplaySASNotice(
00097     IN OUT PGINA_CONTEXT pgContext)
00098 {
00099     TRACE("TUIDisplaySASNotice()\n");
00100 
00101     UNREFERENCED_PARAMETER(pgContext);
00102 
00103     DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE);
00104     DisplayResourceText(IDS_PRESSCTRLALTDELETE, TRUE);
00105 }
00106 
00107 static INT
00108 TUILoggedOnSAS(
00109     IN OUT PGINA_CONTEXT pgContext,
00110     IN DWORD dwSasType)
00111 {
00112     TRACE("TUILoggedOnSAS()\n");
00113 
00114     UNREFERENCED_PARAMETER(pgContext);
00115 
00116     if (dwSasType != WLX_SAS_TYPE_CTRL_ALT_DEL)
00117     {
00118         /* Nothing to do for WLX_SAS_TYPE_TIMEOUT */
00119         return WLX_SAS_ACTION_NONE;
00120     }
00121 
00122     FIXME("FIXME: TUILoggedOnSAS(): Let's suppose the user wants to log off...\n");
00123     return WLX_SAS_ACTION_LOGOFF;
00124 }
00125 
00126 static BOOL
00127 ReadString(
00128     IN UINT uIdResourcePrompt,
00129     IN OUT PWSTR Buffer,
00130     IN DWORD BufferLength,
00131     IN BOOL ShowString)
00132 {
00133     DWORD count, i;
00134     WCHAR charToDisplay[] = { 0, UNICODE_NULL };
00135 
00136     if (!SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0))
00137         return FALSE;
00138 
00139     if (!FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)))
00140         return FALSE;
00141 
00142     if (!DisplayResourceText(uIdResourcePrompt, FALSE))
00143         return FALSE;
00144 
00145     i = 0;
00146     for (;;)
00147     {
00148         WCHAR readChar;
00149         if (!ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &readChar, 1, &count, NULL))
00150             return FALSE;
00151         if (readChar == '\r' || readChar == '\n')
00152         {
00153             /* End of string */
00154             charToDisplay[0] = L'\n';
00155             WriteConsoleW(
00156                 GetStdHandle(STD_OUTPUT_HANDLE),
00157                 charToDisplay,
00158                 wcslen(charToDisplay),
00159                 &count,
00160                 NULL);
00161             break;
00162         }
00163         if (ShowString)
00164         {
00165             /* Display the char */
00166             charToDisplay[0] = readChar;
00167             WriteConsoleW(
00168                 GetStdHandle(STD_OUTPUT_HANDLE),
00169                 charToDisplay,
00170                 wcslen(charToDisplay),
00171                 &count,
00172                 NULL);
00173         }
00174         Buffer[i++] = readChar;
00175         /* FIXME: buffer overflow if the user writes too many chars! */
00176         UNREFERENCED_PARAMETER(BufferLength);
00177         /* FIXME: handle backspace */
00178     }
00179     Buffer[i] = UNICODE_NULL;
00180 
00181     if (!ShowString)
00182     {
00183         /* Still display the \n */
00184         static LPCWSTR newLine = L"\n";
00185         DWORD result;
00186         WriteConsoleW(
00187             GetStdHandle(STD_OUTPUT_HANDLE),
00188             newLine,
00189             wcslen(newLine),
00190             &result,
00191             NULL);
00192     }
00193     return TRUE;
00194 }
00195 
00196 static INT
00197 TUILoggedOutSAS(
00198     IN OUT PGINA_CONTEXT pgContext)
00199 {
00200     WCHAR UserName[256];
00201     WCHAR Password[256];
00202 
00203     TRACE("TUILoggedOutSAS()\n");
00204 
00205     /* Ask the user for credentials */
00206     if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE))
00207         return WLX_SAS_ACTION_NONE;
00208     if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
00209         return WLX_SAS_ACTION_NONE;
00210 
00211     if (DoLoginTasks(pgContext, UserName, NULL, Password))
00212         return WLX_SAS_ACTION_LOGON;
00213     else
00214         return WLX_SAS_ACTION_NONE;
00215 }
00216 
00217 static INT
00218 TUILockedSAS(
00219     IN OUT PGINA_CONTEXT pgContext)
00220 {
00221     HANDLE hToken;
00222     WCHAR UserName[256];
00223     WCHAR Password[256];
00224 
00225     TRACE("TUILockedSAS()\n");
00226 
00227     UNREFERENCED_PARAMETER(pgContext);
00228 
00229     if (!DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE))
00230         return WLX_SAS_ACTION_UNLOCK_WKSTA;
00231 
00232     /* Ask the user for credentials */
00233     if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE))
00234         return WLX_SAS_ACTION_NONE;
00235     if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
00236         return WLX_SAS_ACTION_NONE;
00237 
00238     if (!LogonUserW(UserName, NULL, Password,
00239         LOGON32_LOGON_UNLOCK,
00240         LOGON32_PROVIDER_DEFAULT,
00241         &hToken))
00242     {
00243         TRACE("LogonUserW() failed\n");
00244         return WLX_SAS_ACTION_NONE;
00245     }
00246     CloseHandle(hToken);
00247     return WLX_SAS_ACTION_UNLOCK_WKSTA;
00248 }
00249 
00250 GINA_UI GinaTextUI = {
00251     TUIInitialize,
00252     TUIDisplayStatusMessage,
00253     TUIRemoveStatusMessage,
00254     TUIDisplaySASNotice,
00255     TUILoggedOnSAS,
00256     TUILoggedOutSAS,
00257     TUILockedSAS,
00258 };

Generated on Sat May 26 2012 04:18:05 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.