[comp.sys.ibm.pc] LIST OF UNDOCUMENTED DOS INT 21H FUNCTIONS: v1.0, mostly complete.

pete@octopus.UUCP (04/05/87)

Thanks to information supplied by various people, and some sleuthing on my
part, I present for your interest some documentation for the undocumented
MS-DOS Int 21H functions. There are gaps in what we know- any corrections
or additions would be greatly appreciated!

Thanks again for all the help - there's more interest in this than I expected!

----------- cut here -------------

              Undocumented DOS INT 21H Functions, Rev 1.0: 4/4/87

Compiled by     Pete Holzmann          ({pyramid}!octopus!pete)
                Octopus Enterprises    408/996-7746
                19611 La Mar Court
                Cupertino, CA 95014

Many of the details for this list were compiled (thank you!!!) by
        Mike Morearty (...!ucbvax!cory!morearty), with a few more added
        by Ed Nather (ut-sally!nather) and myself.

Some functions are still unknown. Portions of others (especially 52) are
also unknown. Please send updates to me (octopus!pete). This information
has been checked in general for DOS versions 2.0 through 3.2.

18   Function unknown.  (Function numbers are in hex).
1D   Function unknown.
1E   Function unknown.
1F   Same as function call 32h (below), except that the table is
     accessed from the default drive, and under DOS 1, the table
     format is slightly different.  Returns AL=0 if no error,
     DS:BX points to DOS Disk Block for default drive.
20   Function unknown.
32   Read DOS Disk Block.  DL contains drive (0=default, 1=A,
     etc.).  On return, AL=00 if drive exists, FF otherwise;
     DS:BX points to DOS Disk Block.  Format of block:
          Bytes     Value
          00        Drive: 0=A, 1=B, etc.
          01        Unit within drive (0, 1, 2, etc.)
          02-03     Bytes per sector
          04        Sectors per cluster - 1
          05        Cluster to sector shift (i.e., how far to
                    shift-left the bytes/sector to get
                    bytes/cluster)
          06-07     Number of reserved (boot) sectors
          08        Number of FATs
          09-0A     Number of root directory entries
          0B-0C     Sector # of 1st data. Should be same as # sectors/track.
          0D-0E     # of clusters + 1 (=last cluster #)
          0F        Sectors for FAT
          10-11     Sector number of directory
          12-15     (Dword) address of device header
          16        Media Descriptor Byte
          17        Zero if disk has been accessed
          18-1B     (Dword) address of next DOS Disk
                    Block (FFFF means last in chain)
34   Returns ES:BX pointing to Critical Section Flag, byte
     indicating whether DOS calls are OK now (0 means safe).
     Reportedly NOT completely reliable.  The byte at ES:BX+1 is
     used by the Print program for this same purpose, so it's
     probably safer to check the WORD at ES:BX.
37   Get/set option marking character (i.e. usually "/").  AL=0
     to return character in DL, 1 to set from DL. In DOS 2, also can get/set
     forced-/DEV flag (if set, /DEV/ must preceed device names; otherwise
     it is optional): AL=2 to return flag in DL, AL=3 to set from DL (0 = set,
     1 = not set).
50   Set new current Program Segment Prefix (PSP) from segment
     number in BX.
51   Gets current PSP into BX.


52   Returns ES:BX pointing to the DOS list of lists, for disk
     information.  Does not access the disk, so information in
     tables might be incorrect if the disk has been switched.
        Returns a pointer to the following array of longword pointers:
        Bytes   Value
        0-3     Pointer to first DOS disk block (see func 36H)
        4-7     Partially Unknown. Pointer to a device driver. Maybe first
                        resident driver?
        8-B     Partially Unknown. Pointer to a device driver. Maybe first
                        resident character device driver?
        C-F     Pointer to actual CON: device driver, whether installable
                        or resident
        10-11   Unknown. 0200H. A byte/blocksize value???
        12-15   Unknown. Pointer to current directory block????
        16-19   Partially Undefined: Pointer to array of drive info:
                        51H bytes per drive, starting with A: ...
                        00-3F Current path as ASCIIZ, starting with 'x:\'
                        40-43 Unknown. I see zeros always
                        44    Unknown. Flags? I see 40H, except for
                                entry after last valid entry = 00H
                        45-48 Pointer to DOS Disk Block for this drive
                        49-4A Unknown. Current track or block? -1 if never
                                accessed.
                        4B-4E Unknown. I see -1 always
                        4F-52 Unknown. I see 2 always
        1A-1D   Unknown. Pointer to data area, maybe including cluster
                        allocation table?
        1E-1F   Unknown. I see zero always
        20      Unknown. May be number of block devices.
        21      Unknown. May be number of resident devices or ??? (5 always)
        22      Beginning (not a pointer. The real beginning!) of NUL device
                    driver. This is the first device on DOS's linked list
                    of device drivers.
53   Translates BPB (Bios Parameter Block, see below)
     into a DOS Disk Block (see function call 32h).  Pass DS:SI
     pointing to BPB, ES:BP pointing to area for DOS Disk Block.
55   Create PSP: similar to function 26h (which creates a new
     Program Segment Prefix at segment in DX) except creates a
     "child" PSP rather than copying the existing one.  Input:
     DX=segment number at which to create new PSP.
5D   Function unknown.
60   Function unknown.
61   Function unknown.

Note: Function 53h converts a BPB to a DOS Disk Block. To go the other
        way, use the following algorithm:

         BPB     
        Bytes   Value
        0-1     Bytes/sector. Get from DDB bytes 2-3.
        2       Sectors/cluster. Get from: (DDB byte 4) + 1
        3-4     Reserved sectors. Get from: DDB bytes 6-7
        5       Number of FATs. Get from: DDB byte 8
        6-7     Number of root dir entries. Get from: DDB bytes 9-A
        8-9     Total # of sectors. Get from: 
                 ((DDB bytes D-E) - 1) * (sectors per cluster (BPB byte 2))
                   + (DDB Bytes B-C)
        A       Media descriptor byte. Get from: DDB byte 16
        B-C     Number of sectors/FAT. Get from: DDB byte F
        
---- End Of List ----
-- 
  OOO   __| ___      Peter Holzmann, Octopus Enterprises
 OOOOOOO___/ _______ USPS: 19611 La Mar Court, Cupertino, CA 95014
  OOOOO \___/        UUCP: {hplabs!hpdsd,pyramid}!octopus!pete
___| \_____          Phone: 408/996-7746