Format of DOS 4.0-6.0 swappable data area:
Offset Size Description )
-34 BYTE printer echo flag (00h off, FFh active)
-31 BYTE current switch character (ignored by DOS 5+)
-30 BYTE current memory allocation strategy (see AH=58h)
-28 BYTE incremented on each INT 21/AX=5E01h call
-27 16 BYTEs machine name set by INT 21/AX=5E01h
-11 5 WORDs zero-terminated list of offsets which need to be patched to
enable critical-section calls (see INT 2A/AH=80h)
(all offsets are 0D0Ch, but this list is still present for
DOS 3.x compatibility)
-1 BYTE unused padding
Note: the above data is not actually part of the SDA, and is much more likely
to change between DOS versions/OEMs than data in the SDA itself
---start of actual SDA---
00h BYTE critical error flag ("ErrorMode")
01h BYTE InDOS flag (count of active INT 21 calls)
02h BYTE drive on which current critical error occurred or FFh
(DR DOS 3.41/5.0 set this to 00h when no critical error)
03h BYTE locus of last error
04h WORD extended error code of last error
06h BYTE suggested action for last error
07h BYTE class of last error
08h DWORD ES:DI pointer for last error
0Ch DWORD current DTA (Disk Transfer Address)
note: may point into SDA during the DOS EXEC function
(see AH=4Bh), so programs which swap the SDA must be
prepared to move the DTA to a private buffer if they
might be invoked during an EXEC
10h WORD current PSP
12h WORD stores SP across an INT 23
14h WORD return code from last process termination (zerod after reading
with AH=4Dh)
16h BYTE current drive
17h BYTE extended break flag
18h BYTE flag: code page switching
19h BYTE flag: copy of previous byte in case of INT 24 Abort
---remainder need only be swapped if in DOS---
1Ah WORD value of AX on call to INT 21
Note: does not contain correct value on functions 00h-0Ch,
50h, 51h, 59h, or 62h
1Ch WORD PSP segment for sharing/network (0000h = local)
1Eh WORD network machine number for sharing/network (0000h = local)
20h WORD first usable memory block found when allocating memory
22h WORD best usable memory block found when allocating memory
24h WORD last usable memory block found when allocating memory
26h WORD memory size in paragraphs (used only during initialization)
28h WORD last entry checked during directory search
2Ah BYTE flag: nonzero if INT 24 Fail
2Bh BYTE flags: allowable INT 24 responses (passed to INT 24 in AH)
2Ch BYTE flag: do not set directory if nonzero
2Dh BYTE flag: program aborted by ^C
2Eh BYTE flag: allow embedded blanks in FCB
may also allow use of "*" wildcard in FCBs
2Fh BYTE padding (unused)
30h BYTE day of month
31h BYTE month
32h WORD year - 1980
34h WORD number of days since 01jan1980
36h BYTE day of week (0 = Sunday)
37h BYTE flag: console swapped during read from device
38h BYTE flag: safe to call INT 28 if nonzero
39h BYTE flag: abort currently in progress, turn INT 24 Abort into Fail
3Ah 30 BYTEs device driver request header (see #02597 at INT 2F/AX=0802h) for
device calls
58h DWORD pointer to device driver entry point (used in calling driver)
5Ch 22 BYTEs device driver request header for I/O calls
72h 14 BYTEs device driver request header for disk status check (also
includes following eight bytes for some calls)
80h DWORD pointer to device I/O buffer
84h WORD part of request header at 72h
86h WORD part of request header at 72h (0)
88h BYTE type of PSP copy (00h=simple for INT 21/AH=26h, FFh=make child)
89h DWORD start offset of file region to lock/unlock
8Dh DWORD length of file region to lock/unlock
91h BYTE padding (unused)
92h 3 BYTEs 24-bit user number (see AH=30h)
95h BYTE OEM number (see #01394 at AH=30h)
96h 6 BYTEs CLOCK$ transfer record (see #01688 at AX=5D06h)
9Ch BYTE device I/O buffer for single-byte I/O functions
9Dh BYTE padding
9Eh 128 BYTEs buffer for filename
11Eh 128 BYTEs buffer for filename (rename destination name)
19Eh 21 BYTEs findfirst/findnext search data block (see #01626 at AH=4Eh)
1B3h 32 BYTEs directory entry for found file (see #01394 at AH=11h)
1D3h 88 BYTEs copy of current directory structure for drive being accessed
22Bh 11 BYTEs FCB-format filename for device name comparison
236h BYTE terminating NUL for above filename
237h 11 BYTEs wildcard destination specification for rename (FCB format)
242h BYTE terminating NUL for above filespec
243h BYTE padding???
244h WORD destination starting sector (cluster???)
246h 5 BYTEs extra space to allow a directory entry to be stored starting
at offset 22Bh
24Bh BYTE extended FCB file attributes
24Ch BYTE type of FCB (00h regular, FFh extended)
24Dh BYTE directory search attributes
24Eh BYTE file open/access mode
24Fh BYTE flag: nonzero if file was deleted
250h BYTE flag: device name found on rename, or file not found
251h BYTE flag: splice file name and directory name together
252h BYTE flag indicating how DOS function was invoked
(00h = direct INT 20/INT 21, FFh = server call AX=5D00h)
253h BYTE sector position within cluster
254h BYTE flag: translating sector/cluster
255h BYTE flag: 00h if read, 01h if write
256h BYTE current working drive number
257h BYTE cluster factor
258h BYTE "sda_CLUSSPLIT" flag: cluster split between two FAT sectors
259h BYTE line edit (AH=0Ah) insert mode flag (nonzero = on)
25Ah BYTE canonicalized filename referred to existing file/dir if FFh
25Bh BYTE volume ID flag
25Ch BYTE type of process termination (00h-03h) (see AH=4Dh)
25Dh BYTE unused (padding for alignment)
25Eh BYTE file create flag (00h = no, search only)
25Fh BYTE value for deleted file's first byte: 00h to delete all, else E5
260h DWORD pointer to Drive Parameter Block for critical error invocation
264h DWORD pointer to stack frame containing user registers on INT 21
268h WORD stores SP across INT 24
26Ah DWORD pointer to DOS Drive Parameter Block for ???
26Eh WORD segment of disk buffer
270h DWORD saving partial cluster number
274h WORD "sda_PREREAD" 00h if preread, 01h if optional
276h WORD temporary used in allocating disk space
278h BYTE Media ID byte returned by AH=1Bh,1Ch
279h BYTE unused
27Ah DWORD pointer to device header if filename is character device
27Eh DWORD pointer to current SFT
282h DWORD pointer to current directory structure for drive being accessed
286h DWORD pointer to caller's FCB
28Ah WORD SFT index to which file being opened will refer
28Ch WORD temporary storage for file handle
28Eh DWORD pointer to JFT entry (for file being opened) in process handle
table (see #01378 at AH=26h)
292h WORD "sda_WFP_START" offset in DOS DS of first filename argument
294h WORD "sda_REN_WFP" offset in DOS DS of second filename argument
296h WORD offset of last component in pathname or FFFFh
298h WORD offset of transfer address to add
29Ah WORD last relative cluster within file being accessed
29Ch WORD temp: absolute cluster number being accessed
29Eh DWORD directory sector number
2A2h WORD directory cluster number
2A4h DWORD current relative sector number within file
2A8h DWORD current sector number (number of previously written sectors)
2ACh WORD current byte offset within sector
2AEh DWORD current offset in file
2B2h WORD number of bytes in first sector
2B4h WORD bytes in partial last sector
2B6h WORD number of whole sectors
2B8h WORD free file cluster entry
2BAh WORD last file cluster entry
2BCh WORD next file cluster number
2BEh DWORD number of bytes appended to file
2C2h DWORD pointer to current work disk buffer
2C6h DWORD pointer to working SFT
2CAh WORD used by INT 21 dispatcher to store caller's BX
2CCh WORD used by INT 21 dispatcher to store caller's DS
2CEh WORD temporary storage while saving/restoring caller's registers
2D0h DWORD pointer to prev call frame (offset 264h) if INT 21 reentered
also switched to for duration of INT 24
2D4h WORD open mode/action for INT 21/AX=6C00h
2D6h BYTE extended open conditional flag
set to 00h by INT 21h dispatcher, 02h when a read is
performed, and 01h or 03h by INT 21/AX=6C00h
2D7h WORD extended open I/O mode
2D9h DWORD stored ES:DI for AX=6C00h
2DDh WORD extended file open action code (see #01770 at AX=6C00h)
2DFh WORD extended file open attributes (see #01769 at AX=6C00h)
2E1h WORD extended file open file mode (see AX=6C00h)
2E3h DWORD pointer to filename to open (see AX=6C00h)
2E7h WORD high word of 32-bit sector number, or temp data buffer size
from disk buffer
2E9h WORD "sda_OffsetMagicPatch"
2EBh BYTE disk full on >32M partition when set to 01h
2ECh WORD stores DS during call to [List-of-Lists + 37h]
2EEh WORD temporary storage (various uses)
2F0h BYTE storage for drive error
2F1h WORD DOS 3.4 (European MS-DOS 4.00) bit flags
2F3h DWORD pointer to user-supplied filename
2F7h DWORD pointer to user-supplied rename destination filename
2FBh WORD stores SS during call to [List-of-Lists + 37h] and INT 25,26
2FDh WORD stores SP during call to [List-of-Lists + 37h] and INT 25,26
2FFh BYTE flag, nonzero if stack switched in calling [List-of-Lists+37h]
300h 21 BYTEs FindFirst search data for source file(s) of a rename operation
(see #01626 at AH=4Eh)
315h 32 BYTEs directory entry for file being renamed (see #01352 at AH=11h)
335h 331 BYTEs critical error stack
480h 384 BYTEs disk stack (functions greater than 0Ch, INT 25,INT 26)
600h 384 BYTEs character I/O stack (functions 01h through 0Ch)
780h BYTE device driver lookahead flag (usually printer)
(see AH=64h"DOS 3.2+")
781h BYTE volume change flag
782h BYTE flag: virtual file open
783h BYTE fastseek drive
784h WORD fastseek first cluster number
786h WORD fastseek logical cluster number
788h WORD fastseek returned logical cluster number
78Ah WORD temporary location of DOS@SYSINIT
---MSDOS 7.1+ (FAT32)---
78Ch 47 BYTEs ???
7BBh BYTE flag: absolute disk read/write type
00h = INT 25/INT 26
01h = INT 21/AX=7305h
7BCh WORD high word of directory cluster number at offset 2A2h
7BEh WORD high word of cluster number at offset 29Ch
7C0h WORD high word of next file cluster number at offset 2BCh
7C2h WORD high word of last relative cluster number at offset 29Ah
7C4h WORD high word of temp at offset 276h
7C6h WORD high word of offset 244h
7C8h WORD high word of EBX
7CAh WORD high word of EDX used by "PACK"
7CCh WORD high word of EDI used by "UNPACK"
7CEh WORD high word of EBX used by "SETDIRSRCH"
7D0h WORD high word of ECX used by "FREECLUSTER"
7D2h WORD high word of EDI used by "GETEOF"
7D4h 3 WORDs ???
Note: the only fields which remain valid BETWEEN calls to INT 21h are those
in the initial "swap-always" portion of the SDA
SeeAlso: #01687,#01689