1635c6d591f48bc1ba2a01e5037b18f47d41a948
[reactos.git] / reactos / subsystems / mvdm / ntvdm / dos / dos32krnl / device.h
1 /*
2 * COPYRIGHT: GPLv2+ - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: device.h
5 * PURPOSE: DOS Device Support
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 */
8
9 #ifndef _DEVICE_H_
10 #define _DEVICE_H_
11
12 /* DEFINITIONS ****************************************************************/
13
14 #define MAX_DEVICE_NAME 8
15
16 #define DOS_DEVATTR_STDIN (1 << 0)
17 #define DOS_DEVATTR_STDOUT (1 << 1)
18 #define DOS_DEVATTR_NUL (1 << 2)
19 #define DOS_DEVATTR_CLOCK (1 << 3)
20 #define DOS_DEVATTR_CON (1 << 4)
21 #define DOS_DEVATTR_OPENCLOSE (1 << 11)
22 #define DOS_DEVATTR_SPECIAL (1 << 13)
23 #define DOS_DEVATTR_IOCTL (1 << 14)
24 #define DOS_DEVATTR_CHARACTER (1 << 15)
25
26 #define DOS_DEVCMD_INIT 0
27 #define DOS_DEVCMD_MEDIACHK 1
28 #define DOS_DEVCMD_BUILDBPB 2
29 #define DOS_DEVCMD_IOCTL_READ 3
30 #define DOS_DEVCMD_READ 4
31 #define DOS_DEVCMD_PEEK 5
32 #define DOS_DEVCMD_INSTAT 6
33 #define DOS_DEVCMD_FLUSH_INPUT 7
34 #define DOS_DEVCMD_WRITE 8
35 #define DOS_DEVCMD_WRITE_VERIFY 9
36 #define DOS_DEVCMD_OUTSTAT 10
37 #define DOS_DEVCMD_FLUSH_OUTPUT 11
38 #define DOS_DEVCMD_IOCTL_WRITE 12
39 #define DOS_DEVCMD_OPEN 13
40 #define DOS_DEVCMD_CLOSE 14
41 #define DOS_DEVCMD_REMOVABLE 15
42 #define DOS_DEVCMD_OUTPUT_BUSY 16
43
44 #define DOS_DEVSTAT_DONE (1 << 8)
45 #define DOS_DEVSTAT_BUSY (1 << 9)
46 #define DOS_DEVSTAT_ERROR (1 << 15)
47
48 #define DOS_DEVERR_WRITE_PROTECT 0
49 #define DOS_DEVERR_UNKNOWN_UNIT 1
50 #define DOS_DEVERR_NOT_READY 2
51 #define DOS_DEVERR_UNKNOWN_COMMAND 3
52 #define DOS_DEVERR_BAD_DATA_CRC 4
53 #define DOS_DEVERR_BAD_REQUEST 5
54 #define DOS_DEVERR_INVALID_SEEK 6
55 #define DOS_DEVERR_UNKNOWN_MEDIUM 7
56 #define DOS_DEVERR_BAD_BLOCK 8
57 #define DOS_DEVERR_OUT_OF_PAPER 9
58 #define DOS_DEVERR_WRITE_FAULT 10
59 #define DOS_DEVERR_READ_FAULT 11
60 #define DOS_DEVERR_GENERAL 12
61 #define DOS_DEVERR_BAD_MEDIA_CHANGE 15
62
63 typedef struct _DOS_DEVICE_NODE DOS_DEVICE_NODE, *PDOS_DEVICE_NODE;
64
65 typedef WORD (NTAPI *PDOS_DEVICE_GENERIC_ROUTINE)(PDOS_DEVICE_NODE DeviceNode);
66
67 typedef WORD (NTAPI *PDOS_DEVICE_IO_ROUTINE)
68 (
69 PDOS_DEVICE_NODE DeviceNode,
70 DWORD Buffer,
71 PWORD Length
72 );
73
74 typedef WORD (NTAPI *PDOS_DEVICE_PEEK_ROUTINE)
75 (
76 PDOS_DEVICE_NODE DeviceNode,
77 PBYTE Character
78 );
79
80 struct _DOS_DEVICE_NODE
81 {
82 LIST_ENTRY Entry;
83 WORD DeviceAttributes;
84 ANSI_STRING Name;
85 CHAR NameBuffer[MAX_DEVICE_NAME];
86 PDOS_DEVICE_IO_ROUTINE IoctlReadRoutine;
87 PDOS_DEVICE_IO_ROUTINE ReadRoutine;
88 PDOS_DEVICE_PEEK_ROUTINE PeekRoutine;
89 PDOS_DEVICE_GENERIC_ROUTINE InputStatusRoutine;
90 PDOS_DEVICE_GENERIC_ROUTINE FlushInputRoutine;
91 PDOS_DEVICE_IO_ROUTINE IoctlWriteRoutine;
92 PDOS_DEVICE_IO_ROUTINE WriteRoutine;
93 PDOS_DEVICE_GENERIC_ROUTINE OutputStatusRoutine;
94 PDOS_DEVICE_GENERIC_ROUTINE FlushOutputRoutine;
95 PDOS_DEVICE_GENERIC_ROUTINE OpenRoutine;
96 PDOS_DEVICE_GENERIC_ROUTINE CloseRoutine;
97 PDOS_DEVICE_IO_ROUTINE OutputUntilBusyRoutine;
98 DWORD Driver;
99 };
100
101 #pragma pack(push, 1)
102
103 typedef struct _DOS_DRIVER
104 {
105 DWORD Link;
106 WORD DeviceAttributes;
107 WORD StrategyRoutine;
108 WORD InterruptRoutine;
109
110 union
111 {
112 CHAR DeviceName[MAX_DEVICE_NAME]; // for character devices
113
114 struct // for block devices
115 {
116 BYTE UnitCount;
117 BYTE Reserved[MAX_DEVICE_NAME - 1];
118 };
119 };
120 } DOS_DRIVER, *PDOS_DRIVER;
121
122 typedef struct _DOS_REQUEST_HEADER
123 {
124 IN BYTE RequestLength;
125 IN BYTE UnitNumber OPTIONAL;
126 IN BYTE CommandCode;
127 OUT WORD Status;
128
129 BYTE Reserved[8];
130 } DOS_REQUEST_HEADER, *PDOS_REQUEST_HEADER;
131
132 typedef struct _DOS_INIT_REQUEST
133 {
134 DOS_REQUEST_HEADER Header;
135
136 OUT BYTE UnitsInitialized;
137 OUT DWORD ReturnBreakAddress;
138
139 union
140 {
141 IN DWORD DeviceString; // for character devices
142
143 struct // for block devices
144 {
145 IN BYTE FirstDriveLetter;
146 OUT DWORD BpbPointer;
147 };
148 };
149
150 } DOS_INIT_REQUEST, *PDOS_INIT_REQUEST;
151
152 typedef struct _DOS_IOCTL_RW_REQUEST
153 {
154 DOS_REQUEST_HEADER Header;
155
156 IN BYTE MediaDescriptorByte OPTIONAL;
157 IN DWORD BufferPointer;
158 IN OUT WORD Length;
159 IN WORD StartingBlock OPTIONAL;
160 } DOS_IOCTL_RW_REQUEST, *PDOS_IOCTL_RW_REQUEST;
161
162 typedef struct _DOS_RW_REQUEST
163 {
164 DOS_REQUEST_HEADER Header;
165
166 IN BYTE MediaDescriptorByte OPTIONAL;
167 IN DWORD BufferPointer;
168 IN OUT WORD Length;
169 IN WORD StartingBlock OPTIONAL;
170 OUT DWORD VolumeLabelPtr OPTIONAL;
171 } DOS_RW_REQUEST, *PDOS_RW_REQUEST;
172
173 typedef struct _DOS_PEEK_REQUEST
174 {
175 DOS_REQUEST_HEADER Header;
176 OUT BYTE Character;
177 } DOS_PEEK_REQUEST, *PDOS_PEEK_REQUEST;
178
179 typedef struct _DOS_OUTPUT_BUSY_REQUEST
180 {
181 DOS_REQUEST_HEADER Header;
182
183 IN DWORD BufferPointer;
184 IN OUT WORD Length;
185 } DOS_OUTPUT_BUSY_REQUEST, *PDOS_OUTPUT_BUSY_REQUEST;
186
187 #pragma pack(pop)
188
189 /* FUNCTIONS ******************************************************************/
190
191 PDOS_DEVICE_NODE DosGetDevice(LPCSTR DeviceName);
192 PDOS_DEVICE_NODE DosCreateDevice(WORD Attributes, PCHAR DeviceName);
193 VOID DosDeleteDevice(PDOS_DEVICE_NODE DeviceNode);
194
195 #endif // _DEVICE_H_
196
197 /* EOF */