xref: /reactos/ntoskrnl/include/internal/vdm.h (revision c2c66aff)
1 /*
2 * PROJECT:         ReactOS Kernel
3 * LICENSE:         GPL - See COPYING in the top level directory
4 * FILE:            ntoskrnl/include/internal/vdm.h
5 * PURPOSE:         Internal header for V86 and VDM Support
6 * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
7 */
8 
9 //
10 // Define this if you want debugging support
11 //
12 #define _VM_DEBUG_                                      0x00
13 
14 //
15 // These define the Debug Masks Supported
16 //
17 #define VM_EXEC_DEBUG                                   0x01
18 
19 //
20 // Debug/Tracing support
21 //
22 #if _VM_DEBUG_
23 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
24 #define VMTRACE DbgPrintEx
25 #else
26 #define VMTRACE(x, ...)                                 \
27     if (x & VdmpTraceLevel) DbgPrint(__VA_ARGS__)
28 #endif
29 #else
30 #define VMTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
31 #endif
32 
33 //
34 // Memory addresses inside CSRSS for V86 Support
35 //
36 #define TRAMPOLINE_BASE                                 0x10000
37 #define TRAMPOLINE_TIB                                  0x12000
38 #define TRAMPOLINE_TEB                                  0x13000
39 
40 //
41 // BOP (Magic Opcode) to exit V86 Mode
42 //
43 #define TRAMPOLINE_BOP                                  0xFEC4C4
44 
45 //
46 // VDM State Pointer
47 //
48 #define VdmState                                        \
49     (PULONG)FIXED_NTVDMSTATE_LINEAR_PC_AT
50 
51 //
52 // VDM Event Types
53 //
54 typedef enum _VdmEventClass
55 {
56     VdmIO,
57     VdmStringIO,
58     VdmMemAccess,
59     VdmIntAck,
60     VdmBop,
61     VdmError,
62     VdmIrq13
63 } VDMEVENTCLASS, *PVDMEVENTCLASS;
64 
65 //
66 // VDM Interrupt and Fault Handler Definitions
67 //
68 typedef struct _Vdm_InterruptHandler
69 {
70     USHORT CsSelector;
71     USHORT Flags;
72     ULONG Eip;
73 } VDM_INTERRUPTHANDLER, *PVDM_INTERRUPTHANDLER;
74 
75 typedef struct _Vdm_FaultHandler
76 {
77     USHORT CsSelector;
78     USHORT SsSelector;
79     ULONG Eip;
80     ULONG Esp;
81     ULONG Flags;
82 } VDM_FAULTHANDLER, *PVDM_FAULTHANDLER;
83 
84 //
85 // VDM Event Information
86 //
87 typedef struct _VdmEventInfo
88 {
89     ULONG Size;
90     VDMEVENTCLASS Event;
91     ULONG InstructionSize;
92     union
93     {
94         //VDMIOINFO IoInfo;
95         //VDMSTRINGIOINFO StringIoInfo;
96         ULONG BopNumber;
97         //VDMFAULTINFO FaultInfo;
98         LONG ErrorStatus;
99         ULONG IntAckInfo;
100     };
101 } VDMEVENTINFO, *PVDMEVENTINFO;
102 
103 //
104 // VDM Printer Information
105 //
106 typedef struct _Vdm_Printer_Info
107 {
108     PUCHAR prt_state;
109     // TODO
110 } VDM_PRINTER_INFO, *PVDM_PRINTER_INFO;
111 
112 //
113 // VDM Trace Information
114 //
115 typedef struct _VdmTraceInfo
116 {
117     // TODO
118     UCHAR Flags;
119     // TODO
120 } VDMTRACEINFO, *PVDMTRACEINFO;
121 
122 //
123 // VDM Family Table
124 //
125 typedef struct _tagFAMILY_TABLE
126 {
127     INT numHookedAPIs;
128     // TODO
129 } FAMILY_TABLE, *PFAMILY_TABLE;
130 
131 //
132 // Thread Information Block for VDM Threads
133 //
134 typedef struct _Vdm_Tib
135 {
136     ULONG Size;
137     PVDM_INTERRUPTHANDLER VdmInterruptTable;
138     PVDM_FAULTHANDLER VdmFaultTable;
139     CONTEXT MonitorContext;
140     CONTEXT VdmContext;
141     VDMEVENTINFO EventInfo;
142     VDM_PRINTER_INFO PrinterInfo;
143     ULONG TempArea1[2];
144     ULONG TempArea2[2];
145     VDMTRACEINFO TraceInfo;
146     ULONG IntelMSW;
147     LONG NumTasks;
148     PFAMILY_TABLE *pDpmFamTbls;
149     BOOLEAN ContinueExecution;
150 } VDM_TIB, *PVDM_TIB;
151 
152 //
153 // Process Information Block for VDM Processes
154 //
155 typedef struct _VDM_PROCESS_OBJECTS
156 {
157     PVOID VdmIoListHead; // PVDM_IO_LISTHEAD
158     KAPC QueuedIntApc;
159     KAPC QueuedIntUserApc;
160     FAST_MUTEX DelayIntFastMutex;
161     KSPIN_LOCK DelayIntSpinLock;
162     LIST_ENTRY DelayIntListHead;
163     PVOID pIcaUserData; // VDMICAUSERDATA
164     PETHREAD MainThread;
165     PVDM_TIB VdmTib;
166     UCHAR PrinterState;
167     UCHAR PrinterControl;
168     UCHAR PrinterStatus;
169     UCHAR PrinterHostState;
170     USHORT AdlibStatus;
171     USHORT AdlibIndexRegister;
172     USHORT AdlibPhysPortStart;
173     USHORT AdlibPhysPortEnd;
174     USHORT AdlibVirtPortStart;
175     USHORT AdlibVirtPortEnd;
176     USHORT AdlibAction;
177     USHORT VdmControl;
178     ULONG PMCliTimeStamp;
179 } VDM_PROCESS_OBJECTS, *PVDM_PROCESS_OBJECTS;
180 
181 //
182 // Functions
183 //
184 NTSTATUS
185 NTAPI
186 VdmpStartExecution(
187     VOID
188 );
189 
190 //
191 // Global data inside the VDM
192 //
193 
194 
195