2 * Copyright (c) 1992, 1993, 1996
3 * Berkeley Software Design, Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by Berkeley Software
18 * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * BSDI dos.h,v 2.2 1996/04/08 19:32:28 bostic Exp
32 * $FreeBSD: src/usr.bin/doscmd/dos.h,v 1.2.2.1 2002/04/25 11:04:51 tg Exp $
33 * $DragonFly: src/usr.bin/doscmd/dos.h,v 1.2 2003/06/17 06:29:25 dillon Exp $
39 /* MS-DOS version 2 error codes */
40 #define FUNC_NUM_IVALID 0x01
41 #define FILE_NOT_FOUND 0x02
42 #define PATH_NOT_FOUND 0x03
43 #define TOO_MANY_OPEN_FILES 0x04
44 #define ACCESS_DENIED 0x05
45 #define HANDLE_INVALID 0x06
46 #define MEM_CB_DEST 0x07
47 #define INSUF_MEM 0x08
48 #define MEM_BLK_ADDR_IVALID 0x09
49 #define ENV_INVALID 0x0a
50 #define FORMAT_INVALID 0x0b
51 #define ACCESS_CODE_INVALID 0x0c
52 #define DATA_INVALID 0x0d
53 #define UNKNOWN_UNIT 0x0e
54 #define DISK_DRIVE_INVALID 0x0f
55 #define ATT_REM_CUR_DIR 0x10
56 #define NOT_SAME_DEV 0x11
57 #define NO_MORE_FILES 0x12
58 /* mappings to critical-error codes */
59 #define WRITE_PROT_DISK 0x13
60 #define UNKNOWN_UNIT_CERR 0x14
61 #define DRIVE_NOT_READY 0x15
62 #define UNKNOWN_COMMAND 0x16
63 #define DATA_ERROR_CRC 0x17
64 #define BAD_REQ_STRUCT_LEN 0x18
65 #define SEEK_ERROR 0x19
66 #define UNKNOWN_MEDIA_TYPE 0x1a
67 #define SECTOR_NOT_FOUND 0x1b
68 #define PRINTER_OUT_OF_PAPER 0x1c
69 #define WRITE_FAULT 0x1d
70 #define READ_FAULT 0x1e
71 #define GENERAL_FAILURE 0x1f
73 /* MS-DOS version 3 and later extended error codes */
74 #define SHARING_VIOLATION 0x20
75 #define FILE_LOCK_VIOLATION 0x21
76 #define DISK_CHANGE_INVALID 0x22
77 #define FCB_UNAVAILABLE 0x23
78 #define SHARING_BUF_EXCEEDED 0x24
80 #define NETWORK_NAME_NOT_FOUND 0x35
82 #define FILE_ALREADY_EXISTS 0x50
84 #define DUPLICATE_REDIR 0x55
87 * dos attribute byte flags
89 #define REGULAR_FILE 0x00
90 #define READ_ONLY_FILE 0x01
91 #define HIDDEN_FILE 0x02
92 #define SYSTEM_FILE 0x04
93 #define VOLUME_LABEL 0x08
94 #define DIRECTORY 0x10
95 #define ARCHIVE_NEEDED 0x20
98 * Internal structure used for get_space()
102 long sectors_cluster
;
108 * Several DOS structures used by the file redirector
114 u_char searchdir
[1024];
118 * This is really the format of the DTA. The file redirector will only
119 * use the first 21 bytes.
122 u_char drive
__attribute__ ((packed
));
123 u_char pattern
[11] __attribute__ ((packed
));
124 u_char flag
__attribute__ ((packed
));
125 u_char reserved1
[4] __attribute__ ((packed
));
126 search_t
*searchptr
__attribute__ ((packed
));
127 u_char attr
__attribute__ ((packed
));
128 u_short time
__attribute__ ((packed
));
129 u_short date
__attribute__ ((packed
));
130 u_long size
__attribute__ ((packed
));
131 u_char name
[13] __attribute__ ((packed
));
132 }/* __attribute__((__packed__))*/ find_block_t
;
135 * DOS directory entry structure
138 u_char name
[8] __attribute__ ((packed
));
139 u_char ext
[3] __attribute__ ((packed
));
140 u_char attr
__attribute__ ((packed
));
141 u_char reserved
[10] __attribute__ ((packed
));
142 u_short time
__attribute__ ((packed
));
143 u_short date
__attribute__ ((packed
));
144 u_short start
__attribute__ ((packed
));
145 u_long size
__attribute__ ((packed
));
149 * The Current Drive Structure
152 u_char path
[0x43] __attribute__ ((packed
));
153 u_short flag
__attribute__ ((packed
));
154 u_short dpb_off
__attribute__ ((packed
));
155 u_short dpb_seg
__attribute__ ((packed
));
156 u_short redirector_off
__attribute__ ((packed
));
157 u_short redirector_seg
__attribute__ ((packed
));
158 u_char paramter_int21
[2] __attribute__ ((packed
));
159 u_short offset
__attribute__ ((packed
));
160 u_char dummy
__attribute__ ((packed
));
161 u_char ifs_driver
[4] __attribute__ ((packed
));
162 u_char dummy2
[2] __attribute__ ((packed
));
163 }/* __attribute__((__packed__))*/ CDS
;
165 #define CDS_remote 0x8000
166 #define CDS_ready 0x4000
167 #define CDS_joined 0x2000
168 #define CDS_substed 0x1000
170 #define CDS_notnet 0x0080
173 * The List of Lists (used to get the CDS and a few other numbers)
176 u_char dummy1
[0x16] __attribute__ ((packed
));
177 u_short cds_offset
__attribute__ ((packed
));
178 u_short cds_seg
__attribute__ ((packed
));
179 u_char dummy2
[6] __attribute__ ((packed
));
180 u_char numberbdev
__attribute__ ((packed
));
181 u_char lastdrive
__attribute__ ((packed
));
185 * The System File Table
188 /*00*/ u_short nfiles
__attribute__ ((packed
)); /* Number file handles referring to this file */
189 /*02*/ u_short open_mode
__attribute__ ((packed
)); /* Open mode (bit 15 -> by FCB) */
190 /*04*/ u_char attribute
__attribute__ ((packed
));
191 /*05*/ u_short info
__attribute__ ((packed
)); /* 15 -> remote, 14 -> dont set date */
192 /*07*/ u_char ddr_dpb
[4] __attribute__ ((packed
)); /* Device Driver Header/Drive Paramter Block */
193 /*0b*/ u_short fd
__attribute__ ((packed
));
194 /*0d*/ u_short time
__attribute__ ((packed
));
195 /*0f*/ u_short date
__attribute__ ((packed
));
196 /*11*/ u_long size
__attribute__ ((packed
));
197 /*15*/ u_long offset
__attribute__ ((packed
));
198 /*19*/ u_short rel_cluster
__attribute__ ((packed
));
199 /*1b*/ u_short abs_cluster
__attribute__ ((packed
));
200 /*1d*/ u_char dir_sector
[2] __attribute__ ((packed
));
201 /*1f*/ u_char dir_entry
__attribute__ ((packed
));
202 /*20*/ u_char name
[8] __attribute__ ((packed
));
203 /*28*/ u_char ext
[3] __attribute__ ((packed
));
204 /*2b*/ u_char sharesft
[4] __attribute__ ((packed
));
205 /*2f*/ u_char sharenet
[2] __attribute__ ((packed
));
206 /*31*/ u_short psp
__attribute__ ((packed
));
207 /*33*/ u_char share_off
[2] __attribute__ ((packed
));
208 /*35*/ u_char local_end
[2] __attribute__ ((packed
));
209 /*37*/ u_char ifd_driver
[4] __attribute__ ((packed
));
210 } /*__attribute__((__packed__))*/ SFT
;
213 * Format of PCDOS 4.01 swappable data area
214 * (Sorry, but you need a wide screen to make this look nice)
217 u_char err_crit
__attribute__ ((packed
)); /* 00h BYTE critical error flag */
218 u_char InDOS
__attribute__ ((packed
)); /* 01h BYTE InDOS flag (count of active INT 21 calls) */
219 u_char err_drive
__attribute__ ((packed
)); /* 02h BYTE ??? drive number or FFh */
220 u_char err_locus
__attribute__ ((packed
)); /* 03h BYTE locus of last error */
221 u_short err_code
__attribute__ ((packed
)); /* 04h WORD extended error code of last error */
222 u_char err_suggest
__attribute__ ((packed
)); /* 06h BYTE suggested action for last error */
223 u_char err_class
__attribute__ ((packed
)); /* 07h BYTE class of last error */
224 u_short err_di
__attribute__ ((packed
));
225 u_short err_es
__attribute__ ((packed
)); /* 08h DWORD ES:DI pointer for last error */
226 u_short dta_off
__attribute__ ((packed
));
227 u_short dta_seg
__attribute__ ((packed
)); /* 0Ch DWORD current DTA */
228 u_short psp
__attribute__ ((packed
)); /* 10h WORD current PSP */
229 u_short int_23_sp
__attribute__ ((packed
)); /* 12h WORD stores SP across an INT 23 */
230 u_short wait_status
__attribute__ ((packed
)); /* 14h WORD return code from last process termination (zerod after reading with AH=4Dh) */
231 u_char current_drive
__attribute__ ((packed
)); /* 16h BYTE current drive */
232 u_char break_flag
__attribute__ ((packed
)); /* 17h BYTE extended break flag */
233 u_char unknown1
[2] __attribute__ ((packed
)); /* 18h 2 BYTEs ??? */
234 u_short int_21_ax
__attribute__ ((packed
)); /* 1Ah WORD value of AX on call to INT 21 */
235 u_short net_psp
__attribute__ ((packed
)); /* 1Ch WORD PSP segment for sharing/network */
236 u_short net_number
__attribute__ ((packed
)); /* 1Eh WORD network machine number for sharing/network (0000h = us) */
237 u_short first_mem
__attribute__ ((packed
)); /* 20h WORD first usable memory block found when allocating memory */
238 u_short best_mem
__attribute__ ((packed
)); /* 22h WORD best usable memory block found when allocating memory */
239 u_short last_mem
__attribute__ ((packed
)); /* 24h WORD last usable memory block found when allocating memory */
240 u_char unknown
[10] __attribute__ ((packed
)); /* 26h 2 BYTEs ??? (don't seem to be referenced) */
241 u_char monthday
__attribute__ ((packed
)); /* 30h BYTE day of month */
242 u_char month
__attribute__ ((packed
)); /* 31h BYTE month */
243 u_short year
__attribute__ ((packed
)); /* 32h WORD year - 1980 */
244 u_short days
__attribute__ ((packed
)); /* 34h WORD number of days since 1-1-1980 */
245 u_char weekday
__attribute__ ((packed
)); /* 36h BYTE day of week (0 = Sunday) */
246 u_char unknown2
[3] __attribute__ ((packed
)); /* 37h BYTE ??? */
247 u_char ddr_head
[30] __attribute__ ((packed
)); /* 38h 30 BYTEs device driver request header */
248 u_short ddre_ip
__attribute__ ((packed
));
249 u_short ddre_cs
__attribute__ ((packed
)); /* 58h DWORD pointer to device driver entry point (used in calling driver) */
250 u_char ddr_head2
[22] __attribute__ ((packed
)); /* 5Ch 22 BYTEs device driver request header */
251 u_char ddr_head3
[30] __attribute__ ((packed
)); /* 72h 30 BYTEs device driver request header */
252 u_char unknown3
[6] __attribute__ ((packed
)); /* 90h 6 BYTEs ??? */
253 u_char clock_xfer
[6] __attribute__ ((packed
)); /* 96h 6 BYTEs CLOCK$ transfer record (see AH=52h) */
254 u_char unknown4
[2] __attribute__ ((packed
)); /* 9Ch 2 BYTEs ??? */
255 u_char filename1
[128] __attribute__ ((packed
)); /* 9Eh 128 BYTEs buffer for filename */
256 u_char filename2
[128] __attribute__ ((packed
)); /* 11Eh 128 BYTEs buffer for filename */
257 u_char findfirst
[21] __attribute__ ((packed
)); /* 19Eh 21 BYTEs findfirst/findnext search data block (see AH=4Eh) */
258 u_char foundentry
[32] __attribute__ ((packed
)); /* 1B3h 32 BYTEs directory entry for found file */
259 u_char cds
[88] __attribute__ ((packed
)); /* 1D3h 88 BYTEs copy of current directory structure for drive being accessed */
260 u_char fcbname
[11] __attribute__ ((packed
)); /* 22Bh 11 BYTEs ??? FCB-format filename */
261 u_char unknown5
__attribute__ ((packed
)); /* 236h BYTE ??? */
262 u_char wildcard
[11] __attribute__ ((packed
)); /* 237h 11 BYTEs wildcard destination specification for rename (FCB format) */
263 u_char unknown6
[11] __attribute__ ((packed
)); /* 242h 2 BYTEs ??? */
264 u_char attrmask
__attribute__ ((packed
)); /* 24Dh BYTE attribute mask for directory search??? */
265 u_char open_mode
__attribute__ ((packed
)); /* 24Eh BYTE open mode */
266 u_char unknown7
[3] __attribute__ ((packed
)); /* 24fh BYTE ??? */
267 u_char virtual_dos
__attribute__ ((packed
)); /* 252h BYTE flag indicating how DOS function was invoked (00h = direct INT 20/INT 21, FFh = server call AX=5D00h) */
268 u_char unknown8
[9] __attribute__ ((packed
)); /* 253h BYTE ??? */
269 u_char term_type
__attribute__ ((packed
)); /* 25Ch BYTE type of process termination (00h-03h) */
270 u_char unknown9
[3] __attribute__ ((packed
)); /* 25Dh BYTE ??? */
271 u_short dpb_off
__attribute__ ((packed
));
272 u_short dpb_seg
__attribute__ ((packed
)); /* 260h DWORD pointer to Drive Parameter Block for critical error invocation */
273 u_short int21_sf_off
__attribute__ ((packed
));
274 u_short int21_sf_seg
__attribute__ ((packed
)); /* 264h DWORD pointer to stack frame containing user registers on INT 21 */
275 u_short store_sp
__attribute__ ((packed
)); /* 268h WORD stores SP??? */
276 u_short dosdpb_off
__attribute__ ((packed
));
277 u_short dosdpb_seg
__attribute__ ((packed
)); /* 26Ah DWORD pointer to DOS Drive Parameter Block for ??? */
278 u_short disk_buf_seg
__attribute__ ((packed
)); /* 26Eh WORD segment of disk buffer */
279 u_short unknown10
[4] __attribute__ ((packed
)); /* 270h WORD ??? */
280 u_char media_id
__attribute__ ((packed
)); /* 278h BYTE Media ID byte returned by AH=1Bh,1Ch */
281 u_char unknown11
__attribute__ ((packed
)); /* 279h BYTE ??? (doesn't seem to be referenced) */
282 u_short unknown12
[2] __attribute__ ((packed
)); /* 27Ah DWORD pointer to ??? */
283 u_short sft_off
__attribute__ ((packed
));
284 u_short sft_seg
__attribute__ ((packed
)); /* 27Eh DWORD pointer to current SFT */
285 u_short cds_off
__attribute__ ((packed
));
286 u_short cds_seg
__attribute__ ((packed
)); /* 282h DWORD pointer to current directory structure for drive being accessed */
287 u_short fcb_off
__attribute__ ((packed
));
288 u_short fcb_seg
__attribute__ ((packed
)); /* 286h DWORD pointer to caller's FCB */
289 u_short unknown13
[2] __attribute__ ((packed
)); /* 28Ah WORD ??? */
290 u_short jft_off
__attribute__ ((packed
));
291 u_short jft_seg
__attribute__ ((packed
)); /* 28Eh DWORD pointer to a JFT entry in process handle table (see AH=26h) */
292 u_short filename1_off
__attribute__ ((packed
)); /* 292h WORD offset in DOS CS of first filename argument */
293 u_short filename2_off
__attribute__ ((packed
)); /* 294h WORD offset in DOS CS of second filename argument */
294 u_short unknown14
[12] __attribute__ ((packed
)); /* 296h WORD ??? */
295 u_short file_offset_lo
__attribute__ ((packed
));
296 u_short file_offset_hi
__attribute__ ((packed
)); /* 2AEh DWORD offset in file??? */
297 u_short unknown15
__attribute__ ((packed
)); /* 2B2h WORD ??? */
298 u_short partial_bytes
__attribute__ ((packed
)); /* 2B4h WORD bytes in partial sector */
299 u_short number_sectors
__attribute__ ((packed
)); /* 2B6h WORD number of sectors */
300 u_short unknown16
[3] __attribute__ ((packed
)); /* 2B8h WORD ??? */
301 u_short nbytes_lo
__attribute__ ((packed
));
302 u_short nbytes_hi
__attribute__ ((packed
)); /* 2BEh DWORD number of bytes appended to file */
303 u_short qpdb_off
__attribute__ ((packed
));
304 u_short qpdb_seg
__attribute__ ((packed
)); /* 2C2h DWORD pointer to ??? disk buffer */
305 u_short asft_off
__attribute__ ((packed
));
306 u_short asft_seg
__attribute__ ((packed
)); /* 2C6h DWORD pointer to ??? SFT */
307 u_short int21_bx
__attribute__ ((packed
)); /* 2CAh WORD used by INT 21 dispatcher to store caller's BX */
308 u_short int21_ds
__attribute__ ((packed
)); /* 2CCh WORD used by INT 21 dispatcher to store caller's DS */
309 u_short temporary
__attribute__ ((packed
)); /* 2CEh WORD temporary storage while saving/restoring caller's registers */
310 u_short prevcall_off
__attribute__ ((packed
));
311 u_short prevcall_seg
__attribute__ ((packed
)); /* 2D0h DWORD pointer to prev call frame (offset 264h) if INT 21 reentered also switched to for duration of INT 24 */
312 u_char unknown17
[9] __attribute__ ((packed
)); /* 2D4h WORD ??? */
313 u_short ext_action
__attribute__ ((packed
)); /* 2DDh WORD multipurpose open action */
314 u_short ext_attr
__attribute__ ((packed
)); /* 2DFh WORD multipurpose attribute */
315 u_short ext_mode
__attribute__ ((packed
)); /* 2E1h WORD multipurpose mode */
316 u_char unknown17a
[9] __attribute__ ((packed
));
317 u_short lol_ds
__attribute__ ((packed
)); /* 2ECh WORD stores DS during call to [List-of-Lists + 37h] */
318 u_char unknown18
[5] __attribute__ ((packed
)); /* 2EEh WORD ??? */
319 u_char usernameptr
[4] __attribute__ ((packed
)); /* 2F3h DWORD pointer to user-supplied filename */
320 u_char unknown19
[4] __attribute__ ((packed
)); /* 2F7h DWORD pointer to ??? */
321 u_char lol_ss
[2] __attribute__ ((packed
)); /* 2FBh WORD stores SS during call to [List-of-Lists + 37h] */
322 u_char lol_sp
[2] __attribute__ ((packed
)); /* 2FDh WORD stores SP during call to [List-of-Lists + 37h] */
323 u_char lol_flag
__attribute__ ((packed
)); /* 2FFh BYTE flag, nonzero if stack switched in calling [List-of-Lists+37h] */
324 u_char searchdata
[21] __attribute__ ((packed
)); /* 300h 21 BYTEs FindFirst search data for source file(s) of a rename operation (see AH=4Eh) */
325 u_char renameentry
[32] __attribute__ ((packed
)); /* 315h 32 BYTEs directory entry for file being renamed */
326 u_char errstack
[331] __attribute__ ((packed
)); /* 335h 331 BYTEs critical error stack */
327 u_char diskstack
[384] __attribute__ ((packed
)); /* 480h 384 BYTEs disk stack (functions greater than 0Ch, INT 25, INT 26) */
328 u_char iostack
[384] __attribute__ ((packed
)); /* 600h 384 BYTEs character I/O stack (functions 01h through 0Ch) */
329 u_char int_21_08_flag
__attribute__ ((packed
)); /* 780h BYTE flag affecting AH=08h (see AH=64h) */
330 u_char unknown20
[11] __attribute__ ((packed
)); /* 781h BYTE ??? looks like a drive number */
331 } /*__attribute__((__packed__))*/ SDA
;
335 u_short bytes_on_last_page
;
336 u_short size
; /* 512 byte blocks */
338 u_short hdr_size
; /* paragraphs */
339 u_short min_memory
; /* paragraphs */
340 u_short max_memory
; /* pargraphs */
346 u_short reloc_offset
;
357 ** DOS-related shrapnel
361 from_dos_attr(int attr
)
363 return((attr
& READ_ONLY_FILE
) ? 0444 : 0666);
367 to_dos_attr(int mode
)
371 attr
= (mode
& 0200) ? 0:READ_ONLY_FILE
;
372 attr
|= S_ISDIR(mode
) ? DIRECTORY
:0;
378 extern const char *dos_return
[]; /* names of DOS return codes */
379 extern const int dos_ret_size
; /* length of above */
381 extern int diskdrive
; /* current drive */
382 unsigned long disk_transfer_addr
;
384 extern void encode_dos_file_time (time_t, u_short
*, u_short
*);
385 extern time_t decode_dos_file_time(u_short dosdate
, u_short dostime
);
386 extern int translate_filename(u_char
*dname
, u_char
*uname
, int *drivep
);
387 extern int parse_filename(int flag
, char *str
, char *fcb
, int *nb
);
388 extern void dos_init(void);
391 extern int pspseg
; /* segment # of PSP */
394 extern void exec_command(regcontext_t
*REGS
, int run
, int fd
, char *cmdname
, u_short
*param
);
395 extern void load_overlay(int fd
, int start_segment
, int reloc_segment
);
396 extern void load_command(regcontext_t
*REGS
, int run
, int fd
, char *cmdname
,
397 u_short
*param
, char **argv
, char **envs
);
398 extern void exec_return(regcontext_t
*REGS
, int code
);
399 extern int get_env(void);