mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
[NTVDM]
- 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:
parent
194530e567
commit
dcfe21b3c1
6 changed files with 97 additions and 42 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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."
|
||||
|
|
Loading…
Reference in a new issue