diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dem.c b/reactos/subsystems/mvdm/ntvdm/dos/dem.c index 9e559b8dc36..19a37afd4b0 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dem.c +++ b/reactos/subsystems/mvdm/ntvdm/dos/dem.c @@ -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) diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dem.h b/reactos/subsystems/mvdm/ntvdm/dos/dem.h index 30e47ab8282..868e3ea1b78 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dem.h +++ b/reactos/subsystems/mvdm/ntvdm/dos/dem.h @@ -25,6 +25,14 @@ #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 diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c index 6f430eab278..af06036f272 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c +++ b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/process.c @@ -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(); diff --git a/reactos/subsystems/mvdm/ntvdm/ntvdm.c b/reactos/subsystems/mvdm/ntvdm/ntvdm.c index 7f0885c1fce..2399fe1b476 100644 --- a/reactos/subsystems/mvdm/ntvdm/ntvdm.c +++ b/reactos/subsystems/mvdm/ntvdm/ntvdm.c @@ -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"); diff --git a/reactos/subsystems/mvdm/ntvdm/ntvdm.h b/reactos/subsystems/mvdm/ntvdm/ntvdm.h index 1b7c988a5af..f71d58f37f5 100644 --- a/reactos/subsystems/mvdm/ntvdm/ntvdm.h +++ b/reactos/subsystems/mvdm/ntvdm/ntvdm.h @@ -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 diff --git a/reactos/subsystems/mvdm/ntvdm/vddsup.c b/reactos/subsystems/mvdm/ntvdm/vddsup.c index 0180e9c901f..a3eb1cd75ce 100644 --- a/reactos/subsystems/mvdm/ntvdm/vddsup.c +++ b/reactos/subsystems/mvdm/ntvdm/vddsup.c @@ -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."