2 * COPYRIGHT: GPLv2+ - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: DOS Device Support
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
12 /* DEFINITIONS ****************************************************************/
14 #define MAX_DEVICE_NAME 8
15 #define DEVICE_CODE_SIZE 10
16 #define DEVICE_PRIVATE_AREA(Driver) (Driver + sizeof(DOS_DRIVER) + DEVICE_CODE_SIZE)
18 #define BOP_DRV_STRATEGY 0x42
19 #define BOP_DRV_INTERRUPT 0x43
21 #define DOS_DEVATTR_STDIN (1 << 0)
22 #define DOS_DEVATTR_STDOUT (1 << 1)
23 #define DOS_DEVATTR_NUL (1 << 2)
24 #define DOS_DEVATTR_CLOCK (1 << 3)
25 #define DOS_DEVATTR_CON (1 << 4)
26 #define DOS_DEVATTR_OPENCLOSE (1 << 11)
27 #define DOS_DEVATTR_SPECIAL (1 << 13)
28 #define DOS_DEVATTR_IOCTL (1 << 14)
29 #define DOS_DEVATTR_CHARACTER (1 << 15)
31 #define DOS_DEVCMD_INIT 0
32 #define DOS_DEVCMD_MEDIACHK 1
33 #define DOS_DEVCMD_BUILDBPB 2
34 #define DOS_DEVCMD_IOCTL_READ 3
35 #define DOS_DEVCMD_READ 4
36 #define DOS_DEVCMD_PEEK 5
37 #define DOS_DEVCMD_INSTAT 6
38 #define DOS_DEVCMD_FLUSH_INPUT 7
39 #define DOS_DEVCMD_WRITE 8
40 #define DOS_DEVCMD_WRITE_VERIFY 9
41 #define DOS_DEVCMD_OUTSTAT 10
42 #define DOS_DEVCMD_FLUSH_OUTPUT 11
43 #define DOS_DEVCMD_IOCTL_WRITE 12
44 #define DOS_DEVCMD_OPEN 13
45 #define DOS_DEVCMD_CLOSE 14
46 #define DOS_DEVCMD_REMOVABLE 15
47 #define DOS_DEVCMD_OUTPUT_BUSY 16
49 #define DOS_DEVSTAT_DONE (1 << 8)
50 #define DOS_DEVSTAT_BUSY (1 << 9)
51 #define DOS_DEVSTAT_ERROR (1 << 15)
53 #define DOS_DEVERR_WRITE_PROTECT 0
54 #define DOS_DEVERR_UNKNOWN_UNIT 1
55 #define DOS_DEVERR_NOT_READY 2
56 #define DOS_DEVERR_UNKNOWN_COMMAND 3
57 #define DOS_DEVERR_BAD_DATA_CRC 4
58 #define DOS_DEVERR_BAD_REQUEST 5
59 #define DOS_DEVERR_INVALID_SEEK 6
60 #define DOS_DEVERR_UNKNOWN_MEDIUM 7
61 #define DOS_DEVERR_BAD_BLOCK 8
62 #define DOS_DEVERR_OUT_OF_PAPER 9
63 #define DOS_DEVERR_WRITE_FAULT 10
64 #define DOS_DEVERR_READ_FAULT 11
65 #define DOS_DEVERR_GENERAL 12
66 #define DOS_DEVERR_BAD_MEDIA_CHANGE 15
68 typedef struct _DOS_DEVICE_NODE DOS_DEVICE_NODE
, *PDOS_DEVICE_NODE
;
70 typedef WORD (NTAPI
*PDOS_DEVICE_GENERIC_ROUTINE
)(PDOS_DEVICE_NODE DeviceNode
);
72 typedef WORD (NTAPI
*PDOS_DEVICE_IO_ROUTINE
)
74 PDOS_DEVICE_NODE DeviceNode
,
79 typedef WORD (NTAPI
*PDOS_DEVICE_PEEK_ROUTINE
)
81 PDOS_DEVICE_NODE DeviceNode
,
85 struct _DOS_DEVICE_NODE
89 WORD DeviceAttributes
;
91 CHAR NameBuffer
[MAX_DEVICE_NAME
];
92 PDOS_DEVICE_IO_ROUTINE IoctlReadRoutine
;
93 PDOS_DEVICE_IO_ROUTINE ReadRoutine
;
94 PDOS_DEVICE_PEEK_ROUTINE PeekRoutine
;
95 PDOS_DEVICE_GENERIC_ROUTINE InputStatusRoutine
;
96 PDOS_DEVICE_GENERIC_ROUTINE FlushInputRoutine
;
97 PDOS_DEVICE_IO_ROUTINE IoctlWriteRoutine
;
98 PDOS_DEVICE_IO_ROUTINE WriteRoutine
;
99 PDOS_DEVICE_GENERIC_ROUTINE OutputStatusRoutine
;
100 PDOS_DEVICE_GENERIC_ROUTINE FlushOutputRoutine
;
101 PDOS_DEVICE_GENERIC_ROUTINE OpenRoutine
;
102 PDOS_DEVICE_GENERIC_ROUTINE CloseRoutine
;
103 PDOS_DEVICE_IO_ROUTINE OutputUntilBusyRoutine
;
106 #pragma pack(push, 1)
108 typedef struct _DOS_DRIVER
111 WORD DeviceAttributes
;
112 WORD StrategyRoutine
;
113 WORD InterruptRoutine
;
117 CHAR DeviceName
[MAX_DEVICE_NAME
]; // for character devices
119 struct // for block devices
122 BYTE Reserved
[MAX_DEVICE_NAME
- 1];
125 } DOS_DRIVER
, *PDOS_DRIVER
;
127 typedef struct _DOS_REQUEST_HEADER
129 IN BYTE RequestLength
;
130 IN BYTE UnitNumber OPTIONAL
;
135 } DOS_REQUEST_HEADER
, *PDOS_REQUEST_HEADER
;
137 typedef struct _DOS_INIT_REQUEST
139 DOS_REQUEST_HEADER Header
;
141 OUT BYTE UnitsInitialized
;
142 OUT DWORD ReturnBreakAddress
;
146 IN DWORD DeviceString
; // for character devices
148 struct // for block devices
150 IN BYTE FirstDriveLetter
;
151 OUT DWORD BpbPointer
;
155 } DOS_INIT_REQUEST
, *PDOS_INIT_REQUEST
;
157 typedef struct _DOS_IOCTL_RW_REQUEST
159 DOS_REQUEST_HEADER Header
;
161 IN BYTE MediaDescriptorByte OPTIONAL
;
162 IN DWORD BufferPointer
;
164 IN WORD StartingBlock OPTIONAL
;
165 } DOS_IOCTL_RW_REQUEST
, *PDOS_IOCTL_RW_REQUEST
;
167 typedef struct _DOS_RW_REQUEST
169 DOS_REQUEST_HEADER Header
;
171 IN BYTE MediaDescriptorByte OPTIONAL
;
172 IN DWORD BufferPointer
;
174 IN WORD StartingBlock OPTIONAL
;
175 OUT DWORD VolumeLabelPtr OPTIONAL
;
176 } DOS_RW_REQUEST
, *PDOS_RW_REQUEST
;
178 typedef struct _DOS_PEEK_REQUEST
180 DOS_REQUEST_HEADER Header
;
182 } DOS_PEEK_REQUEST
, *PDOS_PEEK_REQUEST
;
184 typedef struct _DOS_OUTPUT_BUSY_REQUEST
186 DOS_REQUEST_HEADER Header
;
188 IN DWORD BufferPointer
;
190 } DOS_OUTPUT_BUSY_REQUEST
, *PDOS_OUTPUT_BUSY_REQUEST
;
194 /* FUNCTIONS ******************************************************************/
196 PDOS_DEVICE_NODE
DosGetDriverNode(DWORD Driver
);
197 PDOS_DEVICE_NODE
DosGetDevice(LPCSTR DeviceName
);
198 PDOS_DEVICE_NODE
DosCreateDevice(WORD Attributes
, PCHAR DeviceName
);
199 PDOS_DEVICE_NODE DosCreateDeviceEx
205 VOID
DosDeleteDevice(PDOS_DEVICE_NODE DeviceNode
);
206 VOID
DeviceStrategyBop(VOID
);
207 VOID
DeviceInterruptBop(VOID
);
208 DWORD
DosLoadDriver(LPCSTR DriverFile
);