964b6b6a400e4c7a01236dfa995aca1cc254b525
[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; // 0x00
84 DWORD FirstSft; // 0x04
85 DWORD ActiveClock; // 0x08
86 DWORD ActiveCon; // 0x0c
87 BYTE Reserved0[6]; // 0x10
88 DWORD CurrentDirs; // 0x16
89 BYTE Reserved1[6]; // 0x1a
90 BYTE NumBlockDevices; // 0x20
91 BYTE NumLocalDrives; // 0x21 - Set by LASTDRIVE
92 DOS_DRIVER NullDevice; // 0x22
93 BYTE Reserved2; // 0x34
94 WORD ProgramVersionTable; // 0x35
95 DWORD SetVerTable; // 0x37
96 WORD Reserved3[2]; // 0x3b
97 WORD BuffersNumber; // 0x3f - 'x' parameter in "BUFFERS=x,y" command
98 WORD BuffersLookaheadNumber; // 0x41 - 'y' parameter in "BUFFERS=x,y" command
99 BYTE BootDrive; // 0x43
100 BYTE UseDwordMoves; // 0x44
101 WORD ExtMemSize; // 0x45
102 } DOS_SYSVARS, *PDOS_SYSVARS;
103
104 typedef struct _DOS_CLOCK_TRANSFER_RECORD
105 {
106 WORD NumberOfDays;
107 BYTE Minutes;
108 BYTE Hours;
109 BYTE Hundredths;
110 BYTE Seconds;
111 } DOS_CLOCK_TRANSFER_RECORD, *PDOS_CLOCK_TRANSFER_RECORD;
112
113 typedef struct _DOS_INPUT_BUFFER
114 {
115 BYTE MaxLength;
116 BYTE Length;
117 CHAR Buffer[ANYSIZE_ARRAY];
118 } DOS_INPUT_BUFFER, *PDOS_INPUT_BUFFER;
119
120 typedef struct _DOS_FIND_FILE_BLOCK
121 {
122 CHAR DriveLetter;
123 CHAR Pattern[11];
124 UCHAR AttribMask;
125 DWORD Unused;
126 HANDLE SearchHandle;
127
128 /* The following part of the structure is documented */
129 UCHAR Attributes;
130 WORD FileTime;
131 WORD FileDate;
132 DWORD FileSize;
133 CHAR FileName[13];
134 } DOS_FIND_FILE_BLOCK, *PDOS_FIND_FILE_BLOCK;
135
136 typedef struct _DOS_SDA
137 {
138 BYTE PrinterEchoFlag;
139 CHAR CurrentSwitchChar;
140 BYTE AllocStrategy;
141 BYTE Unused0[28];
142
143 /* This is where the SDA really starts */
144 BYTE ErrorMode;
145 BYTE InDos;
146 BYTE ErrorDrive;
147 BYTE LastErrorLocus;
148 WORD LastErrorCode;
149 BYTE LastErrorAction;
150 BYTE LastErrorClass;
151 DWORD LastErrorPointer;
152 DWORD DiskTransferArea;
153 WORD CurrentPsp;
154 WORD Int23StackPointer;
155 WORD ErrorLevel;
156 BYTE CurrentDrive;
157 BYTE ExtendedBreakFlag;
158
159 /* This part is only valid while in DOS */
160 WORD LastAX;
161 WORD NetworkPsp;
162 WORD NetworkMachineNumber;
163 WORD FirstFreeMcb;
164 WORD BestFreeMcb;
165 WORD LastFreeMcb;
166 WORD MemorySize;
167 WORD LastSearchDirEntry;
168 BYTE Int24FailFlag;
169 BYTE DirectoryFlag;
170 BYTE CtrlBreakFlag;
171 BYTE AllowFcbBlanks;
172 BYTE Unused1;
173 BYTE DayOfMonth;
174 BYTE Month;
175 WORD Year;
176 WORD NumDays;
177 BYTE DayOfWeek;
178 BYTE ConsoleSwappedFlag;
179 BYTE Int28CallOk;
180 BYTE Int24AbortFlag;
181 DOS_RW_REQUEST Request;
182 DWORD DriverEntryPoint;
183 BYTE Unused2[44];
184 BYTE PspCopyType;
185 BYTE Unused3;
186 BYTE UserNumber[3];
187 BYTE OemNumber;
188 WORD ErrorCodeTable;
189 DOS_CLOCK_TRANSFER_RECORD ClockTransferRecord;
190 BYTE ByteBuffer;
191 BYTE Unused4;
192 CHAR FileNameBuffer[256];
193 BYTE Unused5[53];
194 CHAR CurrentDirectory[81];
195 CHAR FcbFilename[12];
196 CHAR FcbRenameDest[12];
197 BYTE Unused6[8];
198 BYTE ExtendedAttribute;
199 BYTE FcbType;
200 BYTE DirSearchAttributes;
201 BYTE FileOpenMode;
202 BYTE FileFound;
203 BYTE DeviceNameFound;
204 BYTE SpliceFlag;
205 BYTE DosCallFlag;
206 BYTE Unused7[5];
207 BYTE InsertMode;
208 BYTE ParsedFcbExists;
209 BYTE VolumeIDFlag;
210 BYTE TerminationType;
211 BYTE CreateFileFlag;
212 BYTE FileDeletedChar;
213 DWORD CriticalErrorDpb;
214 DWORD UserRegistersStack;
215 WORD Int24StackPointer;
216 BYTE Unused8[14];
217 DWORD DeviceHeader;
218 DWORD CurrentSft;
219 DWORD CurrentDirPointer;
220 DWORD CallerFcb;
221 WORD SftNumber;
222 WORD TempFileHandle;
223 DWORD JftEntry;
224 WORD FirstArgument;
225 WORD SecondArgument;
226 WORD LastComponent;
227 WORD TransferOffset;
228 BYTE Unused9[38];
229 DWORD WorkingSft;
230 WORD Int21CallerBX;
231 WORD Int21CallerDS;
232 WORD Unused10;
233 DWORD PrevCallFrame;
234 } DOS_SDA, *PDOS_SDA;
235
236 typedef struct _DOS_DATA
237 {
238 DOS_SYSVARS SysVars;
239 BYTE NullDriverRoutine[7];
240 WORD DosVersion; // DOS version to report to programs (can be different from the true one)
241 DOS_SDA Sda;
242 CHAR CurrentDirectories[NUM_DRIVES][DOS_DIR_LENGTH];
243 BYTE Sft[ANYSIZE_ARRAY];
244 } DOS_DATA, *PDOS_DATA;
245
246 #pragma pack(pop)
247
248 /* VARIABLES ******************************************************************/
249
250 extern BOOLEAN DoEcho;
251 extern PDOS_DATA DosData;
252 extern PDOS_SYSVARS SysVars;
253 extern PDOS_SDA Sda;
254
255 /* FUNCTIONS ******************************************************************/
256
257 extern CALLBACK16 DosContext;
258 #define RegisterDosInt32(IntNumber, IntHandler) \
259 do { \
260 DosContext.NextOffset += RegisterInt32(MAKELONG(DosContext.NextOffset, \
261 DosContext.Segment), \
262 (IntNumber), (IntHandler), NULL); \
263 } while(0);
264
265 /*
266 * DOS BIOS Functions
267 * See bios.c
268 */
269 CHAR DosReadCharacter(WORD FileHandle);
270 BOOLEAN DosCheckInput(VOID);
271 VOID DosPrintCharacter(WORD FileHandle, CHAR Character);
272
273 BOOLEAN DosBIOSInitialize(VOID);
274 VOID ConDrvInitialize(VOID);
275 VOID ConDrvCleanup(VOID);
276
277 /*
278 * DOS Kernel Functions
279 * See dos.c
280 */
281
282 BOOLEAN DosKRNLInitialize(VOID);
283
284 #endif // _DOS_H_
285
286 /* EOF */