[NTVDM]
[reactos.git] / reactos / subsystems / mvdm / ntvdm / dos / dos32krnl / dos.h
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: dos/dos32krnl/dos.h
5 * PURPOSE: DOS32 Kernel
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 */
8
9 #ifndef _DOS_H_
10 #define _DOS_H_
11
12 /* INCLUDES *******************************************************************/
13
14 #include "device.h"
15
16 /**/ #include "int32.h" /**/
17
18 /* DEFINES ********************************************************************/
19
20 //
21 // We are DOS 5.00 (reported by INT 21h, AH=30h)
22 // and DOS 5.50 (reported by INT 21h, AX=3306h) for Windows NT Compatibility
23 //
24 #define DOS_VERSION MAKEWORD(5, 00)
25 #define NTDOS_VERSION MAKEWORD(5, 50)
26
27 #define DOS_CONFIG_PATH L"%SystemRoot%\\system32\\CONFIG.NT"
28 #define DOS_COMMAND_INTERPRETER L"%SystemRoot%\\system32\\COMMAND.COM /k %SystemRoot%\\system32\\AUTOEXEC.NT"
29 #define FIRST_MCB_SEGMENT 0x1000
30 #define USER_MEMORY_SIZE (0x9FFE - FIRST_MCB_SEGMENT)
31 #define SYSTEM_PSP 0x08
32 #define SYSTEM_ENV_BLOCK 0x800
33 #define DOS_CODE_SEGMENT 0x70
34 #define DOS_DATA_SEGMENT 0xA0
35
36 #define DOS_DATA_OFFSET(x) FIELD_OFFSET(DOS_DATA, x)
37
38 #define INVALID_DOS_HANDLE 0xFFFF
39 #define DOS_INPUT_HANDLE 0
40 #define DOS_OUTPUT_HANDLE 1
41 #define DOS_ERROR_HANDLE 2
42
43 #define DOS_SFT_SIZE 255
44 #define UMB_START_SEGMENT 0xC000
45 #define UMB_END_SEGMENT 0xDFFF
46 #define DOS_ALLOC_HIGH 0x40
47 #define DOS_ALLOC_HIGH_LOW 0x80
48 #define DOS_DIR_LENGTH 64
49 #define NUM_DRIVES ('Z' - 'A' + 1)
50 #define DOS_CHAR_ATTRIBUTE 0x07
51
52 /* 16 MB of EMS memory */
53 #define EMS_TOTAL_PAGES 1024
54
55 #pragma pack(push, 1)
56
57 typedef struct _DOS_FCB
58 {
59 BYTE DriveNumber;
60 CHAR FileName[8];
61 CHAR FileExt[3];
62 WORD BlockNumber;
63 WORD RecordSize;
64 DWORD FileSize;
65 WORD LastWriteDate;
66 WORD LastWriteTime;
67 BYTE Reserved[8];
68 BYTE BlockRecord;
69 BYTE RecordNumber[3];
70 } DOS_FCB, *PDOS_FCB;
71
72 typedef struct _DOS_SYSVARS
73 {
74 DWORD OemHandler;
75 WORD Int21hReturn;
76 WORD ShareRetryCount;
77 WORD ShareRetryDelay;
78 DWORD DiskBuffer;
79 WORD UnreadConInput;
80 WORD FirstMcb;
81
82 /* This is where the SYSVARS really start */
83 DWORD FirstDpb;
84 DWORD FirstSft;
85 DWORD ActiveClock;
86 DWORD ActiveCon;
87 BYTE Reserved0[6];
88 DWORD CurrentDirs;
89 BYTE Reserved1[6];
90 BYTE NumBlockDevices;
91 BYTE NumLocalDrives; // Set by LASTDRIVE
92 DOS_DRIVER NullDevice;
93 BYTE NullDriverRoutine[7];
94 BYTE Reserved2[8];
95 BYTE BootDrive;
96 BYTE UseDwordMoves;
97 WORD ExtMemSize;
98 } DOS_SYSVARS, *PDOS_SYSVARS;
99
100 typedef struct _DOS_CLOCK_TRANSFER_RECORD
101 {
102 WORD NumberOfDays;
103 BYTE Minutes;
104 BYTE Hours;
105 BYTE Hundredths;
106 BYTE Seconds;
107 } DOS_CLOCK_TRANSFER_RECORD, *PDOS_CLOCK_TRANSFER_RECORD;
108
109 typedef struct _DOS_INPUT_BUFFER
110 {
111 BYTE MaxLength;
112 BYTE Length;
113 CHAR Buffer[ANYSIZE_ARRAY];
114 } DOS_INPUT_BUFFER, *PDOS_INPUT_BUFFER;
115
116 typedef struct _DOS_FIND_FILE_BLOCK
117 {
118 CHAR DriveLetter;
119 CHAR Pattern[11];
120 UCHAR AttribMask;
121 DWORD Unused;
122 HANDLE SearchHandle;
123
124 /* The following part of the structure is documented */
125 UCHAR Attributes;
126 WORD FileTime;
127 WORD FileDate;
128 DWORD FileSize;
129 CHAR FileName[13];
130 } DOS_FIND_FILE_BLOCK, *PDOS_FIND_FILE_BLOCK;
131
132 typedef struct _DOS_SDA
133 {
134 BYTE PrinterEchoFlag;
135 CHAR CurrentSwitchChar;
136 BYTE AllocStrategy;
137 BYTE Unused0[28];
138
139 /* This is where the SDA really starts */
140 BYTE ErrorMode;
141 BYTE InDos;
142 BYTE ErrorDrive;
143 BYTE LastErrorLocus;
144 WORD LastErrorCode;
145 BYTE LastErrorAction;
146 BYTE LastErrorClass;
147 DWORD LastErrorPointer;
148 DWORD DiskTransferArea;
149 WORD CurrentPsp;
150 WORD Int23StackPointer;
151 WORD ErrorLevel;
152 BYTE CurrentDrive;
153 BYTE ExtendedBreakFlag;
154
155 /* This part is only valid while in DOS */
156 WORD LastAX;
157 WORD NetworkPsp;
158 WORD NetworkMachineNumber;
159 WORD FirstFreeMcb;
160 WORD BestFreeMcb;
161 WORD LastFreeMcb;
162 WORD MemorySize;
163 WORD LastSearchDirEntry;
164 BYTE Int24FailFlag;
165 BYTE DirectoryFlag;
166 BYTE CtrlBreakFlag;
167 BYTE AllowFcbBlanks;
168 BYTE Unused1;
169 BYTE DayOfMonth;
170 BYTE Month;
171 WORD Year;
172 WORD NumDays;
173 BYTE DayOfWeek;
174 BYTE ConsoleSwappedFlag;
175 BYTE Int28CallOk;
176 BYTE Int24AbortFlag;
177 DOS_RW_REQUEST Request;
178 DWORD DriverEntryPoint;
179 BYTE Unused2[44];
180 BYTE PspCopyType;
181 BYTE Unused3;
182 BYTE UserNumber[3];
183 BYTE OemNumber;
184 WORD ErrorCodeTable;
185 DOS_CLOCK_TRANSFER_RECORD ClockTransferRecord;
186 BYTE ByteBuffer;
187 BYTE Unused4;
188 CHAR FileNameBuffer[256];
189 BYTE Unused5[53];
190 CHAR CurrentDirectory[81];
191 CHAR FcbFilename[12];
192 CHAR FcbRenameDest[12];
193 BYTE Unused6[8];
194 BYTE ExtendedAttribute;
195 BYTE FcbType;
196 BYTE DirSearchAttributes;
197 BYTE FileOpenMode;
198 BYTE FileFound;
199 BYTE DeviceNameFound;
200 BYTE SpliceFlag;
201 BYTE DosCallFlag;
202 BYTE Unused7[5];
203 BYTE InsertMode;
204 BYTE ParsedFcbExists;
205 BYTE VolumeIDFlag;
206 BYTE TerminationType;
207 BYTE CreateFileFlag;
208 BYTE FileDeletedChar;
209 DWORD CriticalErrorDpb;
210 DWORD UserRegistersStack;
211 WORD Int24StackPointer;
212 BYTE Unused8[14];
213 DWORD DeviceHeader;
214 DWORD CurrentSft;
215 DWORD CurrentDirPointer;
216 DWORD CallerFcb;
217 WORD SftNumber;
218 WORD TempFileHandle;
219 DWORD JftEntry;
220 WORD FirstArgument;
221 WORD SecondArgument;
222 WORD LastComponent;
223 WORD TransferOffset;
224 BYTE Unused9[38];
225 DWORD WorkingSft;
226 WORD Int21CallerBX;
227 WORD Int21CallerDS;
228 WORD Unused10;
229 DWORD PrevCallFrame;
230 } DOS_SDA, *PDOS_SDA;
231
232 typedef struct _DOS_DATA
233 {
234 DOS_SYSVARS SysVars;
235 DOS_SDA Sda;
236 CHAR CurrentDirectories[NUM_DRIVES][DOS_DIR_LENGTH];
237 BYTE Sft[ANYSIZE_ARRAY];
238 } DOS_DATA, *PDOS_DATA;
239
240 #pragma pack(pop)
241
242 /* VARIABLES ******************************************************************/
243
244 extern BOOLEAN DoEcho;
245 extern WORD DosErrorLevel;
246 extern WORD DosLastError;
247 extern PDOS_SYSVARS SysVars;
248 extern PDOS_SDA Sda;
249
250 /* FUNCTIONS ******************************************************************/
251
252 extern CALLBACK16 DosContext;
253 #define RegisterDosInt32(IntNumber, IntHandler) \
254 do { \
255 DosContext.NextOffset += RegisterInt32(MAKELONG(DosContext.NextOffset, \
256 DosContext.Segment), \
257 (IntNumber), (IntHandler), NULL); \
258 } while(0);
259
260 /*
261 * DOS BIOS Functions
262 * See bios.c
263 */
264 CHAR DosReadCharacter(WORD FileHandle);
265 BOOLEAN DosCheckInput(VOID);
266 VOID DosPrintCharacter(WORD FileHandle, CHAR Character);
267
268 BOOLEAN DosBIOSInitialize(VOID);
269 VOID ConDrvInitialize(VOID);
270 VOID ConDrvCleanup(VOID);
271
272 /*
273 * DOS Kernel Functions
274 * See dos.c
275 */
276
277 BOOLEAN DosKRNLInitialize(VOID);
278
279 #endif // _DOS_H_
280
281 /* EOF */