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
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
#ifndef STANDALONE
else
{
- /* Stop accepting new commands */
+ /* A command is running, let it run, but stop accepting new commands */
AcceptCommands = FALSE;
}
#endif
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)
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");