Networking FreeDOS - NDIS driver
(Picture: Overview of the NDIS architecture)
Drivers based on the "Network Driver Interface Specification" (NDIS)
are the default in the Windows world. The most recent version is NDIS
6 which is used in Windows Vista. Windows 98 used NDIS 5, Windows 95
came with NDIS 3.1. In DOS you have to use the real-mode driver NDIS2.
Where to find them
It is most likely a NDIS driver exists for your network card. Look for
a directory called "NDIS2" in your cards installation files. If you
can't find a driver, take a look at this site (see: http://
drivesnapshot.de/en/makebootdisk.htm (*01)). The ending of the driver
name has to be *.DOS, so for instance the driver of the 3Com 3C574
PC-Card is called "EL3C574.DOS".
How they work
In the language of the NDIS architecture these drivers are called
"Media Access Control" (MAC) drivers.
The MAC driver is only one component of the NDIS architecture as you
can see in the figure above. According to the NDIS 2.1 documentation
(see: http://www.ndis.com/faq/ndis201.txt (*02)) NDIS seems to work
* Commands in FDCONFIG.SYS (FreeDOS) or CONFIG.SYS (other DOS) load
the Protocol Manager driver PROTMAN.DOS, the MAC driver and the
protocol driver. This can be done by lines for each of these drivers
or by starting the "Installable File System Helper" driver, which
is loaded by "DEVICEHIGH=IFSHLP.SYS" and starts the Protocol
Manager, the MAC and the protocol drivers according to
* The Protocol Manager reads the configuration from PROTOCOL.INI and
makes them available to the MAC driver and protocol driver which
load after it.
* The MAC driver and the protocol driver load and configure
themselves according to that information. They identify themselves
to the Protocol Manager.
* Before MAC driver and protocol driver can communicate, they have
to be bound together, so they can access each others "entry points"
(communication ports). This bind process is controlled by the
Protocol Manager based on information in PROTOCOL.INI.
* The binding sequence can be triggered by NET.EXE or NETBIND.COM
(which can be done in AUTOEXEC.BAT).
* The Protocol Manager (PROTMAN.DOS) then starts the memory resident
(Terminate and Stay Resident - TSR) program PROTMAN.EXE to execute
the bind command and to control the correct ordering of drivers.
* After binding has occurred, the MAC and the protocol driver communi-
cate directly to each other. The Protocol Manager is not involved
in this communication process any longer, so NETBIND.COM frees most
of the memory previously reserved by the Protocol Manager.
The configuration of NDIS under DOS has changed over time with different
versions of the package. Some hints about the differences can be found
here (see: http://www.yale.edu/pclt/WINWORLD/NDIS.HTM (*03)). In this
document, I am assuming that we use the NDIS files shipped with
MS client 3.0.
As this section is all about getting packet driver based TCP/IP appli-
cations up and running with DOS we will not go into details about
MS client here, this is already explained elsewhere.
Additional files needed
So how can we use the NDIS2 MAC driver that came with our network
interface card for TCP/IP networking? As we have learned from the
description above, we need some more files. These are:
* The Protocol Manager ("PROTMAN.DOS" and "PROTMAN.EXE")
* The bind utility ("NETBIND.COM")
These files are part of the MS client 3.0 which can be downloaded here:
The three files mentioned are part of "DSK3-1.EXE". Use the utility
"EXPAND.EXE" included on the first disk to uncompress these files.
* Copy DSK3-1.EXE to a directory like C:\MSCLIENT1. Avoid a long path
if you do this in Windows. 16-bit software won't execute, if the
path is too long.
* Run DSK3-1.EXE to unpack its content.
* Decompress PROTMAN.DO_ and PROTMAN.EX_.
expand -r protman.do_
expand -r protman.ex_
* NETBIND.COM is already uncompressed. Now you can take and use the
Read the LICENSE.TXT file before you start using the files. The software
is free for internal use. Neither the distribution nor a modification
The last piece we need is the "Packet Driver to NDIS Converter". Get the
widely used "DIS_PKT9.DOS" (version 9, see: ftp://ftp.cc.umanitoba.ca/
software/pc_network/dis_pkt9.zip (*06)) or alternatively the slightly
newer (version 11) "DIS_PKT.DOS"(see: http://danlan.com/pdr_shim/odipkt/
odipkt.zip (*07)). There are no differences in usage and handling.
Both were written by Prof. Joe R. Doupnik (Utah State University) and
Dan Lanciani (Harvard University). The copyright holds the now historic
FTP Software, Inc., which luckily released this driver as public
domain, free for use, distribution, change and with sourcecode.
Configuration of NDIS drivers
As I already mentioned, this is just a minimal installation of the
MS client 3.0. The only purpose is to use packet-driver-based TCP/IP
applications. For this purpose:
Copy the four files
into a directory, for instance C:\NET.
Copy also the MAC driver of your network interface card, for instance:
into this directory.
Now we have to create the configuration file needed for the NDIS
architecture: Create a file with the name PROTOCOL.INI inside the
C:\NET directory. For our minimal configuration it just needs the
--- PROTOCOL.INI ---
Explanation of the parameters:
Like other *.ini files, PROTOCOL.INI is structured into section names
in square brackets and item names with values assigned to them.
The first section [protman] defines the Protocol Manager. Like
described above, the Protocol Manager is loaded as driver PROTMAN.DOS
which is called "PROTMAN$" here. Section and line are mandatory.
The section [EL3C574] defines the network interface card. By default
the section itself is named after the card - this is useful, if you
have more than one network card and use different sections for
different cards. So the section name is the first value to change
here. It would be a good idea to name it after your own network card.
But you may as well rename the section to "netcard", "NIC" or even
"baked_beans" - whatever you like, as long as you also change all the
other lines in PROTOCOL.INI that point to that section.
The next line of this section is "DriverName=EL3C574$". It defines the
driver for the network interface card. In our example this is
EL3C574.DOS, which is called "EL3C574$" here. Most certainly you will
use a different NIC than the one mentioned in the example. So you will
have to change this line. You find the correct name of the driver in
a text-file called "PROTOCOL.INI" that should be part of the NDIS
driver files supplied with your card.
It is also possible to add more lines to this section, so you can define
special settings for your network card. Consult the "PROTOCOL.INI"
supplied with your NDIS driver for more information. But in many cases
the line with the drivername should be enough.
The next section "[PKTDRV]" defines our Packet Driver to NDIS
Converter, which is "DIS_PKT.DOS" or "DIS_PKT9.DOS". Both are called
by the name "PKTDRV$".
It is important that the converter will bind to the driver of the
network card. This is done by the next line "bindings=EL3C574". Please
note that this name includes no "$" letter - it refers to the
name of the section that defines the driver, not to the driver itself.
So if you had called this section "[baked_beans]" as suggested above,
you'd have to write "bindings=baked_beans" here ;-).
The item "intvec" specifies the software interrupt vector used by the
packet driver interface. As already explained, this should be the
hexadecimal value 0x60 per default.
The "chainvec" item also defines an available software interrupt. Its
function is still a mystery to me. According to packet driver inventor
17b6041f7a3cde7c?dmode=source (*08)) FTP, adding a chain vector
interrupt may improve packet processing speed and reliability. Users
saw "a 10-fold increase in performance" (see: http://groups.google.de/
To avoid EMM386 errors, some recommend (see: http://groups.google.de/
to set an interrupt that increases the vector by decimal 8. So if the
intvec is 0x60 (that is decimal 96), then the chainvec should be
decimal 104 (96+8) which is hexadecimal 0x68. This is also described
msg/64f2b6060ff2b438?dmode=source (*11)) by one of the authors of
DIS_PKT.DOS, Dan Lanciani. Please write if you find out more.
These are all settings in PROTOCOL.INI needed for our purpose. A last
hint: If you consider changing some of these values at each boot, for
instance by choices presented by a DOS boot menu, you may find Horst
Schaeffer's freeware "Inifile" helpful (see: http://www.horstmuc.de/
The last thing left to do now is to load the drivers at boot. So
change your system files to contain the following lines:
--- FDCONFIG.SYS (FreeDOS) ---
--- or CONFIG.SYS (MS DOS/other DOS) ---
The "/I" parameter tells the Protocol Manager the location of
PROTOCOL.INI. This is not needed if both are in the same directory.
--- AUTOEXEC.BAT ---
Note that NETBIND.COM can not be loaded high and should just be exe-
cuted from AUTOEXEC.BAT. If you try to load it like a driver, it will
abort with the message "run-time error R6009 - not enough space for
That's all. Reboot the system and use a simple TCP/IP application
like ping to test if everything is working.
(Picture: Boot messages of NDIS)
Copyright (C) 2007 Ulrich Hansen, Mainz (Germany), modified 2010
and 2020 by W.Spiegl.
For more information see here.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation.
A copy of the license is included in the section entitled
"GNU Free Documentation License 1.2".