- 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
This commit is contained in:
Hermès Bélusca-Maïto 2015-05-07 01:23:33 +00:00
parent 194530e567
commit dcfe21b3c1
6 changed files with 97 additions and 42 deletions

View 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)

View file

@ -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

View 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();

View 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");

View 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

View 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."