| |
Interrupt 24h Critical Error Handler
When a critical error occurs within DOS, control is transferred
to an error handler with an int 24h. This may be the standard DOS
error handler (ABORT, RETRY, IGNORE) or a user-written routine.
On entry to the error handler, AH will have its bit 7=0 (high
order bit) if the error was a disk error (probably the most
common error), bit 7=1 if not.
BP:SI contains the address of a Device Header Control Block from
which additional information can be retrieved (see below).
The register is set up for a retry operation and an error code is
in the lower half of the DI register with the upper half
undefined. See the seperate section for error codes
The user stack is in effect and contains the following from top
to bottom:
IP DOS registers from issuing int 24h
CS int 24h
flags
AX user registers at time of signal
BX int 21h request
CX
DX
SI
DI
BP
DS
ES
IP from original int 21h
CS
flags
To reroute the critical error handler to a user-writen critical
error handler, the following should be done:
Before an INT 24h occurs:
1) The user application initialization code should save the int
24h vector and replace the vector with one pointing to the
user error routine.
When the int 24h occurs:
2) When the user error routine received control it should push
the flag registers onto the stack and execute a far call to
the original int 24h vector saved in step 1.
3) DOS gives the appropriate prompt, and waits for user input
(Abort, Retry, Ignore, Fail). After the user input, DOS
returns control to the user error routine instruction
following the far call.
4) The user error routine can now do any tasks nescessary. To
return to the original application at the point the error
occurred, the error routine needs to execute an IRET
instruction. Otherwise, the user error routine should remove
the IP, CS, and flag registers from the stack. Control can
then be passed to the desired point.
INT 24h provides the following values in registers on entry to
interrupt handler:
Input |
DOS1 |
Y |
DOS2 |
Y |
DOS3 |
Y |
DOS5 |
Y |
Output |
AX |
Status
Byte |
Drive
Number |
|
Operation |
AX |
BX |
|
|
|
|
BX |
CX |
|
|
|
|
CX |
DI |
Error
Code |
|
|
DX |
BP:SI |
Addr
of a Device Header Ctrl Blck |
|
CF |
Status
Byte |
Bit |
Dec |
Hex |
Description |
0 |
1 |
01h |
Operation: 0
= Read
1
= Write |
1 |
2 |
02h |
Area of
Disk: 00 = DOS Area
01
= FAT
10
= Root Directory
11
= Data Area |
2 |
4 |
04h |
3 |
8 |
08h |
FAIL allowed |
4 |
16 |
10h |
RETRY allowed |
5 |
32 |
20h |
IGNORE allowed |
6 |
64 |
40h |
Not Used |
7 |
128 |
80h |
Disk I/O Error if zero |
Drive Number: 0=A:, 1=B:, etc.
Error Codes: (Note: high byte is undefined)
Error Code Description
00h Attempt to write on write-protected diskette
01h Unknown unit
02h Drive not ready
03h Unknown command
04h Data error (bad CRC)
05h Bad request structure length
06h Seek error
07h Unknown media type
08h Sector not found
09h Printer out of paper
0Ah Write fault
0Bh Read fault
0Ch General failure
0Fh Invalid disk change (DOS 3.x)
Returned Operation:
00h Ignore the error
01h Retry the operation
02h Terminate via int 22h
03h Fail the system call that is in progress (DOS 3.2+)
Notes:
1) Be careful when choosing to ignore a response because this
causes DOS to beleive that an operation has completed
successfully when it may not have.
2) If the error was a character device, the contents of AL are
invalid.
Other Errors
If AH bit 7=1, the error occurred on a character device, or was
the result of a bad memory image of the FAT. The device header
passed in BP:SI can be examined to determine which case exists.
If the attribute byte high-order bit indicates a block device,
then the error was a bad FAT. Otherwise, the error is on a
character device.
If a character device is involved, the contents of AL are
unpredictable, the error code is in DI as above.
Notes:
1. Before giving this routine control for disk errors, DOS
performs several retries. The number of retries varies
according to the DOS version.
2. For disk errors, this exit is taken only for errors
occurring during an int 21h function call. It is not used
for errors during an int 25h or 26h.
3. This routine is entered in a disabled state.
4. All registers must be preserved.
5. This interrupt handler should refrain from using DOS
function calls. If necessary, it may use calls 01h through
12h. Use of any other call destroys the DOS stack and leaves
DOS in an unpredictable state.
6. The interrupt handler must not change the contents of the
device header.
7. If the interrupt handler handles errors itself rather than
returning to DOS, it should restore the application
program's registers from the stack, remove all but the last
three words on the stack, then issue an IRET. This will
return to the program immediately after the int 21h that
experienced the error. Note that if this is done DOS will be
in an unstable state until a function call higher than 12h
is issued, therefore not recommended.
8. For DOS 3.x, IGNORE requests (AL=0) are converted to FAIL
for critical errors that occur on FAT or DIR sectors.
9. For DOS 3.10 up, IGNORE requests (AL=0) are converted to
FAIL requests for network critical errors (50-79).
The device header pointed to by BP:SI is as follows:
DWORD Pointer to next device (0FFFFh if last device)
WORD Attributes:
Attributes |
Bit |
Dec |
Hex |
Description |
0 |
1 |
0001h |
Standard Input
(Char only) |
1 |
2 |
0002h |
Standard Output (Char
only) |
2 |
4 |
0004h |
NULL
(Char only) |
3 |
8 |
0008h |
Clock
(Char only) |
4 |
16 |
0010h |
Not Used |
5 |
32 |
0020h |
6 |
64 |
0040h |
7 |
128 |
0080h |
8 |
256 |
0100h |
9 |
512 |
0200h |
10 |
1024 |
0400h |
11 |
2048 |
0800h |
12 |
4096 |
1000h |
13 |
8192 |
2000h |
14 |
16384 |
4000h |
IOCTL |
15 |
32768 |
8000h |
Character Device |
WORD pointer to device driver strategy entry point
WORD pointer to device driver interrupt entry point
8-BYTE character device named field for block devices. The first
byte is the number of units. To tell if the error
occurred on a block or character device, look at bit 15
in the attribute field (WORD at BP:SI+4). If the name of
the character device is desired, look at the eight bytes
starting at BP:SI+10.
Handling of Invalid Responses (DOS 3.x)
A) If IGNORE (AL=0) is specified by the user and
IGNORE is not allowed (bit 5=0), make the response
FAIL (AL=3).
B) If RETRY (AL=1) is specified by the user and RETRY
is not allowed (bit 4=0), make the response FAIL
(AL=3).
C) If FAIL (AL=3) is specified by the user and FAIL
is not allowed (bit 3=0), make the response ABORT.
(AL=2)
See Also Func/59h |