Merge the following revisions from kernel-fun branch:
[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 "ntvdm.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
34 #define INVALID_DOS_HANDLE 0xFFFF
35 #define DOS_INPUT_HANDLE 0
36 #define DOS_OUTPUT_HANDLE 1
37 #define DOS_ERROR_HANDLE 2
38
39 #define DOS_SFT_SIZE 255
40 #define SEGMENT_TO_MCB(seg) ((PDOS_MCB)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), 0)))
41 #define SEGMENT_TO_PSP(seg) ((PDOS_PSP)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), 0)))
42 #define UMB_START_SEGMENT 0xC000
43 #define UMB_END_SEGMENT 0xDFFF
44 #define DOS_ALLOC_HIGH 0x40
45 #define DOS_ALLOC_HIGH_LOW 0x80
46 #define DOS_CMDLINE_LENGTH 127
47 #define DOS_DIR_LENGTH 64
48 #define NUM_DRIVES ('Z' - 'A' + 1)
49 #define DOS_CHAR_ATTRIBUTE 0x07
50 #define DOS_PROGRAM_NAME_TAG 0x0001
51
52 enum DOS_ALLOC_STRATEGY
53 {
54 DOS_ALLOC_FIRST_FIT,
55 DOS_ALLOC_BEST_FIT,
56 DOS_ALLOC_LAST_FIT
57 };
58
59 typedef enum
60 {
61 DOS_LOAD_AND_EXECUTE = 0x00,
62 DOS_LOAD_ONLY = 0x01,
63 DOS_LOAD_OVERLAY = 0x03
64 } DOS_EXEC_TYPE;
65
66 #pragma pack(push, 1)
67
68 typedef struct _DOS_MCB
69 {
70 CHAR BlockType;
71 WORD OwnerPsp;
72 WORD Size;
73 BYTE Unused[3];
74 CHAR Name[8];
75 } DOS_MCB, *PDOS_MCB;
76
77 typedef struct _DOS_FCB
78 {
79 BYTE DriveNumber;
80 CHAR FileName[8];
81 CHAR FileExt[3];
82 WORD BlockNumber;
83 WORD RecordSize;
84 DWORD FileSize;
85 WORD LastWriteDate;
86 WORD LastWriteTime;
87 BYTE Reserved[8];
88 BYTE BlockRecord;
89 BYTE RecordNumber[3];
90 } DOS_FCB, *PDOS_FCB;
91
92 typedef struct _DOS_PSP
93 {
94 BYTE Exit[2];
95 WORD LastParagraph;
96 BYTE Reserved0[6];
97 DWORD TerminateAddress;
98 DWORD BreakAddress;
99 DWORD CriticalAddress;
100 WORD ParentPsp;
101 BYTE HandleTable[20];
102 WORD EnvBlock;
103 DWORD LastStack;
104 WORD HandleTableSize;
105 DWORD HandleTablePtr;
106 DWORD PreviousPsp;
107 DWORD Reserved1;
108 WORD DosVersion;
109 BYTE Reserved2[14];
110 BYTE FarCall[3];
111 BYTE Reserved3[9];
112 DOS_FCB Fcb;
113 BYTE CommandLineSize;
114 CHAR CommandLine[DOS_CMDLINE_LENGTH];
115 } DOS_PSP, *PDOS_PSP;
116
117 typedef struct _DOS_INPUT_BUFFER
118 {
119 BYTE MaxLength;
120 BYTE Length;
121 CHAR Buffer[ANYSIZE_ARRAY];
122 } DOS_INPUT_BUFFER, *PDOS_INPUT_BUFFER;
123
124 typedef struct _DOS_DRIVER_HEADER
125 {
126 DWORD NextDriver;
127 WORD Attributes;
128 WORD StrategyEntry;
129 WORD InterruptEntry;
130 CHAR DeviceName[8];
131 } DOS_DRIVER_HEADER, *PDOS_DRIVER_HEADER;
132
133 typedef struct _DOS_FIND_FILE_BLOCK
134 {
135 CHAR DriveLetter;
136 CHAR Pattern[11];
137 UCHAR AttribMask;
138 DWORD Unused;
139 HANDLE SearchHandle;
140
141 /* The following part of the structure is documented */
142 UCHAR Attributes;
143 WORD FileTime;
144 WORD FileDate;
145 DWORD FileSize;
146 CHAR FileName[13];
147 } DOS_FIND_FILE_BLOCK, *PDOS_FIND_FILE_BLOCK;
148
149 typedef struct _DOS_EXEC_PARAM_BLOCK
150 {
151 /* Input variables */
152 WORD Environment;
153 DWORD CommandLine;
154 DWORD FirstFcb;
155 DWORD SecondFcb;
156
157 /* Output variables */
158 DWORD StackLocation;
159 DWORD EntryPoint;
160 } DOS_EXEC_PARAM_BLOCK, *PDOS_EXEC_PARAM_BLOCK;
161
162 typedef struct _DOS_COUNTRY_CODE_BUFFER
163 {
164 WORD TimeFormat;
165 WORD CurrencySymbol;
166 WORD ThousandSep;
167 WORD DecimalSep;
168 } DOS_COUNTRY_CODE_BUFFER, *PDOS_COUNTRY_CODE_BUFFER;
169
170 #pragma pack(pop)
171
172 extern BOOLEAN DoEcho;
173
174 /* FUNCTIONS ******************************************************************/
175
176 extern CALLBACK16 DosContext;
177 #define RegisterDosInt32(IntNumber, IntHandler) \
178 do { \
179 DosContext.NextOffset += RegisterInt32(MAKELONG(DosContext.NextOffset, \
180 DosContext.Segment), \
181 (IntNumber), (IntHandler), NULL); \
182 } while(0);
183
184 /*
185 * DOS BIOS Functions
186 * See bios.c
187 */
188 CHAR DosReadCharacter(WORD FileHandle);
189 BOOLEAN DosCheckInput(VOID);
190 VOID DosPrintCharacter(WORD FileHandle, CHAR Character);
191
192 BOOLEAN DosBIOSInitialize(VOID);
193
194
195 /*
196 * DOS Kernel Functions
197 * See dos.c
198 */
199 BOOL IsConsoleHandle(HANDLE hHandle);
200 WORD DosOpenHandle(HANDLE Handle);
201 HANDLE DosGetRealHandle(WORD DosHandle);
202
203 WORD DosCreateFileEx(LPWORD Handle,
204 LPWORD CreationStatus,
205 LPCSTR FilePath,
206 BYTE AccessShareModes,
207 WORD CreateActionFlags,
208 WORD Attributes);
209 WORD DosCreateFile(LPWORD Handle,
210 LPCSTR FilePath,
211 DWORD CreationDisposition,
212 WORD Attributes);
213 WORD DosOpenFile(LPWORD Handle,
214 LPCSTR FilePath,
215 BYTE AccessShareModes);
216 WORD DosReadFile(WORD FileHandle,
217 LPVOID Buffer,
218 WORD Count,
219 LPWORD BytesRead);
220 WORD DosWriteFile(WORD FileHandle,
221 LPVOID Buffer,
222 WORD Count,
223 LPWORD BytesWritten);
224 WORD DosSeekFile(WORD FileHandle,
225 LONG Offset,
226 BYTE Origin,
227 LPDWORD NewOffset);
228 BOOL DosFlushFileBuffers(WORD FileHandle);
229
230 VOID DosInitializePsp(WORD PspSegment, LPCSTR CommandLine, WORD ProgramSize, WORD Environment);
231 DWORD DosLoadExecutable(
232 IN DOS_EXEC_TYPE LoadType,
233 IN LPCSTR ExecutablePath,
234 IN LPCSTR CommandLine,
235 IN LPCSTR Environment OPTIONAL,
236 OUT PDWORD StackLocation OPTIONAL,
237 OUT PDWORD EntryPoint OPTIONAL
238 );
239 WORD DosCreateProcess(
240 DOS_EXEC_TYPE LoadType,
241 LPCSTR ProgramName,
242 PDOS_EXEC_PARAM_BLOCK Parameters
243 );
244 DWORD DosStartProcess(
245 IN LPCSTR ExecutablePath,
246 IN LPCSTR CommandLine,
247 IN LPCSTR Environment OPTIONAL
248 );
249 VOID DosTerminateProcess(WORD Psp, BYTE ReturnCode);
250 BOOLEAN DosHandleIoctl(BYTE ControlCode, WORD FileHandle);
251
252 BOOLEAN DosKRNLInitialize(VOID);
253
254 #endif // _DOS_H_
255
256 /* EOF */