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.

DosVarsRec
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.

fn 52H (get DOS vars address)
- -

DOS Variables Block (List of Lists)