2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/nt/vdm.c
5 * PURPOSE: Virtual DOS machine support
6 * PROGRAMMER: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
14 #include <internal/ps.h>
15 #include <internal/safe.h>
16 #include <internal/v86m.h>
18 #include <internal/debug.h>
20 /* GLOBALS *******************************************************************/
22 static UCHAR OrigIVT[1024];
23 static UCHAR OrigBDA[256];
24 /* static UCHAR OrigEBDA[]; */
26 extern VOID Ki386RetToV86Mode(PKV86M_REGISTERS InRegs,
27 PKV86M_REGISTERS OutRegs);
29 /* FUNCTIONS *****************************************************************/
34 /* GCC 3.4 warns if NULL is passed in parameter 2 to the standard function memcpy */
35 PVOID start = (PVOID)0x0;
38 * Save various BIOS data tables. At this point the lower 4MB memory
39 * map is still active so we can just copy the data from low memory.
41 memcpy(OrigIVT, start, 1024);
42 memcpy(OrigBDA, (PVOID)0x400, 256);
45 NTSTATUS STDCALL NtVdmControl(ULONG ControlCode,
51 memcpy(ControlData, OrigIVT, 1024);
55 memcpy(ControlData, OrigBDA, 256);
60 KV86M_REGISTERS V86Registers;
63 ret = MmCopyFromCaller(&V86Registers,
65 sizeof(KV86M_REGISTERS));
66 if(!NT_SUCCESS(ret)) return ret;
68 KeGetCurrentProcess()->NtVdmFlag = 1;
69 Ki386RetToV86Mode(&V86Registers, &V86Registers);
70 KeGetCurrentProcess()->NtVdmFlag = 0;
72 ret = MmCopyToCaller(ControlData,
74 sizeof(KV86M_REGISTERS));
75 if(!NT_SUCCESS(ret)) return ret;
80 return(STATUS_SUCCESS);