[KERNEL32][NTVDM]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 3 May 2014 02:13:51 +0000 (02:13 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 3 May 2014 02:13:51 +0000 (02:13 +0000)
In BaseCheckVDM, return a task ID of 0 if there is a console.
In CommandThreadProc, make sure the loop executes at least once.
Also, if a session ID is given, there is no parent console, so there is no need to wait
for further commands.

svn path=/branches/ntvdm/; revision=63124

dll/win32/kernel32/client/vdm.c
subsystems/ntvdm/ntvdm.c

index c37a3cf..07f65a3 100644 (file)
@@ -401,8 +401,17 @@ BaseCheckVDM(IN ULONG BinaryType,
                                  CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepCheckVDM),
                                  sizeof(BASE_CHECK_VDM));
 
-    /* Write back the task ID */
-    *iTask = CheckVdm->iTask;
+    /* Check if there is no console */
+    if (CheckVdm->ConsoleHandle == NULL)
+    {
+        /* Write back the task ID */
+        *iTask = CheckVdm->iTask;
+    }
+    else
+    {
+        /* Otherwise, iTask should be zero */
+        *iTask = 0;
+    }
 
 Cleanup:
 
index 3576bf4..813a885 100644 (file)
@@ -377,7 +377,7 @@ DWORD WINAPI CommandThreadProc(LPVOID Parameter)
 
     UNREFERENCED_PARAMETER(Parameter);
 
-    while (AcceptCommands)
+    do
     {
         /* Clear the structure */
         ZeroMemory(&CommandInfo, sizeof(CommandInfo));
@@ -431,6 +431,7 @@ DWORD WINAPI CommandThreadProc(LPVOID Parameter)
 
         First = FALSE;
     }
+    while (AcceptCommands);
 
     return 0;
 }
@@ -468,6 +469,9 @@ INT wmain(INT argc, WCHAR *argv[])
         {
             /* This is the session ID */
             SessionId = wcstoul(argv[i] + 2, &endptr, 10);
+
+            /* The VDM hasn't been started from a console, so quit when the task is done */
+            AcceptCommands = FALSE;
         }
     }