[MSGINA]
[reactos.git] / reactos / dll / win32 / msgina / tui.c
index a94393a..aa26223 100644 (file)
 
 #include "msgina.h"
 
-WINE_DEFAULT_DEBUG_CHANNEL(msgina);
+#include <wincon.h>
 
 static BOOL
 TUIInitialize(
-       IN OUT PGINA_CONTEXT pgContext)
+    IN OUT PGINA_CONTEXT pgContext)
 {
-       TRACE("TUIInitialize(%p)\n", pgContext);
+    TRACE("TUIInitialize(%p)\n", pgContext);
 
-       return AllocConsole();
+    return AllocConsole();
 }
 
 static BOOL
 TUIDisplayStatusMessage(
-       IN PGINA_CONTEXT pgContext,
-       IN HDESK hDesktop,
-       IN DWORD dwOptions,
-       IN PWSTR pTitle,
-       IN PWSTR pMessage)
+    IN PGINA_CONTEXT pgContext,
+    IN HDESK hDesktop,
+    IN DWORD dwOptions,
+    IN PWSTR pTitle,
+    IN PWSTR pMessage)
 {
-       static LPCWSTR newLine = L"\n";
-       DWORD result;
-
-       TRACE("TUIDisplayStatusMessage(%ws)\n", pMessage);
-
-       UNREFERENCED_PARAMETER(pgContext);
-       UNREFERENCED_PARAMETER(hDesktop);
-       UNREFERENCED_PARAMETER(dwOptions);
-       UNREFERENCED_PARAMETER(pTitle);
-
-       return
-               WriteConsoleW(
-                       GetStdHandle(STD_OUTPUT_HANDLE),
-                       pMessage,
-                       wcslen(pMessage),
-                       &result,
-                       NULL) &&
-               WriteConsoleW(
-                       GetStdHandle(STD_OUTPUT_HANDLE),
-                       newLine,
-                       wcslen(newLine),
-                       &result,
-                       NULL);
+    static LPCWSTR newLine = L"\n";
+    DWORD result;
+
+    TRACE("TUIDisplayStatusMessage(%ws)\n", pMessage);
+
+    UNREFERENCED_PARAMETER(pgContext);
+    UNREFERENCED_PARAMETER(hDesktop);
+    UNREFERENCED_PARAMETER(dwOptions);
+    UNREFERENCED_PARAMETER(pTitle);
+
+    return
+        WriteConsoleW(
+            GetStdHandle(STD_OUTPUT_HANDLE),
+            pMessage,
+            wcslen(pMessage),
+            &result,
+            NULL) &&
+        WriteConsoleW(
+            GetStdHandle(STD_OUTPUT_HANDLE),
+            newLine,
+            wcslen(newLine),
+            &result,
+            NULL);
 }
 
 static BOOL
 TUIRemoveStatusMessage(
-       IN PGINA_CONTEXT pgContext)
+    IN PGINA_CONTEXT pgContext)
 {
-       UNREFERENCED_PARAMETER(pgContext);
+    UNREFERENCED_PARAMETER(pgContext);
 
-       /* Nothing to do */
-       return TRUE;
+    /* Nothing to do */
+    return TRUE;
 }
 
 static BOOL
 DisplayResourceText(
-       IN UINT uIdResourceText,
-       IN BOOL AddNewLine)
+    IN UINT uIdResourceText,
+    IN BOOL AddNewLine)
 {
-       WCHAR Prompt[256];
-       static LPCWSTR newLine = L"\n";
-       DWORD count;
-
-       if (0 == LoadStringW(hDllInstance, uIdResourceText, Prompt, 256))
-               return FALSE;
-       if (!WriteConsoleW(
-               GetStdHandle(STD_OUTPUT_HANDLE),
-               Prompt, wcslen(Prompt),
-               &count, NULL))
-       {
-               return FALSE;
-       }
-       if (AddNewLine)
-       {
-               if (!WriteConsoleW(
-                       GetStdHandle(STD_OUTPUT_HANDLE),
-                       newLine, wcslen(newLine),
-                       &count, NULL))
-               {
-                       return FALSE;
-               }
-       }
-       return TRUE;
+    WCHAR Prompt[256];
+    static LPCWSTR newLine = L"\n";
+    DWORD count;
+
+    if (0 == LoadStringW(hDllInstance, uIdResourceText, Prompt, 256))
+        return FALSE;
+    if (!WriteConsoleW(
+        GetStdHandle(STD_OUTPUT_HANDLE),
+        Prompt, wcslen(Prompt),
+        &count, NULL))
+    {
+        return FALSE;
+    }
+    if (AddNewLine)
+    {
+        if (!WriteConsoleW(
+            GetStdHandle(STD_OUTPUT_HANDLE),
+            newLine, wcslen(newLine),
+            &count, NULL))
+        {
+            return FALSE;
+        }
+    }
+    return TRUE;
 }
 
 static VOID
 TUIDisplaySASNotice(
-       IN OUT PGINA_CONTEXT pgContext)
+    IN OUT PGINA_CONTEXT pgContext)
 {
-       TRACE("TUIDisplaySASNotice()\n");
+    TRACE("TUIDisplaySASNotice()\n");
 
-       UNREFERENCED_PARAMETER(pgContext);
+    UNREFERENCED_PARAMETER(pgContext);
 
-       DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE);
-       DisplayResourceText(IDS_PRESSCTRLALTDELETE, TRUE);
+    DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE);
+    DisplayResourceText(IDS_PRESSCTRLALTDELETE, TRUE);
 }
 
 static INT
 TUILoggedOnSAS(
-       IN OUT PGINA_CONTEXT pgContext,
-       IN DWORD dwSasType)
+    IN OUT PGINA_CONTEXT pgContext,
+    IN DWORD dwSasType)
 {
-       TRACE("TUILoggedOnSAS()\n");
+    TRACE("TUILoggedOnSAS()\n");
 
-       UNREFERENCED_PARAMETER(pgContext);
+    UNREFERENCED_PARAMETER(pgContext);
 
-       if (dwSasType != WLX_SAS_TYPE_CTRL_ALT_DEL)
-       {
-               /* Nothing to do for WLX_SAS_TYPE_TIMEOUT */
-               return WLX_SAS_ACTION_NONE;
-       }
+    if (dwSasType != WLX_SAS_TYPE_CTRL_ALT_DEL)
+    {
+        /* Nothing to do for WLX_SAS_TYPE_TIMEOUT */
+        return WLX_SAS_ACTION_NONE;
+    }
 
-       FIXME("FIXME: TUILoggedOnSAS(): Let's suppose the user wants to log off...\n");
-       return WLX_SAS_ACTION_LOGOFF;
+    FIXME("FIXME: TUILoggedOnSAS(): Let's suppose the user wants to log off...\n");
+    return WLX_SAS_ACTION_LOGOFF;
 }
 
 static BOOL
 ReadString(
-       IN UINT uIdResourcePrompt,
-       IN OUT PWSTR Buffer,
-       IN DWORD BufferLength,
-       IN BOOL ShowString)
+    IN UINT uIdResourcePrompt,
+    IN OUT PWSTR Buffer,
+    IN DWORD BufferLength,
+    IN BOOL ShowString)
 {
-       DWORD count, i;
-       WCHAR charToDisplay[] = { 0, UNICODE_NULL };
-
-       if (!SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0))
-               return FALSE;
-
-       if (!FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)))
-               return FALSE;
-
-       if (!DisplayResourceText(uIdResourcePrompt, FALSE))
-               return FALSE;
-
-       i = 0;
-       for (;;)
-       {
-               WCHAR readChar;
-               if (!ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &readChar, 1, &count, NULL))
-                       return FALSE;
-               if (readChar == '\r' || readChar == '\n')
-               {
-                       /* End of string */
-                       charToDisplay[0] = L'\n';
-                       WriteConsoleW(
-                               GetStdHandle(STD_OUTPUT_HANDLE),
-                               charToDisplay,
-                               wcslen(charToDisplay),
-                               &count,
-                               NULL);
-                       break;
-               }
-               if (ShowString)
-               {
-                       /* Display the char */
-                       charToDisplay[0] = readChar;
-                       WriteConsoleW(
-                               GetStdHandle(STD_OUTPUT_HANDLE),
-                               charToDisplay,
-                               wcslen(charToDisplay),
-                               &count,
-                               NULL);
-               }
-               Buffer[i++] = readChar;
-               /* FIXME: buffer overflow if the user writes too many chars! */
-               UNREFERENCED_PARAMETER(BufferLength);
-               /* FIXME: handle backspace */
-       }
-       Buffer[i] = UNICODE_NULL;
-
-       if (!ShowString)
-       {
-               /* Still display the \n */
-               static LPCWSTR newLine = L"\n";
-               DWORD result;
-               WriteConsoleW(
-                       GetStdHandle(STD_OUTPUT_HANDLE),
-                       newLine,
-                       wcslen(newLine),
-                       &result,
-                       NULL);
-       }
-       return TRUE;
+    DWORD count, i;
+    WCHAR charToDisplay[] = { 0, UNICODE_NULL };
+
+    if (!SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0))
+        return FALSE;
+
+    if (!FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)))
+        return FALSE;
+
+    if (!DisplayResourceText(uIdResourcePrompt, FALSE))
+        return FALSE;
+
+    i = 0;
+    for (;;)
+    {
+        WCHAR readChar;
+        if (!ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &readChar, 1, &count, NULL))
+            return FALSE;
+        if (readChar == '\r' || readChar == '\n')
+        {
+            /* End of string */
+            charToDisplay[0] = L'\n';
+            WriteConsoleW(
+                GetStdHandle(STD_OUTPUT_HANDLE),
+                charToDisplay,
+                wcslen(charToDisplay),
+                &count,
+                NULL);
+            break;
+        }
+        if (ShowString)
+        {
+            /* Display the char */
+            charToDisplay[0] = readChar;
+            WriteConsoleW(
+                GetStdHandle(STD_OUTPUT_HANDLE),
+                charToDisplay,
+                wcslen(charToDisplay),
+                &count,
+                NULL);
+        }
+        Buffer[i++] = readChar;
+        /* FIXME: buffer overflow if the user writes too many chars! */
+        UNREFERENCED_PARAMETER(BufferLength);
+        /* FIXME: handle backspace */
+    }
+    Buffer[i] = UNICODE_NULL;
+
+    if (!ShowString)
+    {
+        /* Still display the \n */
+        static LPCWSTR newLine = L"\n";
+        DWORD result;
+        WriteConsoleW(
+            GetStdHandle(STD_OUTPUT_HANDLE),
+            newLine,
+            wcslen(newLine),
+            &result,
+            NULL);
+    }
+    return TRUE;
 }
 
 static INT
 TUILoggedOutSAS(
-       IN OUT PGINA_CONTEXT pgContext)
+    IN OUT PGINA_CONTEXT pgContext)
 {
-       WCHAR UserName[256];
-       WCHAR Password[256];
+    WCHAR UserName[256];
+    WCHAR Password[256];
 
-       TRACE("TUILoggedOutSAS()\n");
+    TRACE("TUILoggedOutSAS()\n");
 
-       /* Ask the user for credentials */
-       if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE))
-               return WLX_SAS_ACTION_NONE;
-       if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
-               return WLX_SAS_ACTION_NONE;
+    /* Ask the user for credentials */
+    if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE))
+        return WLX_SAS_ACTION_NONE;
+    if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
+        return WLX_SAS_ACTION_NONE;
 
-       if (DoLoginTasks(pgContext, UserName, NULL, Password))
-               return WLX_SAS_ACTION_LOGON;
-       else
-               return WLX_SAS_ACTION_NONE;
+    if (DoLoginTasks(pgContext, UserName, NULL, Password))
+        return WLX_SAS_ACTION_LOGON;
+    else
+        return WLX_SAS_ACTION_NONE;
 }
 
 static INT
 TUILockedSAS(
-       IN OUT PGINA_CONTEXT pgContext)
+    IN OUT PGINA_CONTEXT pgContext)
+{
+    HANDLE hToken;
+    WCHAR UserName[256];
+    WCHAR Password[256];
+    NTSTATUS SubStatus;
+    NTSTATUS Status;
+
+    TRACE("TUILockedSAS()\n");
+
+    UNREFERENCED_PARAMETER(pgContext);
+
+    if (!DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE))
+        return WLX_SAS_ACTION_UNLOCK_WKSTA;
+
+    /* Ask the user for credentials */
+    if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE))
+        return WLX_SAS_ACTION_NONE;
+    if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
+        return WLX_SAS_ACTION_NONE;
+
+    Status = ConnectToLsa(pgContext);
+    if (!NT_SUCCESS(Status))
+    {
+        WARN("ConnectToLsa() failed\n");
+        return WLX_SAS_ACTION_NONE;
+    }
+
+    Status = MyLogonUser(pgContext->LsaHandle,
+                         pgContext->AuthenticationPackage,
+                         UserName,
+                         NULL,
+                         Password,
+                         &hToken,
+                         &SubStatus);
+    if (!NT_SUCCESS(Status))
+    {
+        WARN("MyLogonUser() failed\n");
+        return WLX_SAS_ACTION_NONE;
+    }
+
+    CloseHandle(hToken);
+    return WLX_SAS_ACTION_UNLOCK_WKSTA;
+}
+
+static VOID
+TUIDisplayLockedNotice(
+    IN OUT PGINA_CONTEXT pgContext)
 {
-       HANDLE hToken;
-       WCHAR UserName[256];
-       WCHAR Password[256];
-
-       TRACE("TUILockedSAS()\n");
-
-       UNREFERENCED_PARAMETER(pgContext);
-
-       if (!DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE))
-               return WLX_SAS_ACTION_UNLOCK_WKSTA;
-
-       /* Ask the user for credentials */
-       if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE))
-               return WLX_SAS_ACTION_NONE;
-       if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
-               return WLX_SAS_ACTION_NONE;
-
-       if (!LogonUserW(UserName, NULL, Password,
-               LOGON32_LOGON_UNLOCK,
-               LOGON32_PROVIDER_DEFAULT,
-               &hToken))
-       {
-               TRACE("LogonUserW() failed\n");
-               return WLX_SAS_ACTION_NONE;
-       }
-       CloseHandle(hToken);
-       return WLX_SAS_ACTION_UNLOCK_WKSTA;
 }
 
 GINA_UI GinaTextUI = {
-       TUIInitialize,
-       TUIDisplayStatusMessage,
-       TUIRemoveStatusMessage,
-       TUIDisplaySASNotice,
-       TUILoggedOnSAS,
-       TUILoggedOutSAS,
-       TUILockedSAS,
+    TUIInitialize,
+    TUIDisplayStatusMessage,
+    TUIRemoveStatusMessage,
+    TUIDisplaySASNotice,
+    TUILoggedOnSAS,
+    TUILoggedOutSAS,
+    TUILockedSAS,
+    TUIDisplayLockedNotice,
 };