DIFFERENCES AND NEW ADDITIONS TO THE INT 24H HARD ERROR HANDLER(s) FOR MSDOS 2.0 1.) Additional Constraints: Under previous versions it was not explicitly stated that an INT 24H handler must preserve the ES register. It is now required that INT 24H handlers preserve ES. When it is desired to ignore an error, the same registers must be preserved as when it is desired to retry the operation (SS,SP,DS,BX,CX,DX). It was not clearly stated in the past, but it was true, that only system calls 1-12 can be made by an INT 24H handler. Making any other calls will destroy the DOS stack and thus its ability to retry or ignore an error. INT 24H Handlers should always return to the DOS on a retry, ignore, or abort. Failure to return to the DOS will leave the DOS in an unstable state until a non 1-12 function call is made. 2.) Additional features: Character device errors are now handled by the INT 24H mechanism. Previously only Disk I/O errors were handled by the INT 24H handler. Additional information is now passed to the INT 24H handler in the BP and SI registers (which need not be preserved). BP:SI is a DWORD pointer to the Device Header of the device causing the error. Information can be gotten from this header as to whether the device is a block or character device, and if the device is a character device the name of the device can also be obtained. The DEVICE-DRIVERS document for 2.0 contains the definition of this header format. NOTE: AL (drive number for Disk errors) is indeterminate on character device errors. Bit 7 of AH is always 1 for character device errors, previously bit 7 was 1 only in the case of a bad memory image of the FAT. LIST OF INT 24H ERROR CODES PASSED IN DI 0 Write Protect violation 1 Unknown Unit NEW 2 Drive not ready 3 Unknown command NEW 4 CRC error 5 Bad Drive Request Structure length NEW 6 Seek error 7 Unknown media NEW 8 Sector not found 9 Printer out of paper NEW A Write Fault B Read Fault NEW C General Failure As mentioned above BP:SI points to the device header: BP:SI-> +--------------------------------------+ | DWORD Pointer to next device | | (-1 if last device) | +--------------------------------------+ | WORD Attributes | | Bit 15 = 1 if char device 0 if blk | | if bit 15 is 1 | | Bit 0 = 1 if Current sti device | | Bit 1 = 1 if Current sto output | | Bit 2 = 1 if Current NUL device | | Bit 3 = 1 if Current CLOCK dev | | Bit 14 is the IOCTL bit (see below) | | Bit 13 is the NON IBM FORMAT bit | +--------------------------------------+ | WORD Pointer to Device strategy | | entry point | +--------------------------------------+ | WORD Pointer to Device interrupt | | entry point | +--------------------------------------+ | 8-BYTE character device name field | | Character devices set a device name | | For block devices the first byte is | | The number of units | +--------------------------------------+ To tell if the error occured on a block or character device you must 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.