[KERNEL32], [WIN32CSR] More fixes for console winetest
[reactos.git] / reactos / dll / win32 / kernel32 / misc / dllmain.c
index 7d08667..5247b64 100644 (file)
@@ -128,7 +128,9 @@ BasepInitConsole(VOID)
     CSR_API_MESSAGE Request;
     ULONG CsrRequest;
     NTSTATUS Status;
+    BOOLEAN NotConsole = FALSE;
     PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters;
+    LPCWSTR ExeName;
 
     WCHAR lpTest[MAX_PATH];
     GetModuleFileNameW(NULL, lpTest, MAX_PATH);
@@ -143,42 +145,46 @@ BasepInitConsole(VOID)
     {
         DPRINT("Image is not a console application\n");
         Parameters->ConsoleHandle = NULL;
-        return TRUE;
-    }
-
-    /* Assume one is needed */
-    Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
-
-    /* Handle the special flags given to us by BasepInitializeEnvironment */
-    if (Parameters->ConsoleHandle == HANDLE_DETACHED_PROCESS)
-    {
-        /* No console to create */
-        DPRINT("No console to create\n");
-        Parameters->ConsoleHandle = NULL;
         Request.Data.AllocConsoleRequest.ConsoleNeeded = FALSE;
     }
-    else if (Parameters->ConsoleHandle == HANDLE_CREATE_NEW_CONSOLE)
-    {
-        /* We'll get the real one soon */
-        DPRINT("Creating new console\n");
-        Parameters->ConsoleHandle = NULL;
-    }
-    else if (Parameters->ConsoleHandle == HANDLE_CREATE_NO_WINDOW)
-    {
-        /* We'll get the real one soon */
-        DPRINT1("NOT SUPPORTED: HANDLE_CREATE_NO_WINDOW\n");
-        Parameters->ConsoleHandle = NULL;
-    }
     else
     {
-        if (Parameters->ConsoleHandle == INVALID_HANDLE_VALUE)
+        /* Assume one is needed */
+        Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
+        Request.Data.AllocConsoleRequest.Visible = TRUE;
+
+        /* Handle the special flags given to us by BasepInitializeEnvironment */
+        if (Parameters->ConsoleHandle == HANDLE_DETACHED_PROCESS)
+        {
+            /* No console to create */
+            DPRINT("No console to create\n");
+            Parameters->ConsoleHandle = NULL;
+            Request.Data.AllocConsoleRequest.ConsoleNeeded = FALSE;
+        }
+        else if (Parameters->ConsoleHandle == HANDLE_CREATE_NEW_CONSOLE)
+        {
+            /* We'll get the real one soon */
+            DPRINT("Creating new console\n");
+            Parameters->ConsoleHandle = NULL;
+        }
+        else if (Parameters->ConsoleHandle == HANDLE_CREATE_NO_WINDOW)
+        {
+            /* We'll get the real one soon */
+            DPRINT("Creating new invisible console\n");
+            Parameters->ConsoleHandle = NULL;
+            Request.Data.AllocConsoleRequest.Visible = FALSE;
+        }
+        else
         {
-            Parameters->ConsoleHandle = 0;
+            if (Parameters->ConsoleHandle == INVALID_HANDLE_VALUE)
+            {
+                Parameters->ConsoleHandle = 0;
+            }
+            DPRINT("Using existing console: %x\n", Parameters->ConsoleHandle);
         }
-        DPRINT("Using existing console: %x\n", Parameters->ConsoleHandle);
     }
 
-    /* Initialize Console Ctrl Handler */
+    /* Initialize Console Ctrl Handler and input EXE name */
     ConsoleInitialized = TRUE;
     RtlInitializeCriticalSection(&ConsoleLock);
     NrAllocatedHandlers = 1;
@@ -186,6 +192,10 @@ BasepInitConsole(VOID)
     CtrlHandlers = InitialHandler;
     CtrlHandlers[0] = DefaultConsoleCtrlHandler;
 
+    ExeName = wcsrchr(Parameters->ImagePathName.Buffer, L'\\');
+    if (ExeName)
+        SetConsoleInputExeNameW(ExeName + 1);
+    
     /* Now use the proper console handle */
     Request.Data.AllocConsoleRequest.Console = Parameters->ConsoleHandle;
 
@@ -194,9 +204,6 @@ BasepInitConsole(VOID)
      * but we don't have one yet, so we will instead simply send a create
      * console message to the Base Server. When we finally have a Console
      * Server, this code should be changed to send connection data instead.
-     *
-     * Also note that this connection should be made for any console app, even
-     * in the case above where -we- return.
      */
     CsrRequest = MAKE_CSR_API(ALLOC_CONSOLE, CSR_CONSOLE);
     Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher;
@@ -210,6 +217,8 @@ BasepInitConsole(VOID)
         /* We're lying here, so at least the process can load... */
         return TRUE;
     }
+    
+    if (NotConsole) return TRUE;
 
     /* We got the handles, let's set them */
     if ((Parameters->ConsoleHandle = Request.Data.AllocConsoleRequest.Console))
@@ -328,6 +337,9 @@ DllMain(HANDLE hDll,
         wcscpy(SystemDirectory.Buffer, WindowsDirectory.Buffer);
         wcscat(SystemDirectory.Buffer, L"\\System32");
 
+        /* Initialize command line */
+        InitCommandLines();
+
         /* Open object base directory */
         Status = OpenBaseDirectory(&hBaseDir);
         if (!NT_SUCCESS(Status))
@@ -400,6 +412,12 @@ DllMain(HANDLE hDll,
     return TRUE;
 }
 
+#undef InterlockedIncrement
+#undef InterlockedDecrement
+#undef InterlockedExchange
+#undef InterlockedExchangeAdd
+#undef InterlockedCompareExchange
+
 LONG
 WINAPI
 InterlockedIncrement(IN OUT LONG volatile *lpAddend)