DOS Variables Block (List of Lists)

 This is the undocumented format of the structure whose address is returned
 in ES:BX by the undocumented DOS fn 52H.  This data can be used to learn
 low-level information such as how many drive IDs are recognized and the
 address of the base MemBlockRec.

  Offset Size Contents
  ▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  -2      2   wBaseMemSeg  ES:[BX-2] is seg of first Memory Control Block
  +0      4   prBaseDPB    address of first Drive Parameter Block (DPB)
  +4      4   pHandleTbl   address of first system file table
  +8      4   prClockDev   address of CLOCK device header
  +0cH    4   prConDev     address of CON device header
  +10H    2   wMaxSect     maximum sector size for block devices
  +12H    4   pbCache      address of cache head buffer
  +16H    4   parDirs      address of the CurDirRec structure array
  +1aH    4   prFcbTbl     address of system FCB file table
  +1eH    2   wFcbCnt      size of FCB table file table
  +20H    1   bDriveCnt    number of drives in system
  +21H    1   bLastDrive   corresponds to Config.sys LASTDRIVE
          34               size of a DOSVarsRec
  +22H    18  rNulDevHdr   the DevHdrRec for the NUL device (the start of
                           device driver chain).

 wBaseMemSeg  The segment address of the "base MemBlockRec"  This is the
              lowest allocation in memory.  It may be owned by DOS or

              Note: This value is located two bytes before the structure
              itself; i.e., after calling fn 52H, it is at ES:[BX-2].

   prBaseDPB  The first Drive Parameter Block.  You can trace the DPB chain
              by accessing the pfrNextDPB field of each structure.
  pHandleTbl  Internal info on each open file (?)
  prClockDev  Address of the DevHdrRec for the CLOCK device
    prConDev  Address of the DevHdrRec for the CON device
    wMaxSect  Largest allowed sector size for block devices (?)
     pbCache  FAR address of DOS's internal disk buffers
     parDirs  FAR address of an array of 88-byte CurDirRec structures.  The
              first item in each structure is an ASCIIZ string that names
              the current default directory for one drive.  There are
              bDriveCnt such records, placed sequentially in memory.
    prFcbTbl  Address of the system FCBRec file table (?)
     wFcbCnt  Number of FCBRecs in the system FCB table
   bDriveCnt  Number of drives (including logical drives) known to the
              system (does not include network drives).
  bLastDrive  A count of the elements in the list pointed to by pparDirs.
              For instance, if you specified LASTDRIVE=Z in your CONFIG.SYS
              file, then this value will be 24 (18H).

  rNulDevHdr  is the actual 18-byte DevHdrRec of the NUL device.  This is
              the start of the device driver chain.  You can locate all
              device drivers by examining the chain of far pointers whose
              first link is at ES:[BX+22H].  It is a 4-byte pointer to the
              next driver.

   Notes: ■ You can use the wBaseMemSeg as the segment address to start
            tracing the memory allocation chain.  You can recognize a PSP
            since it begins with an INT 20H (ie, cd 20).  At offset 2cH of
            a PSP is the address of the DOS environment segment for that
            process (from which you may be able to obtain the fill filespec
            of the program which owns it).

          ■ This structure has apparently been intact since DOS 2.0, but
            Microsoft continues to leave it undocumented as late as 6.0.

See Also: System Information Functions
          fn 52H (get DOS vars address)
          Data Structures