[NTVDM]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 7 May 2015 01:23:33 +0000 (01:23 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 7 May 2015 01:23:33 +0000 (01:23 +0000)
- Improvement/Usability: when a DOS app is started in a separate console, print its full path as it's done in Windows.
- Stubplement a LoadGlobalSettings function for NTVDM so that it will be able to grab user settings from the registry.
- Move DOS-only related variables AcceptCommands, CommandThread and SessionId to where they belong. I will rework ConsoleCtrlHandler to make it more elegant in the future (DOS-agnostic).
- Remove the useless ENTER-key-up hack.

svn path=/trunk/; revision=67589

reactos/subsystems/mvdm/ntvdm/dos/dem.c
reactos/subsystems/mvdm/ntvdm/dos/dem.h
reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c
reactos/subsystems/mvdm/ntvdm/ntvdm.c
reactos/subsystems/mvdm/ntvdm/ntvdm.h
reactos/subsystems/mvdm/ntvdm/vddsup.c

index 9e559b8..19a37af 100644 (file)
@@ -274,6 +274,14 @@ Command:
 }
 #endif
 
+/* PUBLIC VARIABLES ***********************************************************/
+
+#ifndef STANDALONE
+BOOLEAN AcceptCommands = TRUE;
+HANDLE CommandThread = NULL;
+ULONG SessionId = 0;
+#endif
+
 /* PUBLIC FUNCTIONS ***********************************************************/
 
 //
@@ -422,6 +430,8 @@ static VOID WINAPI DosStart(LPWORD Stack)
     DWORD Result;
     CHAR ApplicationName[MAX_PATH];
     CHAR CommandLine[DOS_CMDLINE_LENGTH];
+#else
+    INT i;
 #endif
 
     DPRINT("DosStart\n");
@@ -437,6 +447,19 @@ static VOID WINAPI DosStart(LPWORD Stack)
 
 #ifndef STANDALONE
 
+    /* Parse the command line arguments */
+    for (i = 1; i < NtVdmArgc; i++)
+    {
+        if (wcsncmp(NtVdmArgv[i], L"-i", 2) == 0)
+        {
+            /* This is the session ID */
+            SessionId = wcstoul(NtVdmArgv[i] + 2, NULL, 10);
+
+            /* The VDM hasn't been started from a console, so quit when the task is done */
+            AcceptCommands = FALSE;
+        }
+    }
+
     /* Create the GetNextVDMCommand thread */
     CommandThread = CreateThread(NULL, 0, &CommandThreadProc, NULL, 0, NULL);
     if (CommandThread == NULL)
index 30e47ab..868e3ea 100644 (file)
 #define BOP_DOS         0x50    // DOS System BOP (for NTIO.SYS and NTDOS.SYS)
 #define BOP_CMD         0x54    // DOS Command Interpreter BOP (for COMMAND.COM)
 
+/* VARIABLES ******************************************************************/
+
+#ifndef STANDALONE
+extern BOOLEAN AcceptCommands;
+extern HANDLE CommandThread;
+extern ULONG SessionId;
+#endif
+
 /* FUNCTIONS ******************************************************************/
 
 DWORD
index 6f430ea..af06036 100644 (file)
@@ -641,17 +641,14 @@ DWORD DosStartProcess(IN LPCSTR ExecutablePath,
 
     if (Result != ERROR_SUCCESS) goto Quit;
 
+    /* Update console title if we run in a separate console */
+    if (SessionId != 0)
+        SetConsoleTitleA(ExecutablePath);
+
     /* Attach to the console */
     ConsoleAttach();
     VidBiosAttachToConsole();
 
-    // HACK: Simulate a ENTER key release scancode on the PS/2 port because
-    // some apps expect to read a key release scancode (> 0x80) when they
-    // are started.
-    // (hbelusca 2 May 2015: I'm not sure it's really useful. See r65012)
-    // IOWriteB(PS2_CONTROL_PORT, 0xD2);     // Next write is for the first PS/2 port
-    // IOWriteB(PS2_DATA_PORT, 0x80 | 0x1C); // ENTER key release
-
     /* Start simulation */
     SetEvent(VdmTaskEvent);
     CpuSimulate();
index 7f0885c..2399fe1 100644 (file)
@@ -24,13 +24,6 @@ static HANDLE ConsoleInput  = INVALID_HANDLE_VALUE;
 static HANDLE ConsoleOutput = INVALID_HANDLE_VALUE;
 static DWORD  OrgConsoleInputMode, OrgConsoleOutputMode;
 
-// For DOS
-#ifndef STANDALONE
-BOOLEAN AcceptCommands = TRUE;
-HANDLE CommandThread = NULL;
-ULONG SessionId = 0;
-#endif
-
 HANDLE VdmTaskEvent = NULL;
 
 // Command line of NTVDM
@@ -258,13 +251,19 @@ static BOOL
 WINAPI
 ConsoleCtrlHandler(DWORD ControlType)
 {
+// HACK: Should be removed!
+#ifndef STANDALONE
+extern BOOLEAN AcceptCommands;
+extern HANDLE CommandThread;
+#endif
+
     switch (ControlType)
     {
         case CTRL_LAST_CLOSE_EVENT:
         {
             if (WaitForSingleObject(VdmTaskEvent, 0) == WAIT_TIMEOUT)
             {
-                /* Exit immediately */
+                /* Nothing runs, so exit immediately */
 #ifndef STANDALONE
                 if (CommandThread) TerminateThread(CommandThread, 0);
 #endif
@@ -273,7 +272,7 @@ ConsoleCtrlHandler(DWORD ControlType)
 #ifndef STANDALONE
             else
             {
-                /* Stop accepting new commands */
+                /* A command is running, let it run, but stop accepting new commands */
                 AcceptCommands = FALSE;
             }
 #endif
@@ -434,9 +433,60 @@ VOID FocusEventHandler(PFOCUS_EVENT_RECORD FocusEvent)
     DPRINT1("Focus events not handled\n");
 }
 
+static BOOL
+LoadGlobalSettings(VOID)
+{
+// FIXME: These strings should be localized.
+#define ERROR_MEMORYVDD L"Insufficient memory to load installable Virtual Device Drivers."
+#define ERROR_REGVDD    L"Virtual Device Driver format in the registry is invalid."
+#define ERROR_LOADVDD   L"An installable Virtual Device Driver failed Dll initialization."
+
+    BOOL  Success = TRUE;
+    LONG  Error   = 0;
+
+    HKEY    hNTVDMKey;
+    LPCWSTR NTVDMKeyName   = L"SYSTEM\\CurrentControlSet\\Control\\NTVDM";
+
+    /* Try to open the NTVDM registry key */
+    Error = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                          NTVDMKeyName,
+                          0,
+                          KEY_QUERY_VALUE,
+                          &hNTVDMKey);
+    if (Error == ERROR_FILE_NOT_FOUND)
+    {
+        /* If the key just doesn't exist, don't do anything else */
+        return TRUE;
+    }
+    else if (Error != ERROR_SUCCESS)
+    {
+        /* The key exists but there was an access error: display an error and quit */
+        DisplayMessage(ERROR_REGVDD);
+        return FALSE;
+    }
+
+    /*
+     * Now we can do:
+     * - CPU core choice
+     * - Video choice
+     * - Sound choice
+     * - Mem?
+     * - ...
+     * - Standalone mode?
+     * - Debug settings
+     */
+
+// Quit:
+    RegCloseKey(hNTVDMKey);
+    return Success;
+}
+
 INT
 wmain(INT argc, WCHAR *argv[])
 {
+    NtVdmArgc = argc;
+    NtVdmArgv = argv;
+
 #ifdef STANDALONE
 
     if (argc < 2)
@@ -446,28 +496,10 @@ wmain(INT argc, WCHAR *argv[])
         return 0;
     }
 
-#else
-
-    INT i;
-    WCHAR *endptr;
-
-    /* Parse the command line arguments */
-    for (i = 1; i < argc; i++)
-    {
-        if (wcsncmp(argv[i], L"-i", 2) == 0)
-        {
-            /* 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;
-        }
-    }
-
 #endif
 
-    NtVdmArgc = argc;
-    NtVdmArgv = argv;
+    /* Load global VDM settings */
+    LoadGlobalSettings();
 
     DPRINT1("\n\n\nNTVDM - Starting...\n\n\n");
 
index 1b7c988..f71d58f 100644 (file)
@@ -54,12 +54,6 @@ DWORD WINAPI SetLastConsoleEventActive(VOID);
 
 /* FUNCTIONS ******************************************************************/
 
-#ifndef STANDALONE
-extern BOOLEAN AcceptCommands;
-extern HANDLE CommandThread;
-extern ULONG SessionId;
-#endif
-
 extern HANDLE VdmTaskEvent;
 
 // Command line of NTVDM
index 0180e9c..a3eb1cd 100644 (file)
@@ -234,6 +234,7 @@ Quit:
 
 static BOOL LoadInstallableVDD(VOID)
 {
+// FIXME: These strings should be localized.
 #define ERROR_MEMORYVDD L"Insufficient memory to load installable Virtual Device Drivers."
 #define ERROR_REGVDD    L"Virtual Device Driver format in the registry is invalid."
 #define ERROR_LOADVDD   L"An installable Virtual Device Driver failed Dll initialization."