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