Starting something for VDM support.
authorRobert Dickenson <robd@reactos.org>
Mon, 28 Oct 2002 13:59:59 +0000 (13:59 +0000)
committerRobert Dickenson <robd@reactos.org>
Mon, 28 Oct 2002 13:59:59 +0000 (13:59 +0000)
svn path=/trunk/; revision=3662

reactos/subsys/ntvdm/.cvsignore [new file with mode: 0644]
reactos/subsys/ntvdm/makefile [new file with mode: 0644]
reactos/subsys/ntvdm/ntvdm.c [new file with mode: 0644]
reactos/subsys/ntvdm/ntvdm.rc [new file with mode: 0644]

diff --git a/reactos/subsys/ntvdm/.cvsignore b/reactos/subsys/ntvdm/.cvsignore
new file mode 100644 (file)
index 0000000..5b2574d
--- /dev/null
@@ -0,0 +1,6 @@
+ntvdm.coff
+ntvdm.exe
+ntvdm.nostrip.exe
+*.d
+*.o
+*.sym
diff --git a/reactos/subsys/ntvdm/makefile b/reactos/subsys/ntvdm/makefile
new file mode 100644 (file)
index 0000000..1537559
--- /dev/null
@@ -0,0 +1,21 @@
+# $Id: makefile,v 1.1 2002/10/28 13:59:59 robd Exp $
+
+PATH_TO_TOP = ../..
+
+TARGET_TYPE = program
+
+TARGET_APPTYPE = console
+
+TARGET_NAME = ntvdm
+
+TARGET_INSTALLDIR = system32
+
+TARGET_SDKLIBS = ntdll.a kernel32.a user32.a gdi32.a advapi32.a
+
+TARGET_OBJECTS = $(TARGET_NAME).o
+
+include $(PATH_TO_TOP)/rules.mak
+
+include $(TOOLS_PATH)/helper.mk
+
+# EOF
diff --git a/reactos/subsys/ntvdm/ntvdm.c b/reactos/subsys/ntvdm/ntvdm.c
new file mode 100644 (file)
index 0000000..2fb0169
--- /dev/null
@@ -0,0 +1,144 @@
+/* $Id: ntvdm.c,v 1.1 2002/10/28 13:59:59 robd Exp $
+ * 
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            subsys/ntvdm/ntvdm.c
+ * PURPOSE:         Virtual DOS Machine
+ * PROGRAMMER:      Robert Dickenson (robd@mok.lvcm.com)
+ * UPDATE HISTORY:
+ *                  Created 23/10/2002
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntos.h>
+#include <windows.h>
+#include <stdio.h>
+#include <wchar.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ******************************************************************/
+
+
+/* FUNCTIONS *****************************************************************/
+
+void PrintString(char* fmt,...)
+{
+   char buffer[512];
+   va_list ap;
+
+   va_start(ap, fmt);
+   vsprintf(buffer, fmt, ap);
+   va_end(ap);
+
+   OutputDebugString(buffer);
+}
+
+/*
+GetVersion
+GetVolumeInformationW
+GetWindowsDirectoryA
+GlobalMemoryStatus
+HeapAlloc
+HeapCreate
+HeapDestroy
+HeapFree
+HeapReAlloc
+
+GetNextVDMCommand
+ExitVDM
+RegisterConsoleVDM
+SetVDMCurrentDirectories
+VDMConsoleOperation
+WriteConsoleInputVDMW
+
+NtSetLdtEntries
+NtTerminateProcess
+
+NtMapViewOfSection
+NtUnmapViewOfSection
+
+NtVdmControl
+ */
+
+BOOLEAN
+StartVirtualMachine(VOID)
+{
+   BOOLEAN Result;
+   STARTUPINFO StartupInfo;
+   PROCESS_INFORMATION ProcessInformation;
+   CHAR CommandLine[MAX_PATH];
+   CHAR CurrentDirectory[MAX_PATH];
+
+   GetSystemDirectory(CommandLine, MAX_PATH);
+   strcat(CommandLine, "\\hello.exe");
+   GetWindowsDirectory(CurrentDirectory, MAX_PATH);
+
+   StartupInfo.cb = sizeof(StartupInfo);
+   StartupInfo.lpReserved = NULL;
+   StartupInfo.lpDesktop = NULL;
+   StartupInfo.lpTitle = NULL;
+   StartupInfo.dwFlags = 0;
+   StartupInfo.cbReserved2 = 0;
+   StartupInfo.lpReserved2 = 0;
+
+   Result = CreateProcess(CommandLine,
+                          NULL,
+                          NULL,
+                          NULL,
+                          FALSE,
+                          DETACHED_PROCESS,
+                          NULL,
+                          NULL,
+                          &StartupInfo,
+                          &ProcessInformation);
+    if (!Result) {
+        PrintString("WL: Failed to execute target process\n");
+        return FALSE;
+    }
+    WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
+    CloseHandle(ProcessInformation.hProcess);
+    CloseHandle(ProcessInformation.hThread);
+    return TRUE;
+}
+
+int STDCALL
+WinMain(HINSTANCE hInstance,  HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
+{
+    DWORD Result;
+    BOOL Success;
+    ULONG i;
+    NTSTATUS Status;
+
+    CHAR WelcomeMsg[] = "ReactOS Virtual DOS Machine support.\nType q<cr> to quit.";
+    CHAR InputBuffer[255];
+    
+    AllocConsole();
+    SetConsoleTitle("ntvdm");
+    StartVirtualMachine();
+   
+    for (;;) {
+        WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),
+                     WelcomeMsg, strlen(WelcomeMsg),  // wcslen(WelcomeMsg),
+                     &Result, NULL);
+        i = 0;
+        do {
+            ReadConsole(GetStdHandle(STD_INPUT_HANDLE),
+                        &InputBuffer[i], 1,
+                        &Result, NULL);
+            if (++i >= (sizeof(InputBuffer) - 1)) {
+                break;
+            }
+        } while (InputBuffer[i - 1] != '\n');
+        InputBuffer[i - 1] = '\0';
+
+        if (InputBuffer[0] == 'q' || InputBuffer[0] == 'Q') {
+            break;
+        }
+    }
+
+    ExitProcess(0);
+    return 0;
+}
diff --git a/reactos/subsys/ntvdm/ntvdm.rc b/reactos/subsys/ntvdm/ntvdm.rc
new file mode 100644 (file)
index 0000000..f8fc057
--- /dev/null
@@ -0,0 +1,38 @@
+#include <defines.h>
+#include <reactos/resource.h>
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+VS_VERSION_INFO VERSIONINFO
+       FILEVERSION     RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD
+       PRODUCTVERSION  RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD      
+       FILEFLAGSMASK   0x3fL
+#ifdef _DEBUG
+       FILEFLAGS       0x1L
+#else
+       FILEFLAGS       0x0L
+#endif
+       FILEOS          0x40004L
+       FILETYPE        0x2L
+       FILESUBTYPE     0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName",       RES_STR_COMPANY_NAME
+            VALUE "FileDescription",   "ReactOS Virtual DOS Machine\0"
+            VALUE "FileVersion",       RES_STR_FILE_VERSION
+            VALUE "InternalName",      "ntvdm\0"
+            VALUE "LegalCopyright",    RES_STR_LEGAL_COPYRIGHT
+            VALUE "OriginalFilename",  "ntvdm.exe\0"
+            VALUE "ProductName",       RES_STR_PRODUCT_NAME
+            VALUE "ProductVersion",    RES_STR_PRODUCT_VERSION
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+