KD System Rewrite:
[reactos.git] / reactos / ntoskrnl / ke / i386 / vdm.c
1 /* $Id:$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ke/i386/vdm.c
6 * PURPOSE: Virtual DOS machine support
7 *
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ntoskrnl.h>
14 #include <internal/debug.h>
15
16 /* GLOBALS *******************************************************************/
17
18 static UCHAR OrigIVT[1024];
19 static UCHAR OrigBDA[256];
20 /* static UCHAR OrigEBDA[]; */
21
22 extern VOID Ki386RetToV86Mode(PKV86M_REGISTERS InRegs,
23 PKV86M_REGISTERS OutRegs);
24
25 /* FUNCTIONS *****************************************************************/
26
27 VOID INIT_FUNCTION
28 NtEarlyInitVdm(VOID)
29 {
30 /* GCC 3.4 warns if NULL is passed in parameter 2 to the standard function memcpy */
31 PVOID start = (PVOID)0x0;
32
33 /*
34 * Save various BIOS data tables. At this point the lower 4MB memory
35 * map is still active so we can just copy the data from low memory.
36 */
37 memcpy(OrigIVT, start, 1024);
38 memcpy(OrigBDA, (PVOID)0x400, 256);
39 }
40
41 /*
42 * @implemented
43 */
44 NTSTATUS STDCALL NtVdmControl(ULONG ControlCode,
45 PVOID ControlData)
46 {
47 switch (ControlCode)
48 {
49 case 0:
50 memcpy(ControlData, OrigIVT, 1024);
51 break;
52
53 case 1:
54 memcpy(ControlData, OrigBDA, 256);
55 break;
56
57 case 2:
58 {
59 KV86M_REGISTERS V86Registers;
60 ULONG ret;
61
62 ret = MmCopyFromCaller(&V86Registers,
63 ControlData,
64 sizeof(KV86M_REGISTERS));
65 if(!NT_SUCCESS(ret)) return ret;
66
67 KeGetCurrentProcess()->NtVdmFlag = 1;
68 Ki386RetToV86Mode(&V86Registers, &V86Registers);
69 KeGetCurrentProcess()->NtVdmFlag = 0;
70
71 ret = MmCopyToCaller(ControlData,
72 &V86Registers,
73 sizeof(KV86M_REGISTERS));
74 if(!NT_SUCCESS(ret)) return ret;
75
76 break;
77 }
78 }
79 return(STATUS_SUCCESS);
80 }
81
82 /* EOF */