ID Number: Q29284
3.x 4.00 4.00a 4.01 4.01a 5.00
MS-DOS
Summary:
SYMPTOMS
In MS-DOS versions 3.3 and later, multiple device drivers cannot be
integrated (contained) in a single file.
CAUSE
When a device driver is loaded, its INIT routine is called. This
INIT routine must return the new pointer to the available free
memory (past the end of the driver).
In MS-DOS 3.3, a feature was added so that if the break address
returned by the driver is the same as the break address entered
before the driver's INIT was called (that is, the driver is not
allocating any memory), the driver is aborted. As a result, it is
not added to the device driver chain.
This feature allows drivers to intentionally abort themselves if,
for example, some hardware cannot be initialized. However, this can
lead to problems if you have more than one device driver in a
single file, because when doing this, it is common practice to share
a lot of code and data. As a consequence, the INIT functions for
the different drivers will often return the same break address.
After the first driver is initialized, the break address it returns
is recorded as the new system break address. Then, the subsequent
drivers return the same break address when they are initialized.
This invokes the special case outlined above: the system thinks the
driver wants itself to be aborted. As a result, the driver is
removed from the chain.
RESOLUTION
For MS-DOS versions 3.3 and later, the code that checks the break
address returned by the driver only compares the segment part of
the address to the previous segment. It also compares the offset
part to zero (0). Thus, if the break address returned by the driver
does not have an offset of zero, the driver will not be aborted
under any circumstance.
Additional reference words: 3.x 4.00 4.00a 4.01 4.01a 5.00