[NTVDM]
[reactos.git] / subsystems / ntvdm / dos.h
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: dos.h
5 * PURPOSE: VDM DOS Kernel (header file)
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 /* DEFINES ********************************************************************/
17
18 #define DOS_VERSION MAKEWORD(6, 0)
19 #define DOS_CONFIG_PATH L"%SystemRoot%\\system32\\CONFIG.NT"
20 #define DOS_COMMAND_INTERPRETER L"%SystemRoot%\\system32\\COMMAND.COM /k %SystemRoot%\\system32\\AUTOEXEC.NT"
21 #define FIRST_MCB_SEGMENT 0x1000
22 #define USER_MEMORY_SIZE 0x8FFE
23 #define SYSTEM_PSP 0x08
24 #define SYSTEM_ENV_BLOCK 0x800
25 #define INVALID_DOS_HANDLE 0xFFFF
26 #define DOS_INPUT_HANDLE 0
27 #define DOS_OUTPUT_HANDLE 1
28 #define DOS_ERROR_HANDLE 2
29 #define DOS_SFT_SIZE 255
30 #define SEGMENT_TO_MCB(seg) ((PDOS_MCB)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), 0)))
31 #define SEGMENT_TO_PSP(seg) ((PDOS_PSP)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), 0)))
32 #define UMB_START_SEGMENT 0xC000
33 #define UMB_END_SEGMENT 0xDFFF
34 #define DOS_ALLOC_HIGH 0x40
35 #define DOS_ALLOC_HIGH_LOW 0x80
36 #define DOS_CMDLINE_LENGTH 127
37 #define DOS_DIR_LENGTH 64
38 #define NUM_DRIVES ('Z' - 'A' + 1)
39
40 enum DOS_ALLOC_STRATEGY
41 {
42 DOS_ALLOC_FIRST_FIT,
43 DOS_ALLOC_BEST_FIT,
44 DOS_ALLOC_LAST_FIT
45 };
46
47 #pragma pack(push, 1)
48
49 typedef struct _DOS_MCB
50 {
51 CHAR BlockType;
52 WORD OwnerPsp;
53 WORD Size;
54 BYTE Unused[3];
55 CHAR Name[8];
56 } DOS_MCB, *PDOS_MCB;
57
58 typedef struct _DOS_FCB
59 {
60 BYTE DriveNumber;
61 CHAR FileName[8];
62 CHAR FileExt[3];
63 WORD BlockNumber;
64 WORD RecordSize;
65 DWORD FileSize;
66 WORD LastWriteDate;
67 WORD LastWriteTime;
68 BYTE Reserved[8];
69 BYTE BlockRecord;
70 BYTE RecordNumber[3];
71 } DOS_FCB, *PDOS_FCB;
72
73 typedef struct _DOS_PSP
74 {
75 BYTE Exit[2];
76 WORD LastParagraph;
77 BYTE Reserved0[6];
78 DWORD TerminateAddress;
79 DWORD BreakAddress;
80 DWORD CriticalAddress;
81 WORD ParentPsp;
82 BYTE HandleTable[20];
83 WORD EnvBlock;
84 DWORD LastStack;
85 WORD HandleTableSize;
86 DWORD HandleTablePtr;
87 DWORD PreviousPsp;
88 DWORD Reserved1;
89 WORD DosVersion;
90 BYTE Reserved2[14];
91 BYTE FarCall[3];
92 BYTE Reserved3[9];
93 DOS_FCB Fcb;
94 BYTE CommandLineSize;
95 CHAR CommandLine[DOS_CMDLINE_LENGTH];
96 } DOS_PSP, *PDOS_PSP;
97
98 typedef struct _DOS_INPUT_BUFFER
99 {
100 BYTE MaxLength, Length;
101 CHAR Buffer[ANYSIZE_ARRAY];
102 } DOS_INPUT_BUFFER, *PDOS_INPUT_BUFFER;
103
104 typedef struct _DOS_DRIVER_HEADER
105 {
106 DWORD NextDriver;
107 WORD Attributes;
108 WORD StrategyEntry;
109 WORD InterruptEntry;
110 CHAR DeviceName[8];
111 } DOS_DRIVER_HEADER, *PDOS_DRIVER_HEADER;
112
113 #pragma pack(pop)
114
115 /* FUNCTIONS ******************************************************************/
116
117 WORD DosAllocateMemory(WORD Size, WORD *MaxAvailable);
118 BOOLEAN DosResizeMemory(WORD BlockData, WORD NewSize, WORD *MaxAvailable);
119 BOOLEAN DosFreeMemory(WORD BlockData);
120 WORD DosCreateFile(LPWORD Handle, LPCSTR FilePath, WORD Attributes);
121 WORD DosOpenFile(LPWORD Handle, LPCSTR FilePath, BYTE AccessMode);
122 WORD DosReadFile(WORD FileHandle, LPVOID Buffer, WORD Count, LPWORD BytesRead);
123 WORD DosWriteFile(WORD FileHandle, LPVOID Buffer, WORD Count, LPWORD BytesWritten);
124 WORD DosSeekFile(WORD FileHandle, LONG Offset, BYTE Origin, LPDWORD NewOffset);
125 BOOLEAN DosDuplicateHandle(WORD OldHandle, WORD NewHandle);
126 BOOLEAN DosCloseHandle(WORD DosHandle);
127 VOID DosInitializePsp(WORD PspSegment, LPCSTR CommandLine, WORD ProgramSize, WORD Environment);
128 BOOLEAN DosCreateProcess(LPCSTR CommandLine, WORD EnvBlock);
129 VOID DosTerminateProcess(WORD Psp, BYTE ReturnCode);
130 CHAR DosReadCharacter(VOID);
131 VOID DosPrintCharacter(CHAR Character);
132 BOOLEAN DosHandleIoctl(BYTE ControlCode, WORD FileHandle);
133 VOID DosInt20h(LPWORD Stack);
134 VOID DosInt21h(LPWORD Stack);
135 VOID DosBreakInterrupt(LPWORD Stack);
136 BOOLEAN DosInitialize(VOID);
137
138 #endif // _DOS_H_
139
140 /* EOF */