home *** CD-ROM | disk | FTP | other *** search
-
- ** Programmer's Technical Reference for MSDOS and the IBM PC **
- USA copyright TXG 392-616 ALL RIGHTS RESERVED
- ──────────────────────────┤ DOSREF (tm) ├───────────────────────────
- ISBN 1-878830-02-3 (disk-based text)
- Copyright (c) 1987, 1993 Dave Williams
- ┌─────────────────────────────┐
- │ Shareware Version, 05/25/93 │
- │ Please Register Your Copy │
- └─────────────────────────────┘
-
- C H A P T E R S E V E N
-
- DOS FILE STRUCTURE
-
- C O N T E N T S
-
- File Management Functions ....................................... 7**1
- FCB Function Calls .............................................. 7**2
- Handle Function Calls ........................................... 7**3
- Special File Handles ............................................ 7**4
- Raw and Cooked File I/O ......................................... 7**5
- Number of Open Files Allowed ................................... 7**6
- Restrictions on FCB Usage ....................................... 7**7
- Restrictions on Handle usage .................................... 7**8
- Allocating Space to a File ...................................... 7**9
- MSDOS / PCDOS Differences ....................................... 7**10
- .COM File Structure ............................................. 7**11
- .EXE File Structure ............................................. 7**12
- The Relocation Table ............................................ 7**13
- "NEW" .EXE Format (Microsoft Windows and OS/2) .................. 7**14
- Standard File Control Block ..................................... 7**15
- Extended File Control Block ..................................... 7**16
- Disk Transfer Area .............................................. 7**17
-
-
-
- File Management Functions ....................................... 7**1
-
- Use DOS function calls to create, open, close, read, write, rename,
- find, and erase files. There are two sets of function calls that DOS
- provides for support of file management. They are:
-
- * File Control Block function calls (0Fh-24h)
- * Handle function calls (39h-69h)
-
- Handle function calls are easier to use and are more powerful than
- FCB calls. Microsoft recommends that the handle function calls be used
- when writing new programs. DOS 3.0 up have been curtailing use of FCB
- function calls; it is possible that future versions of DOS may not
- support FCB function calls.
-
- The following table compares the use of FCB calls to Handle function
- calls:
-
- ┌─────────────────────────────┬─────────────────────────────────────────┐
- │ FCB Calls │ Handle Calls │
- ├─────────────────────────────┼─────────────────────────────────────────┤
- │ Access files in current │ Access files in ANY directory │
- │ directory only. │ │
- │ │ │
- │ Requires the application │ Does not require use of an FCB. │
- │ program to maintain a file │ Requires a string with the drive, │
- │ control block to open, │ path, and filename to open, create, │
- │ create, rename or delete │ rename, or delete a file. For file │
- │ a file. For I/O requests, │ I/O requests, the application program │
- │ the application program │ must maintain a 16 bit file handle │
- │ also needs an FCB │ that is supplied by DOS. │
- └─────────────────────────────┴─────────────────────────────────────────┘
-
- The only reason an application should use FCB function calls is to
- maintain the ability to run under DOS 1.x. To to this, the program
- may use only function calls 00h-2Eh. Though the FCB function calls
- are frowned upon, many of the introductory assembly language
- programming texts use the FCB calls as examples.
-
- PC-MOS/386 supports the FCB calls but recommends using the handle
- calls.
-
-
-
- FCB Function Calls .............................................. 7**2
-
- FCB function calls require the use of one File Control Block per
- open file, which is maintained by the application program and DOS.
- The application program supplies a pointer to the FCB and fills in the
- appropriate fields required by the specific function call. An FCB
- function call can perform file management on any valid drive, but only
- in the current logged directory. By using the current block, current
- record, and record length fields of the FCB, you can perform
- sequential I/O by using the sequential read or write function calls.
- Random I/O can be performed by filling in the random record and record
- length fields.
-
- Several possible uses of FCB type calls are considered programming
- errors and should not be done under any circumstances to avoid
- problems with file sharing and compatibility with later versions of
- DOS.
-
- Some errors are:
-
- 1) If program uses the same FCB structure to access more than one open
- file. By opening a file using an FCB, doing I/O, and then replacing
- the filename field in the file control block with a new filename, a
- program can open a second file using the same FCB. This is invalid
- because DOS writes control information about the file into the
- reserved fields of the FCB. If the program replaces the filename
- field with the original filename and then tries to perform I/O on
- this file, DOS may become confused because the control information
- has been changed. An FCB should never be used to open a second file
- without closing the one that is currently open. If more than one
- File Control Block is to be open concurrently, separate FCBs should
- be used.
-
- 2) A program should never try to use the reserved fields in the FCB,
- as the function of the fields may change with different versions of
- DOS.
-
- 3) A delete or a rename on a file that is currently open is considered
- an error and should not be attempted by an application program.
-
- It is also good programming practice to close all files when I/O is
- done. This avoids potential file sharing problems that require a limit
- on the number of files concurrently open using FCB function calls.
-
-
-
- Handle Function Calls ........................................... 7**3
-
- The recommended method of file management is by using the extended
- "handle" set of function calls. These calls are not restricted to the
- current directory. Also, the handle calls allow the application
- program to define the type of access that other processes can have
- concurrently with the same file if the file is being shared.
-
- To create or open a file, the application supplies a pointer to an
- ASCIIZ string giving the name and location of the file. The ASCIIZ
- string contains an optional drive letter, optional path, mandatory
- file specification, and a terminal byte of 00h. The following is an
- example of an ASCIIZ string:
-
- format: [drive][path] FILENAME.EXT,0
-
- in MASM: db "A:\PATH\FILENAME.EXT",0
-
- If the file is being created, the application program also supplies
- the attribute of the file. This is a set of values that defines the
- file read-only, hidden, system, directory, or volume label.
-
- If the file is being opened, the program can define the sharing and
- access modes that the file is opened in. The access mode informs DOS
- what operations your program will perform on this file (read-only,
- write-only, or read/write). The sharing mode controls the type of
- operations other processes may perform concurrently on the file. A
- program can also control if a child process inherits the open files of
- the parent. The sharing mode has meaning only if file sharing is
- loaded when the file is opened.
-
- To rename or delete a file, the appplication program simply needs to
- provide a pointer to the ASCIIZ string containing the name and
- location of the file and another string with the new name if the file
- is being renamed.
-
- The open or create function calls return a 16-bit value referred to
- as the file handle. To do any I/O to a file, the program uses the
- handle to reference the file. Once a file is opened, a program no
- longer needs to maintain the ASCIIZ string pointing to the file, nor
- is there any need to stay in the same directory. DOS keeps track of
- the location of the file regardless of what directory is current.
-
- Sequential I/O can be performed using the handle read (3Fh) or write
- (40h) function calls. The offset in the file that I/O is performed to
- is automatically moved to the end of what was just read or written.
- If random I/O is desired, the LSEEK (42h) function call can be used to
- set the offset into the file where I/O is to be performed.
-
-
-
- Special File Handles ............................................ 7**4
-
- DOS reserves five special file handles for use by itself and
- applications programs. They are:
-
- ┌───────┬────────┬──────────────────────────────────────────────────────┐
- │ 0000h │ STDIN │ standard input device (input can be redirected) │
- │ 0001h │ STDOUT │ standard output device (output can be redirected) │
- │ 0002h │ STDERR │ standard error output device (output cannot be │
- │ │ │ redirected) │
- │ │ │ NOTE: DOS opens STDERR for both writing and reading. │
- │ │ │ Since STDIN can be redirected, using STDERR to read │
- │ │ │ the keyboard is a reliable way to ensure that your │
- │ │ │ program is actually │
- │ │ │ reading the keyboard, if that's what you want to do. │
- │ 0004h │ STDAUX │ standard auxiliary device │
- │ 0005h │ STDPRN │ standard printer device (PRN, normally LPT1) │
- └───────┴────────┴──────────────────────────────────────────────────────┘
-
- These handles are predefined by DOS and can be used by an
- application program. They do not need to be opened by a program,
- although a program can close these handles. STDIN should be treated
- as a read-only file, and STDOUT and STDERR should be treated as write-
- only files. STDIN and STDOUT can be redirected. All handles
- inherited by a process can be redirected, but not at the command line.
-
- These handles are very useful for doing I/O to and from the console
- device. For example, you could read input from the keyboard using the
- read (3Fh) function call and file handle 0000h (STDIN), and write
- output to the console screen with the write function call (40h) and
- file handle 0001h (STDOUT). If you wanted an output that could not be
- redirected, you could output it using file handle 0002h (STDERR).
- This is very useful for error messages that must be seen by a user.
-
- File handles 0003h (STDAUX) and 0004h (STDPRN) can be both read from
- and written to. STDAUX is typically a serial device and STDPRN is
- usually a parallel device.
-
- DOS 2.0 through 3.21 were limited to 20 file handles. This limited
- application programs to 15 simultaneous handles. DOS 3.3 and higher
- added the int 21h/ Set Handle Count function to give up to 65,535 file
- handles per application. PC-MOS/386 can have more than 65,535
- handles.
-
-
- Raw and Cooked File I/O ......................................... 7**5
-
- Raw and cooked modes originated in the Unix world and were provided
- with DOS 2.x+. They apply only to character I/O (including the
- keyboard, screen, printer and serial ports - but not block devices
- like disk drives), and only to the "new" 2.x file handle I/O functions
- (not the old FCB file I/O functions). Raw mode is called "binary"
- mode in DOS 3.x+, and cooked mode is called "ASCII." The common raw-
- cooked convention is from DOS 2.x and other operating systems.
-
- The five predefined DOS file handles are all devices, so the mode
- can be changed from raw to cooked via IOCTL. These handles are in
- cooked mode when initialized by DOS. Regular file handles that are
- not devices are always in raw mode and cannot be changed to cooked
- mode.
-
- The predefined file handles STDIN (0000h) and STDOUT (0001h) and
- STDERR (0002h) are all duplicate handles. If the IOCTL function call
- is used to change the mode of any of these three handles, the mode of
- all three handles is changed. For example, if IOCTL was used to
- change STDOUT to raw, then STDIN and STDERR would also be changed to
- raw mode.
-
- In the default cooked mode, DOS examines the character I/O data
- stream for certain special control characters, and takes specific
- actions if they are found. For example, Ctrl-C is treated as a Break
- interrupt, Ctrl-S pauses the screen display, and Ctrl-Z is treated as
- end-of-file. (If you try to send Ctrl-Z to a printer through a DOS
- file handle in cooked mode, DOS closes the printer file!) Also, input
- is buffered within DOS until a CR is detected - so you can't process
- each key as it is pressed.
-
- In raw mode, DOS ignores special characters, passing them through
- without any special processing, and does not buffer input lines. So
- to use file handle I/O to send bit-mapped graphics to a printer
- through DOS, or process individual keystrokes immediately, or bypass
- Ctrl-C checking, you need to switch the file handle to raw mode. Raw
- mode is not automatically reset to cooked mode by DOS when a program
- terminates, so it is a good idea to reset the file into cooked mode
- before your program exits if the system was in cooked mode to begin
- with. I/O to files is done in raw mode.
-
- To set a file handle into raw mode or back into cooked mode, use DOS
- IOCTL (int 21h Fn 44h, Chapter 4):
-
- 1. Get the current mode bits (Subfunction 0).
- 2. Check that the file is a character file. (If not, exit.)
- 3. Switch the cooked mode bit to raw or vice versa.
- 4. Set the mode bits (Subfunction 1).
-
- Microsoft C v4 and later do NOT set raw mode for binary files. When
- running with the CON driver set to raw mode (to enhance display speed)
- programs compiled in MSC will crash the computer. A letter to
- Microsoft reporting this odd behavior got the somewhat bizarre reply
- that "Microsoft does not support the use of any TSRs" from their
- techs. Raw mode is clearly documented by both IBM and Microsoft, and
- their own tools should take it into account.
-
-
-
- FILE I/O IN BINARY (RAW) MODE
-
- The following is true when a file is read in binary mode:
-
- 1) The characters ^S (scroll lock), ^P (print screen), ^C (control
- break) are not checked for during the read. Therefore, no printer
- echo occurs if ^S or ^P are read.
- 2) There is no echo to STDOUT (0001h).
- 3) Read the number of specified bytes and returns immediately when the
- last byte is received or the end of file reached.
- 4) Allows no editing of the input using the function keys if the input
- is from STDIN (0000h).
-
-
- The following is true when a file is written to in binary mode:
-
- 1) The characters ^S (scroll lock), ^P (print screen), ^C (control
- break) are not checked for during the write. Therefore, no printer
- echo occurs.
- 2) There is no echo to STDOUT (0001h).
- 3) The exact number of bytes specified are written.
- 4) Does not caret (^) control characters. For example, Ctrl-D is sent
- out as byte 04h instead of the two bytes ^ and D.
- 5) Does not expand tabs into spaces.
-
-
- FILE I/O IN ASCII (COOKED) MODE
-
- The following is true when a file is read in ASCII mode:
-
- 1) Checks for the characters ^C,^S, and ^P.
- 2) Returns as many characters as there are in the device input buffer,
- or the number of characters requested, whichever is less. If the
- number of characters requested was less than the number of
- characters in the device buffer, then the next read will address
- the remaining characters in the buffer.
- 3) If there are no more bytes remaining in the device input buffer,
- read a line (terminated by a CR) into the buffer. This line may
- be edited with the function keys. The characters return terminated
- with a sequence of 0Dh, 0Ah (CR, LF) if the number of characters
- requested is sufficient to include them. For example, if 5
- characters were requested, and only 3 were entered before the
- carriage return (0Dh or ^M) was presented to DOS from the console
- device, then the 3 characters entered and 0Dh and 0Ah would be
- returned. However, if 5 characters were requested and 7 were
- entered before the carriage return, only the first 5 characters
- would be returned. No 0Dh, 0Ah sequence would be returned in this
- case. If less than the number of characters requested are entered
- when the carriage return is received, the characters received and
- 0Dh, 0Ah would be returned. The reason the 0Ah (linefeed or ^J)
- is added to the returned characters is to make the devices look
- like text files.
- 4) If a 1Ah (^Z) is found, the input is terminated at that point.
- No 0Dh, 0Ah (CR,LF) sequence is added to the string.
- 5) Echoing is performed.
- 6) Tabs are expanded.
-
-
- The following is true when a file is written to in ASCII mode:
-
- 1) The characters ^S,^P,and ^C are checked for during the write
- operation.
- 2) Expands tabs to 8-character boundaries and fills with spaces
- (20h).
- 3) Carets indicate control chars, for example, ^D is written as
- two bytes, '^' and 'D'.
- 4) Bytes are output until the number specified is output or a ^Z is
- encountered. The number actually output is returned to the user.
-
-
-
- Number of Open Files Allowed ................................... 7**6
-
- The number of files that can be open concurrently is restricted by
- DOS. This number is determined by how the file is opened or created
- (FCB or handle function call) and the number specified by the FCBS and
- FILES commands in the CONFIG.SYS file. The number of files allowed
- open by FCB function calls and the number of files that can be opened
- by handle type calls are independent of one another.
-
-
-
- Restrictions on FCB Usage ....................................... 7**7
-
- If file sharing is not loaded using the SHARE command, there is no
- restriction on the number of files concurrently open using FCB
- function calls.
-
- However, when file sharing is loaded, the maximum number of FCBs
- open is set by the the FCBS command in the CONFIG.SYS file.
-
- The FCBS command has two values you can specify, 'm' and 'n'. The
- value for 'm' specifies the number of files that can be opened by
- FCBs, and the value 'n' specifies the number of FCBs that are
- protected from being closed.
-
- When the maximum number of FCB opens is exceeded, DOS automatically
- closes the least recently used file. Any attempt to access this file
- results in an int 24h critical error message "FCB not available". If
- this occurs while an application program is running, the value
- specified for 'm' in the FCBS command should be increased.
-
- When DOS determines the least recently used file to close, it does
- not include the first 'n' files opened, therefore the first 'n' files
- are protected from being closed.
-
-
-
- Restrictions on Handle usage .................................... 7**8
-
- The number of files that can be open simultaneously by all processes
- is determined by the FILES command in the CONFIG.SYS file. The number
- of files a single process can open depends on the value specified for
- the FILES command. If FILES is greater than or equal to 20, a single
- process can open 20 files. If FILES is less than 20, the process can
- open less than 20 files. This value includes the three predefined
- handles STDIN, STDOUT, and STDERR. This means only 17 additional
- handles can be added. DOS 3.3+ includes a function to use more than 20
- files per application.
-
-
-
- Allocating Space to a File ...................................... 7**9
-
- Files are not necessarily written sequentially on a disk. Space is
- allocated as needed and the next location available on the disk is
- allocated as space for the next file being written. Therefore, if
- considerable file generation has taken place, newly created files will
- not be written in sequential sectors. However, due to the mapping
- (chaining) of file space via the File Allocation Table (FAT) and the
- function calls available, any file may be used in either a sequential
- or random manner.
-
- Space is allocated in increments called clusters. Cluster size
- varies according to the media type. An application program should not
- concern itself with the way that DOS allocates space to a file. The
- size of a cluster is only important in that it determines the smallest
- amount of space that can be allocated to a file. A disk is considered
- full when all clusters have been allocated to files.
-
- A DOS file can be up to (2^32)-1 (4,294,967,295) bytes long. This
- is the maximum value that can be put in the dword in the FAT which
- holds the file size information, less one byte for the end of file
- marker.
-
-
-
- MSDOS / PCDOS Differences ....................................... 7**10
-
- There is a problem of compatibility between MS-DOS and IBM PC-DOS
- having to do with FCB Open and Create. The IBM 1.0, 1.1, and 2.0
- documentation of OPEN (call 0Fh) contains the following statement:
-
- "The current block field (FCB bytes C-D) is set to zero [when an FCB
- is opened]."
-
- This statement is NOT true of MS-DOS 1.25 or MS-DOS 2.00. The
- difference is intentional, and the reason is CP/M 1.4 compatibility.
- Zeroing that field is not CP/M compatible. Some CP/M programs will
- not run when machine translated if that field is zeroed. The reason
- it is zeroed in the IBM versions is that IBM specifically requested
- that it be zeroed. This was the reason for the complaints from some
- vendors about the fact that IBM MultiPlan would not run under MS-DOS.
- It is probably the reason that some other very old IBM programs didn't
- run under MS-DOS.
-
- NOTE: Do what all MS/PC-DOS systems programs do: Set every single FCB
- field you want to use regardless of what the documentation says is
- initialized.
-
-
-
- .COM File Structure ............................................. 7**11
-
- The COM file structure was designed for DOS 1.0 and maximum
- compatibility with programs ported from the CP/M operating system.
- COM files normally comprise one segment only. A COM file is loaded as
- a memory image of the disk file and the Instruction Pointer is set to
- offset 100h within the program.
-
- The BIN files generated by EXE2BIN are COM files.
-
-
-
- .EXE File Structure ............................................. 7**12
-
- The EXE file is the native mode for DOS. EXE files may make use of
- multiple segments for code, stack, and data. The design of the EXE
- file reflects the segmented design of the Intel 80x86 CPU
- architecture. EXE files may be as large as available memory and may
- make references to specific segment addresses.
-
- The EXE files produced by the Microsoft linker program consist of
- two parts, control and relocation information and the load module
- itself.
-
- The control and relocation information, which is described below, is
- at the beginning of the file in an area known as the header. The load
- module immediately follows the header. The load module begins in the
- memory image of the module contructed by the Microsoft linker.
-
- When you are loading a file with the name *.EXE, DOS does NOT assume
- that it is an EXE format file. It looks at the first two bytes for a
- signature (the letters MZ) telling it that it is an EXE file. If it
- has the proper signature, then the load proceeds. Otherwise, it
- presumes the file to be a .COM format file.
-
- If the file has the EXE signature, then the internal consistency is
- checked. Pre-2.0 versions of MSDOS did not check the signature byte
- for EXE files.
-
- The .EXE format can support programs larger than 64K. It does this
- by allowing separate segments to be defined for code, data, and the
- stack, each of which can be up to 64K long. Programs in EXE format
- may contain explicit references to segment addresses. A header in the
- EXE file has information for DOS to resolve these references.
-
- EXE file size does not reflect the amount of RAM an EXE file might
- use, since stack space or extra RAM may be allocated by the EXE loader
- at init. Some programs may also store their overlay files in the main
- EXE file.
-
- EXE files produced by the Microsoft linker are considered to be
- standard EXEs. Digital Research's RASM86 linker produces quite
- different EXE files, as do the linkers from SLR Systems and Phoenix.
- Intel's original linker for their 8086 compiler is much more
- sophisticated than the Microsoft linker, which originally was a simple
- subset of the Intel linker. Unfortunately the new fields added by
- OS/2, Windows, and CodeView make the newer Microsoft linkers somewhat
- different from the original Intel linker.
-
-
- ┌───────────────────────────────────────────────────────────────────────┐
- │ E X E F I L E H E A D E R │
- ├─────────┬──────┬──────────────────────────────────────────────────────┤
- │ Offset │ Size │ C O N T E N T S │
- ├─────────┼──────┼─────┬────────────────────────────────────────────────┤
- │ 00h │ BYTE │ 4Dh │ The Linker's signature to mark the file as a │
- ├─────────┼──────┼─────┤ valid .EXE file (ASCII letters M and Z, for │
- │ 01h │ BYTE │ 5Ah │ Mark Zbikowski, one of the major DOS │
- │ │ │ │ programmers at Microsoft) │
- ├─────────┼──────┼─────┴────────────────────────────────────────────────┤
- │ 02h-03h │ WORD │ Length of the image mod 512 (remainder after dividing│
- │ │ │ the load module image size by 512) (including header)│
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 04h-05h │ WORD │ Size of the file in 512 byte pages including the │
- │ │ │ header. │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 06h-07h │ WORD │ Number of relocation table items following the header│
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 08h-09h │ WORD │ Size of the header in 16 byte (paragraphs). This is │
- │ │ │ used to locate the beginning of the load module in │
- │ │ │ the file. Although the DOS loader will allow the │
- │ │ │ actual program to begin at any location specified by │
- │ │ │ this value some debuggers, including Microsoft's, │
- │ │ │ need the program to be aligned on a 512-byte boundary│
- │ │ │ in the .EXE file. │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 0Ah-0Bh │ WORD │ Minimum number of 16 byte paragraphs required above │
- │ │ │ the end of the loaded program. │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 0Ch-0Dh │ WORD │ Max number of 16 byte paragraphs required above the │
- │ │ │ end of the loaded program. If the minimum and maximum│
- │ │ │ number of paragraphs are both zero, the program will │
- │ │ │ be loaded as high in memory as possible. │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 0Eh-0Fh │ WORD │ Displacement in paragraphs of stack segment within │
- │ │ │ load module. This size must be adjusted by │
- │ │ │ relocation. │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 10h-11h │ WORD │Offset to be in SP register when the module is given │
- │ │ │ control (stack offset) │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 12h-13h │ WORD │ Checksum - 16-bit negative sum of all the words in │
- │ │ │ the file, ignoring overflow. │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 14h-15h │ WORD │ Offset for the IP register when the module is given │
- │ │ │ control (initial instruction pointer) │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 16h-17h │ WORD │ Offset in paragraphs of code segment (CS) within load│
- │ │ │ module. This size must be adjusted by relocation. │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 18h-19h │ WORD │ Offset in bytes of the relocation pointer table. │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 1Ah-1Bh │ WORD │ Overlay number (0 for the resident part of the │
- │ │ │ program) │
- ├─────────┼──────┼──────────────────────────────────────────────────────┤
- │ 1Ch │ BYTE │ (undocumented) Microsoft compilers put 01h here, │
- │ │ │ which may indicate the version of .EXE header │
- │ │ │ structure for later changes. Normally the relocation│
- │ │ │ table begins at 1Eh, but that can be changed to a │
- │ │ │ different location if the word at 18-19h is adjusted │
- │ │ │ to match. │
- └─────────┴──────┴──────────────────────────────────────────────────────┘
-
-
-
- The Relocation Table ............................................ 7**13
-
- The word at 18h locates the first entry in the relocation table.
- The relocation table is made up of a variable number of relocation
- items. The number of items is contained at offset 06h. The
- relocation item contains two fields - a 2 byte offset value, followed
- by a 2 byte segment value. These two fields represent the
- displacement into the load module before the module is given control.
- The process is called relocation and is accomplished as follows:
-
- 1. The formatted part of the header is read into memory. Its size
- is 1Bh.
-
- 2. A portion of memory is allocated depending on the size of the load
- module and the allocation numbers in offsets 0Ah and 0Ch. DOS
- always tries to allocate 0FFFFh paragraphs. Since this call will
- always fail, the function returns the amount of free memory. If
- this block is larger than the minimum specified at offset 0Ah and
- the loaded program size, DOS will allocate the size specified at
- offset 0Ch or the largest free memory space, whichever is less.
-
- 3. A Program Segment Prefix is built following the resident portion of
- the program that is performing the load operation.
-
- 4. The formatted part of the header is read into memory (its size is
- at offset 08h)
-
- 5. The load module size is determined by subtracting the header size
- from the file size. Offsets 04h and 08h can be used for this
- calculation. The actual size is downward adjusted based on the
- contents of offset 02h. Note that all files created by the Linker
- programs prior to version 1.10 always placed a value of 4 at this
- location, regardless of the actual program size. Therefore,
- Microsoft recommends that this field be ignored if it contains a
- value of 4. Based on the setting of the high/low loader switch, an
- appropriate segment is determined for loading the load module. This
- segment is called the start segment.
-
- 6. The load module is read into memory beginning at the start segment.
- The relocation table is an ordered list of relocation items. The
- first relocation item is the one that has the lowest offset in the
- file.
-
- 7. The relocation table items are read into a work area one or more at
- a time.
-
- 8. Each relocation table item segment value is added to the start
- segment value. The calculated segment, in conjunction with the
- relocation item offset value, points to a word in the load module
- to which is added the start segment value. The result is placed
- back into the word in the load module.
-
- 9. Once all the relocation items have been processed, the SS and SP
- registers are set from the values in the header and the start
- segment value is added to SS. The ES and DS registers are set to
- the segment address of the program segment prefix. The start
- segment value is added to the header CS register value. The result,
- along with the header IP value, is used to give the module control.
-
-
-
- "NEW" .EXE Format (Microsoft Windows and OS/2) .................. 7**14
-
- The "old" EXE format is documented here. The "new" EXE format puts
- more information into the header section and is currently used in
- applications that run under Microsoft Windows. The linker that
- creates these files comes with the Microsoft Windows Software
- Development Kit and is called LINK4. If you try to run a Windows-
- linked program under DOS, you will get the error message "This program
- requires Microsoft Windows". The OS/2 1.x file format is essentially
- the same as the Windows format.
-
- Windows executables have dynamic linking and all of the code/data
- inside an EXE file is not necessarily loaded at run time.
-
- Offset 3Ch dword: offset of new .EXE header (for Microsoft Windows &
- OS/2)
-
-
-
- Standard File Control Block ..................................... 7**15
-
- The standard file control block is defined as follows, with offsets
- in hex:
-
- ┌───────────────────────────────────────────────────────────────────────┐
- │ F I L E C O N T R O L B L O C K │
- ├───────┬─────────┬─────────────────────────────────────────────────────┤
- │offset │ size │ Function │
- ├───────┼─────────┼─────────────────────────────────────────────────────┤
- │ 0 │ 1 byte │ Drive number. For example: │
- │ ├─────────┴─────────────────────────────────────────────────────┤
- │ │ Before open: 00h = default drive │
- │ │ 01h = drive A: │
- │ │ 02h = drive B: etc. │
- │ │ After open: 00h = drive C: │
- │ │ 01h = drive A: │
- │ │ 02h = drive B: etc. │
- │ │ A zero is replaced by the actual drive number during opening. │
- ├───────┼─────────┬─────────────────────────────────────────────────────┤
- │ 1-8 │ 8 bytes │ Filename, left justified with blanks. │
- │ ├─────────┴─────────────────────────────────────────────────────┤
- │ │ If a reserved device name is placed here (such as PRN) do not │
- │ │ include the optional colon. │
- ├───────┼─────────┬─────────────────────────────────────────────────────┤
- │ 9-B │ 3 bytes │ Filename extension, left justified with trailing │
- │ │ │ blanks. │
- ├───────┼─────────┼─────────────────────────────────────────────────────┤
- │ C-D │ 2 bytes │ Current block # relative to start of file, starting │
- │ │ │ with 0 │
- │ ├─────────┴─────────────────────────────────────────────────────┤
- │ │ (set to 0 by the OPEN function call). A block consists of │
- │ │ 128 records, each of the size specified in the logical record │
- │ │ size field. The current block number is used with the current│
- │ │ record field (below) for sequential reads and writes. │
- ├───────┼─────────┬─────────────────────────────────────────────────────┤
- │ E-F │ 2 bytes │ Logical record size in bytes. │
- │ ├─────────┴─────────────────────────────────────────────────────┤
- │ │ Set to 80h by OPEN function. If this is not correct, you │
- │ │ must set the value because DOS uses it to determine the │
- │ │ proper locations in the file for all disk reads and writes. │
- ├───────┼─────────┬─────────────────────────────────────────────────────┤
- │ 10-13 │ 4 bytes │ File size in bytes. │
- │ ├─────────┴─────────────────────────────────────────────────────┤
- │ │ In this field, the first word is the low-order part of the │
- │ │ size. │
- ├───────┼─────────┬─────────────────────────────────────────────────────┤
- │ 14-15 │ 2 bytes │Date file was created or last updated. │
- │ ├─────────┴─────────────────────────────────────────────────────┤
- │ │ MM/DD/YY are mapped as follows: │
- │ │ 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 │
- │ │ y y y y y y y m m m m d d d d d │
- │ │ where: mm is 1-12 │
- │ │ dd is 1-31 │
- │ │ yy is 0-119 (1980-2099) │
- ├───────┼────────┬──────────────────────────────────────────────────────┤
- │ 16-17 │ 2 bytes│ Time file was created or last updated. │
- ├───────┼────────┴──────────────────────────────────────────────────────┤
- │ │ These bytes contain the time when the file was created or │
- │ │ last updated. The time is mapped in the bits as follows: │
- │ ├───────────────────────────────┬───────────────────────────────┤
- │ │ B Y T E 16h │ B Y T E 17h │
- │ ├───────────────────────────────┼───────────────────────────────┤
- │ │ F E D C B A 9 8 │ 7 6 5 4 3 2 1 0 │
- │ ├───────────────────┬───────────┴───────────┬───────────────────┤
- │ │ H H H H H │ M M M M M M │ D D D D D │
- │ ├───────────────────┼───────────────────────┼───────────────────┤
- │ │ binary # hrs 0-23 │ binary # minutes 0-59 │ bin. # 2-sec incr │
- │ ├───────────────────┴───────────────────────┴───────────────────┤
- │ │ note: The time is stored with the least significant byte first│
- ├───────┼────────┬──────────────────────────────────────────────────────┤
- │ 18-19 │ 2 bytes│ Reserved for DOS. │
- ├───────┼────────┼──────────────────────────────────────────────────────┤
- │ 20 │ 1 byte │ Current relative record number. │
- │ ├────────┴──────────────────────────────────────────────────────┤
- │ │ (0-127) within the current block. This field and the Current │
- │ │ Block field at offset 0Ch make up the record pointer. This │
- │ │ field is not initialized by the OPEN (0Fh) function call. │
- │ │ You must set this field before doing sequential read-write │
- │ │ operations to the diskette. To read the first record of a │
- │ │ file, set this value to zero. │
- ├───────┼─────────┬─────────────────────────────────────────────────────┤
- │ 21-25 │ 4 bytes │ Relative Record. │
- │ ├─────────┴─────────────────────────────────────────────────────┤
- │ │ Points to the currently selected record, counting from the │
- │ │ beginning of the file starting with 0. This field is not │
- │ │ initialized by the OPEN system call. You must set this field │
- │ │ before doing a random read or write to the file. │
- │ │ If the record size is less than 64 bytes, both words are │
- │ │ used. Otherwise, only the first 3 bytes are used. Note that │
- │ │ if you use the File Control Block at 5Ch in the program │
- │ │ segment, the last byte of the FCB overlaps the first byte of │
- │ │ the unformatted parameter area. │
- └───────┴───────────────────────────────────────────────────────────────┘
-
- note 1) An unopened FCB consists of the FCB prefix (if used), drive
- number, and filename.ext properly filled in. An open FCB is
- one in which the remaining fields have been filled in by the
- CREAT or OPEN function calls.
- 2) Bytes 0-5 and 32-36 must be set by the user program. Bytes 16-
- 31 are set by DOS and must not be changed by user programs.
- 3) All word fields are stored with the least significant byte
- first. For example, a record length of 128 is stored as 80h at
- offset 14, and 00h at offset 15.
-
- Oddly, when Microsoft added the handle calls to DOS they still left
- the old FCB calls with a few advantages. Handle calls still can't
- read volume labels or directory files and don't support wild card
- deletions. Microsoft has always claimed that they would eventually
- fix these weaknesses, but we're up to DOS 6.0 and it isn't soup yet.
-
- Microsoft has always hinted that they would eventually drop FCB
- support from DOS. Since many compiler runtime libraries depend on FCB
- calls since they are the only ones portable across all DOS versions, a
- lot of existing (expensive) commercial software would no longer run.
- Also note that even the OS/2 Compatibility Box supports FCB calls.
-
- Many of the handle calls are simply "front ends" for the existing
- FCB code anyway. It's unlikely the FCB calls will ever vanish from
- DOS.
-
-
- Extended File Control Block ..................................... 7**16
-
- The extended file control block is used to create or search for
- files in the disk directory that have special attributes.
-
- It adds a 7 byte prefix to the FCB, formatted as follows:
-
- ┌────────────────────────────────────────────────────────────────────────┐
- │ E X T E N D E D F I L E C O N T R O L B L O C K │
- ├───────┬─────────┬──────────────────────────────────────────────────────┤
- │Offset │ Size │ Function │
- ├───────┼─────────┼──────────────────────────────────────────────────────┤
- │ 00h │ 1 byte │ Flag byte containing 0FFh to indicate an extended FCB│
- ├───────┼─────────┼──────────────────────────────────────────────────────┤
- │ 01h │ 4 bytes │ Reserved by Microsoft │
- ├───────┼─────────┼──────────────────────────────────────────────────────┤
- │ 06h │ 2 bytes │ Attribute byte │
- │ ├─────┬───┼──────────────────────────────────────────────────────┤
- │ │ hex │bit│ meaning │
- │ ├─────┼───┼──────────────────────────────────────────────────────┤
- │ │ 00h │ │ (no bits set) normal; can be read or written without │
- │ │ │ │ restriction │
- │ │ 01h │ 0 │ file is marked read-only. An attempt to open the │
- │ │ │ │ file for output using int 21h/fn 3Dh will fail and │
- │ │ │ │ an error code will be returned. This value can be │
- │ │ │ │ used with other values below. │
- │ │ 02h │ 1 │ indicates a hidden file. The file is excluded from │
- │ │ │ │ normal directory searches. │
- │ │ 04h │ 2 │ indicates a system file. The file is excluded from │
- │ │ │ │ normal directory searches. │
- │ │ 08h │ 3 │ indicates that the entry contains the volume label │
- │ │ │ │ in the first 11 bytes. The entry has no other │
- │ │ │ │ usable information and may exist only in the root │
- │ │ │ │ directory. │
- │ │ 10h │ 4 │ indicates that the file is a subdirectory │
- │ │ 20h │ 5 │ indicates an archive bit. This bit is set to on │
- │ │ │ │ whenever the file is written to and closed. Used by │
- │ │ │ │ BACKUP and RESTORE. │
- │ │ │ 6 │ reserved, set to 0 │
- │ │ │ 7 │ reserved, set to 0 │
- │ ├─────┴───┴──────────────────────────────────────────────────────┤
- │ │ note 1) Bits 6 and 7 may be used in OS/2. │
- │ │ note 2) Attributes 08h and 10h cannot be changed using │
- │ │ int21/43h. │ │
- │ │ note 3) The system files IBMBIO.COM and IBMDOS.COM (or │
- │ │ customized equivalent) are marked as read-only, hidden,│
- │ │ and system files. Files can be marked hidden when │
- │ │ they are created. │
- │ │ note 4) Read-only, hidden, system and archive attributes may │
- │ │ be changed with int21h/fn43h. │
- │ │ │
- │ │ Refer to int 21h/fn11h (Search First) for details on using the │
- │ │ attribute bits during directory searches. This function is │
- │ │ present to allow applications to define their own files as │
- │ │ hidden (and thereby excluded from normal directory searches) │
- │ │ and to allow selective directory searches │
- └───────┴────────────────────────────────────────────────────────────────┘
-
- Any reference in the DOS function calls to an FCB, whether opened or
- unopened, may use either a normal or extended FCB. If you are using
- an extended FCB, the appropriate register should be set to the first
- byte of the prefix, rather than the drive-number field.
-
- Common practice is to refer to the extended FCB as a negative offset
- from the first byte of a standard File Control Block.
-
-
- Disk Transfer Area .............................................. 7**17
-
- The old-style (DOS 1.x compatible) FCB-oriented function calls use a
- buffer called the Disk Transfer Area (DTA) for disk access. Use of
- the DTA is documented in Chapter 6, "DOS Memory Control Blocks and
- Work Areas."
-
-
-