home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 14 Text / 14-Text.zip / ndis2.zip / ndis_con.asc
Text File  |  1992-06-22  |  58KB  |  1,193 lines

  1.  
  2.  
  3.  
  4.  
  5.                              NDIS Concepts
  6.  
  7.         The following article originally appeared in the Winter 1991
  8.         Issue of 3TECH, The 3Com Technical Journal.
  9.  
  10.         3TECH is published quarterly by 3Com Corporation, Santa Clara,
  11.         CA 95052.
  12.  
  13.         Subscriptions to 3TECH are available at a rate of $35 per
  14.         calendar year.  To order subscriptions to 3TECH write to 3TECH
  15.         Journal, 3Com, P.O. Box 58145, Santa Clara, CA 95052-9953.
  16.         All orders must be prepaid and reference 3C2869.
  17.  
  18.  
  19.         Note:  This file has been modified from the original article
  20.         to be printable with ascii characters.  It uses PC extended
  21.         ascii graphics characters to make boxes for figures, so the
  22.         printer should support the PC character set to print these
  23.         correctly.
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.                              NDIS Concepts
  31.  
  32.  
  33.  
  34.         The Network Driver Interface Specification (NDIS) is a
  35.         standardized interface for OS/2 or DOS network platforms. NDIS
  36.         provides access to the network services at the Data Link layer
  37.         and is especially useful if the access must be shared. Software
  38.         developers who need to employ their own network protocol
  39.         implementations can program to the NDIS interface and utilize
  40.         NDIS-compliant drivers provided by network hardware vendors.
  41.         This frees the protocol developer from programming directly to
  42.         various network interface cards and solves compatibility problems
  43.         on machines with multiple protocols.
  44.  
  45.         This article explains why the Network Driver Interface
  46.         Specification was developed, and describes its organization and
  47.         operation.  Some of the information is general, and will be of
  48.         interest to a broad group of people involved with networks.  A
  49.         good deal of the information is quite detailed and technical.  It
  50.         is intended primarily to give network programmers an overview of
  51.         NDIS and what is involved in binding a protocol to an vendor-
  52.         supplied MAC driver for a network adapter board.
  53.  
  54.         The Old Way
  55.  
  56.         Traditionally, network software vendors for the MS-DOS
  57.         environment have used ad hoc methods to implement the protocols
  58.         and drivers that link applications to their resident network
  59.         hardware.  The entity that performs these network functions and
  60.         provides communication between applications is usually referred
  61.         to as a protocol stack.  In the OSI Reference Model, the stack
  62.         would correspond to the Data Link, Network, Transport, and
  63.         Session layers, with some stacks possibly including higher
  64.         layers.  At the stack's top end is a user interface or some type
  65.         of applications programming interface (API) and, at the bottom
  66.         end, are the interfacing routines that control the network
  67.         adapter hardware.  In implementation, a stack might consist of
  68.         one system driver, multiple drivers, a program, or a combination
  69.         of drivers and programs.
  70.  
  71.         Figure 1 shows three alternative stacks that could be used to
  72.         perform equivalent network functions.  In a typical
  73.         implementation (for example, NetBIOS over XNS, in figure 1) the
  74.         Data Link, Network, and Transport layers might be implemented as
  75.         three separate system drivers, and the Session layer as a TSR
  76.         program.  Usually, the interfacing between the layers would be
  77.         accomplished through a proprietary interface developed by the
  78.         vendor and the application would communicate to NetBIOS via
  79.         software interrupts.  This works fine in a homogeneous network
  80.         environment, but as networks grow more complex, it is becoming
  81.  
  82.  
  83.  
  84.                                     1
  85.  
  86.  
  87.  
  88.         desirable to have the flexibility to utilize mixtures of
  89.         different protocols, application interfaces, and network media.
  90.  
  91.  
  92.         Figure 1. Typical Protocol Implementations Without NDIS
  93.  
  94.                OSI            NetBios         Sockets
  95.               Model            over            over
  96.                                XNS            TCP/IP
  97.           ┌──────────────┐ ┌─────────────┐ ┌─────────────┐
  98.           │ Application  │ │             │ │             │
  99.           ├──────────────┤ │ Application │ │ Application │ -─ Application
  100.           │ Presentation │ │             │ │             │    Software
  101.           ├──────────────┤ ├─────────────┤ ├─────────────┤
  102.           │   Session    │ │   NetBIOS   │ │    BSD      │ -- API
  103.           │              │ │             │ │   Socket    │
  104.           ├──────────────┤ ├─────────────┤ ├─────────────┤
  105.           │  Transport   │ │     SPP     │ │    TCP      │ \
  106.           ├──────────────┤ ├─────────────┤ ├─────────────┤  ├ Protocol
  107.           │   Network    │ │     IDP     │ │     IP      │ /
  108.           ├──────────────┤ ├─────────────┤ ├─────────────┤
  109.           │  Data Link   │ │   Driver    │ │   Driver    │ -- Adapter
  110.           │              │ ├─────────────┤ ├─────────────┤    Driver
  111.           ├──────────────┤ ├───  H/W  ───┤ ├───  H/W  ───┤
  112.           │   Physical   │ │    Media    │ │    Media    │
  113.           └──────────────┘ └─────────────┘ └─────────────┘
  114.  
  115.  
  116.  
  117.         The Problem to be Solved
  118.  
  119.         Compatibility issues between various networking implementations
  120.         can make it difficult or impossible to accomplish some seemingly
  121.         simple tasks.  For example, assume that we have an Ethernet
  122.         network that has two types of file servers attached.  One server
  123.         runs an XNS protocol with NetBIOS at the Session layer.  The
  124.         other server runs a TCP/IP protocol with a Berkeley Socket
  125.         Session interface.
  126.  
  127.         We would like to write a program to run on a workstation that can
  128.         copy a file from the first server to the second.  In this
  129.         example, let's say we have two sets of software from two vendors
  130.         that are designed to communicate with each of the servers, and
  131.         that the vendors have defined a programmer's interface that
  132.         should allow us to write a program which talks to the two stacks.
  133.         Assuming that we have enough memory to load both stacks at one
  134.         time, we will probably find that our biggest configuration
  135.         problem occurs at the bottom of the stacks.
  136.  
  137.         At the Data Link layer, each of the vendors has supplied us with
  138.         a driver for use with their protocol stack that can control the
  139.         EtherLink II adapter board that we have in our station.  Most
  140.  
  141.  
  142.                                     2
  143.  
  144.  
  145.  
  146.         likely, we will find that each of these drivers expects to have
  147.         exclusive ownership and control of the EtherLink II.  As one of
  148.         the drivers tries to control the board, it interrupts or corrupts
  149.         the functions being attempted by the other driver.  What is
  150.         needed is one driver that can control the adapter and be shared
  151.         by the two protocols.
  152.  
  153.         In May of 1988, 3Com and Microsoft released NDIS, which was
  154.         jointly developed in conjunction with LAN Manager.  The NDIS
  155.         specification is a standard designed to alleviate compatibility
  156.         issues for both OS/2 and DOS network platforms.  The NDIS
  157.         specification should be beneficial to both the protocol-level
  158.         network software developer, who now has a standard interface
  159.         available, and the user, who gains from the flexibility and
  160.         interoperability advantages of protocols using NDIS.
  161.  
  162.         NDIS Organization
  163.  
  164.         All network software components compliant with NDIS definitions
  165.         are drivers.  These drivers can be classified into two types:
  166.         protocol drivers, and Media Access Control (MAC) drivers.  NDIS
  167.         allows protocol drivers to be device drivers, TSR's, or DOS
  168.         applications, however, for this discussion, we are going to
  169.         assume that all NDIS drivers are device drivers--the simplest and
  170.         most common implementation.
  171.  
  172.         The MAC driver forms the bottom layer of the stack and is the
  173.         driver that directly controls the network hardware.  The
  174.         remaining higher layers of the protocol stack are implemented in
  175.         one or more protocol drivers.
  176.  
  177.         The MAC layer is a sublayer within the OSI Data Link layer that
  178.         is defined by IEEE 802 specifications.  This layer is the
  179.         appropriate point for a driver that manages the network hardware
  180.         and implements the transmission and reception of network data
  181.         packets.  NDIS MAC drivers are provided by 3Com and many other
  182.         network hardware vendors (see Table 1 for a partial list) and can
  183.         be used with any vendor's NDIS compliant protocol drivers.
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.                                     3
  201.  
  202.  
  203.  
  204.         Table 1. Companies Supporting NDIS
  205.         ┌───────────────────────────────────────────────────────────────┐
  206.         │  Companies with NDIS MAC Drivers                              │
  207.         │                                                               │
  208.         │ Note: The entire list of companies shipping NDIS MAC drivers  │
  209.         │ is too long for this article, but includes:                   │
  210.         │                                                               │
  211.         │     3Com                       Interlan                       │
  212.         │     AST Research               Proteon                        │
  213.         │     AT&T                       Tiara                          │
  214.         │     Compaq                     Ungermann-Bass                 │
  215.         │     Exelan                     Western Digital                │
  216.         │     IBM                                                       │
  217.         │                                                               │
  218.         │  Companies with OS or Application Supporting NDIS             │
  219.         │                                                               │
  220.         │     3Com                       - LAN Manager                  │
  221.         │     AT&T                       - LAN Manager                  │
  222.         │     Banyan                     - Vines (workstation)          │
  223.         │     DEC                        - LAN Works                    │
  224.         │     FTP                        - PC/TCP                       │
  225.         │     IBM                        - LanServer, OS/2 Extended     │
  226.         │     Microsoft                  - LAN Manager                  │
  227.         │     Pacer                      - Pacerlink                    │
  228.         │     Sun                        - PC-NFS                       │
  229.         └───────────────────────────────────────────────────────────────┘
  230.  
  231.  
  232.         NDIS Stacks
  233.  
  234.         All NDIS drivers, both MAC and protocol, share a basic common
  235.         modular structure.  Each driver has an upper and lower boundary.
  236.         The drivers are linked to form a stack by connecting, or binding,
  237.         the upper boundary of one driver to the lower boundary of another
  238.         driver during the binding portion of driver initialization.  This
  239.         binding process can be repeated multiple times, linking several
  240.         drivers, daisychain fashion, to form the stack.  The MAC driver,
  241.         at the bottom of the stack, always has its lower boundary
  242.         connected to the physical layer--the network hardware.
  243.  
  244.         The simplest configuration of drivers is one MAC driver
  245.         supporting one network adapter card, bound to a single protocol
  246.         driver that spans from the MAC layer to the Session layer (see
  247.         Figure 2).  This forms a single protocol stack of two drivers.
  248.         Optionally, the protocol part of this stack might be made using
  249.         two or more protocol drivers to form a single stack of three or
  250.         more drivers.  NDIS also allows us to have two completely
  251.         parallel stacks in one machine, each with its own adapter card
  252.         and MAC driver, to implement two different protocols.
  253.  
  254.  
  255.  
  256.  
  257.  
  258.                                     4
  259.  
  260.  
  261.  
  262.         Figure 2. NDIS - Single Protocol, Single MAC
  263.  
  264.                 OSI             IEEE                   Using
  265.              Reference          Model                  NDIS
  266.                Model                              ┌─────────────┐
  267.                                                   │ ABC Protocol│
  268.           ■              ■ ■     LLC     ■        │    Driver   │
  269.           │              │ ├─────────────┤  NDIS -╞═════════════╡
  270.           │              │ │             │  Intfc │    NDIS     │
  271.           │  Data Link   │ │     MAC     │        │ MAC Driver  │
  272.           │              │ │ 802.3/802.5 │        ├─────────────│
  273.           │              │ │             │        │  3Com LAN   │
  274.           │              │ │             │        │   Adapter   │
  275.           ├──────────────┤ ├─────────────┤        ├─────────────│
  276.           │   Physical   │ │   Network   │        │   Network   │
  277.           │              │ │   Cabling   │        │   Cabling   │
  278.           └──────────────┘ └─────────────┘        └─────────────┘
  279.  
  280.  
  281.  
  282.  
  283.         Figure 3. NDIS - Multiple Protocols, Single MAC
  284.  
  285.                 OSI             IEEE                   Using
  286.              Reference          Model                  NDIS
  287.                Model                          ┌──────────┬──────────┐
  288.                                               │ABC Protoc│XYZ Protoc│
  289.                                               │ Drvr ┌───┴───┐ Drvr │
  290.           ■              ■ ■     LLC     ■    │      │ Vector│      │
  291.           │              │ ├─────────────┤    ╘═══╤══╧═══════╧══╤═══╛
  292.           │              │ │             │     /  │    NDIS     │
  293.           │  Data Link   │ │     MAC     │  NDIS  │ MAC Driver  │
  294.           │              │ │ 802.3/802.5 │  Intfc ├─────────────│
  295.           │              │ │             │        │  3Com LAN   │
  296.           │              │ │             │        │   Adapter   │
  297.           ├──────────────┤ ├─────────────┤        ├─────────────│
  298.           │   Physical   │ │   Network   │        │   Network   │
  299.           │              │ │   Cabling   │        │   Cabling   │
  300.           └──────────────┘ └─────────────┘        └─────────────┘
  301.  
  302.  
  303.  
  304.         More importantly, NDIS lets us have just one adapter card and a
  305.         single MAC driver with the MAC driver bound to two separate
  306.         protocol drivers (see Figure 3).  Therefore, two protocols (XNS
  307.         and TCP/IP, for instance) can share the same MAC driver and
  308.         adapter card.  This configuration solves the problem discussed
  309.         earlier in which files needed to be copied from two servers
  310.         running different protocols.
  311.  
  312.         To complete the picture, we can also have two adapter cards and
  313.         MAC drivers, with both the MAC drivers bound to one protocol
  314.  
  315.  
  316.                                     5
  317.  
  318.  
  319.  
  320.         driver (Figure 4).  This configuration could be used to create a
  321.         network bridge with one protocol connected to two networks.
  322.  
  323.  
  324.         Figure 4. NDIS - Single Protocol, Multiple MACs
  325.  
  326.                 OSI             IEEE                   Using
  327.              Reference          Model                  NDIS
  328.                Model                        NDIS  ┌─────────────┐
  329.                                             Intfc │ JKL Protocol│
  330.           ■              ■ ■     LLC     ■     \  │    Driver   │
  331.           │              │ ├─────────────┤ ╒══════╧══════╤══════╧══════╕
  332.           │              │ │             │ │    NDIS     │    NDIS     │
  333.           │  Data Link   │ │     MAC     │ │ MAC Driver  │ MAC Driver  │
  334.           │              │ │ 802.3/802.5 │ ├─────────────┼─────────────┤
  335.           │              │ │             │ │  3Com LAN   │  3Com LAN   │
  336.           │              │ │             │ │   Adapter   │   Adapter   │
  337.           ├──────────────┤ ├─────────────┤ ├─────────────┼─────────────┤
  338.           │   Physical   │ │   Network   │ │   Network   │   Network   │
  339.           │              │ │   Cabling   │ │   Cabling   │   Cabling   │
  340.           └──────────────┘ └─────────────┘ └─────────────┴─────────────┘
  341.  
  342.  
  343.         Driver Structures
  344.  
  345.         The drivers communicate with each other by a defined set of
  346.         primitives.  The NDIS document has clearly specified a set of
  347.         primitives for the interface between the MAC driver and protocol
  348.         driver and for managing the NDIS driver binding process.
  349.         Although it is possible to implement a protocol stack with
  350.         multiple protocol drivers, currently no primitives are defined by
  351.         NDIS for these upper layers.  This is not a serious limitation,
  352.         since a stack with multiple protocol drivers would generally have
  353.         all of the protocol drivers common to one vendor.  There is less
  354.         need for a standardized interface between protocol drivers than
  355.         at the MAC layer where sharing resources, and multiple vendors,
  356.         is more likely.
  357.  
  358.         Each driver contains a series of module characteristic data
  359.         structures that provide information describing the purpose and
  360.         capabilities of the driver, and that manage the linkage and
  361.         operation of the driver during and after initialization.
  362.  
  363.         The main structure is called the Common Characteristics Table and
  364.         contains the name of the driver and version information.  This is
  365.         the highest level table for a driver; other types of
  366.         characteristics tables are located from pointers in this table.
  367.         The Common Characteristics table also contains basic information
  368.         about what type of binding is supported at the upper and lower
  369.         boundaries of the driver.  The binding information is in the form
  370.         of a byte identifying the OSI layer that is supported for the
  371.  
  372.  
  373.  
  374.                                     6
  375.  
  376.  
  377.  
  378.         boundary.  This byte can be examined by other drivers to
  379.         determine if it is appropriate to bind to the driver.
  380.  
  381.         The common characteristics table contains pointers to the other
  382.         module characteristics tables -- the service specific
  383.         characteristics table, service specific status table, and upper
  384.         and lower dispatch tables.  These tables give specific
  385.         information related to the service that the driver performs,
  386.         manage its operation, and record linkage points to other drivers
  387.         after the driver is bound.
  388.  
  389.         Managing Binding and Initialization
  390.  
  391.         To form the protocol stacks from the individual drivers we need
  392.         to get the right  drivers hooked together in the desired
  393.         sequence.  This is accomplished in the initialization and binding
  394.         process.  Three components are used to manage and control the
  395.         process -- PROTOCOL.INI (an ASCII configuration parameter file),
  396.         PROTMAN.DOS or PROTMAN.OS2 (the protocol manager -- a special
  397.         driver), and NETBIND.EXE (a program that initiates the final
  398.         driver binding process).
  399.  
  400.         The initialization and binding process is essentially the same
  401.         whether the operating system is DOS or OS/2.  Some minor
  402.         adjustments need to be made (for instance, selecting either
  403.         PROTMAN.DOS or PROTMAN.OS2) and some different parameters may be
  404.         required, but the discussion that follows applies to either
  405.         environment.
  406.  
  407.         The ASCII file PROTOCOL.INI contains the instructions for
  408.         assembling the protocol stack or stacks from the NDIS network
  409.         drivers.  It also contains parameters that are needed to
  410.         configure the individual drivers.  At CONFIG.SYS initialization
  411.         time, the Protocol Manager Driver reads this file.   The file is
  412.         created -- much as CONFIG.SYS is created -- either directly, by
  413.         the administrator typing the information with an editor, or by
  414.         some type of installation program.
  415.  
  416.         The PROTOCOL.INI information is grouped into a number of logical
  417.         sections of the form:
  418.  
  419.                    [module name]
  420.                               parameter=value
  421.  
  422.         The module name is the name of the NDIS driver, as contained in
  423.         the common characteristics table for the driver.  There will be
  424.         one module section for each of the NDIS drivers that describes
  425.         the driver's configuration.  Each section can have multiple
  426.         parameters, but must have at least one, the DRIVERNAME.
  427.  
  428.         Figure 5 shows the contents of a simple PROTOCOL.INI file that
  429.         has entries for three drivers.  The first is Protocol Manager,
  430.  
  431.  
  432.                                     7
  433.  
  434.  
  435.  
  436.         the special driver that controls the binding process -- more
  437.         about its purpose later.  In PROTOCOL.INI the Protocol Manager
  438.         entry is currently optional, but it may be required in the
  439.         future, so it's a good idea to include it.  The second module
  440.         section is for the EtherLink II adapter's MAC driver, and the
  441.         last section is for an arbitrary protocol driver.
  442.  
  443.  
  444.  
  445.         Figure 5. PROTOCOL.INI File Contents
  446.  
  447.                    ;***************************
  448.                    ; Example PROTOCOL.INI file
  449.                    ;***************************
  450.  
  451.                    [PROTMGR]
  452.                           DRIVERNAME=PROTMAN$
  453.  
  454.                    [ETHERLINKII]
  455.                           DRIVERNAME=ELNKII$
  456.                           INTERRUPT=3
  457.                           TRANSCEIVER=EXTERNAL
  458.  
  459.                    [PROTOTST]
  460.                           DRIVERNAME=PROTO$
  461.                           BUFFSIZE=2048
  462.                           BINDINGS=ETHERLINKII
  463.  
  464.  
  465.         Notice that, in each section, the first parameter is DRIVERNAME=.
  466.         This parameter must be included and must specify a name that
  467.         uniquely defines the NDIS module.  In most cases it will be the
  468.         driver name that the driver registers to the operating system
  469.         during initialization.  The driver determines the name that must
  470.         be used, because the driver uses the DRIVERNAME entries as a key
  471.         when searching PROTOCOL.INI data for its relevant module section.
  472.  
  473.         Any number of additional, optional parameter entries can be
  474.         included in a module section.  One purpose of these parameters is
  475.         to allow control of the driver configuration.  A set of valid
  476.         configuration options will be defined for any particular driver.
  477.         In the case of the ETHERLINKII section in Figure 5, we have
  478.         selected two of the possible options for this driver.
  479.         INTERRUPT=3 tells the driver to use hardware interrupt channel 3
  480.         and TRANSCEIVER=EXTERNAL tells the driver to configure the
  481.         adapter for its external transceiver.  In the PROTOTST protocol
  482.         driver, the BUFFSIZE parameter might direct a protocol to use a
  483.         particular size for its internal buffers.
  484.  
  485.         The BINDINGS= parameter is a special parameter that is valid only
  486.         for protocol drivers and specifies the module name of the driver
  487.         with which the protocol should attempt to bind on its lower
  488.  
  489.  
  490.                                     8
  491.  
  492.  
  493.  
  494.         boundary.  This parameter determines which drivers will be bound
  495.         together to form the stack or stacks.  In the PROTOCOL.INI of
  496.         Figure 5, PROTOTST is bound to the ETHERLINKII driver.
  497.  
  498.         As mentioned earlier, the component of the NDIS environment that
  499.         manages the binding process is the Protocol Manager, which has
  500.         the file name PROTMAN.DOS for DOS or PROTMAN.OS2 for OS/2.
  501.         Protocol Manager has two main functions: it keeps and manages
  502.         common data for the NDIS drivers, and it controls the binding
  503.         sequence.  Functions of the Protocol Manager are needed by the
  504.         NDIS drivers during their system level initialization, so the
  505.         Protocol Manager driver must be loaded in CONFIG.SYS before any
  506.         of the other NDIS drivers.
  507.  
  508.         The Protocol Manager driver was written by 3Com and is available
  509.         from both 3Com and Microsoft.  Any vendor needing Protocol
  510.         Manager or NETBIND.EXE for use in the initialization of their
  511.         network software products can obtain them and include them with
  512.         their products.  Protocol Manager and NETBIND.EXE are also a
  513.         standard part of LAN Manager as shipped by 3Com and Microsoft.
  514.  
  515.         Driver Initialization
  516.  
  517.         The Protocol Manager gathers NDIS related information during the
  518.         system CONFIG.SYS initialization of the drivers.  During its
  519.         initialization, the Protocol Manager driver reads the
  520.         PROTOCOL.INI file and parses the information into a set of
  521.         structures, called the Configuration Memory Image, that are
  522.         accessible by the other NDIS drivers.  Because the other NDIS
  523.         drivers use this information, the Protocol Manager must be the
  524.         first NDIS driver to initialize.
  525.  
  526.         As CONFIG.SYS processing continues, the other drivers are
  527.         directed to initialize by the operating system.  During
  528.         initialization they must open the Protocol Manager device
  529.         (PROTMAN$) and then issue a GetProtocolManagerInfo primitive to
  530.         obtain, from the Protocol Manager, a pointer to the Configuration
  531.         Memory Image (the PROTOCOL.INI data).  The drivers find the
  532.         section of this data that pertains to them and use any parameters
  533.         found there to adjust their initialization process.  One result
  534.         of this is that drivers may modify their loaded size, based on
  535.         parameter requirements, to optimize host memory consumption.  If
  536.         the driver is a protocol and it finds a BINDINGS= parameter, it
  537.         will assess whether or not this binding is valid.  Finally, the
  538.         driver must issue a RegisterModule primitive to the protocol
  539.         manager to register itself.  During this register, the driver
  540.         passes a pointer to its common characteristics table, and for a
  541.         protocol driver, a list of modules to which it wants to bind,
  542.         based on the BINDINGS= parameter.
  543.  
  544.  
  545.  
  546.  
  547.  
  548.                                     9
  549.  
  550.  
  551.  
  552.         After CONFIG.SYS processing completes, the Protocol Manager has a
  553.         list of the active NDIS drivers, their characteristics, including
  554.         entry points, and the desired bindings.
  555.  
  556.         Driver Binding
  557.  
  558.         The actual binding of NDIS drivers starts when some program
  559.         issues the BindAndStart primitive call to the PROTMAN$ device.
  560.         For all current Microsoft OS implementations this call will come
  561.         from the execution of NETBIND.EXE within a BAT or CMD file.
  562.  
  563.         After receiving the BindAndStart directive, Protocol Manager will
  564.         take the binding information from the module registrations and
  565.         build a binding hierarchy tree.  Starting at the bottom of this
  566.         tree (the MAC end) the Protocol Manager works up the tree and
  567.         issues an InitiateBind primitive to each protocol module that
  568.         needs a driver bound on its lower boundary.  As part of the
  569.         InitiateBind call, the driver is passed a pointer to the common
  570.         characteristics table of the module to be bound.  The protocol
  571.         driver that was instructed to initiate the bind will then issue a
  572.         Bind primitive directly to the driver that it wishes to bind.
  573.         When the bind completes, each driver will have a pointer to the
  574.         common characteristics of the other, and therefore its entry
  575.         points.
  576.  
  577.         After the Protocol Manager has processed all of the binding tree,
  578.         all the appropriate network drivers will be bound to each other.
  579.         The protocol stack is then fully operational and the drivers can
  580.         access each other by calling the dispatch entry points for
  581.         communication.  Figure 6, Driver Initialization and Binding,
  582.         summarizes the binding process.
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.                                     10
  607.  
  608.  
  609.  
  610.         Figure 6.  Initialization and Binding Process
  611.  
  612.             A. CONFIG.SYS initialization begins.
  613.  
  614.                  1. Protocol Manager driver does its initialization.
  615.  
  616.                       a. Protocol Manager reads the PROTOCOL.INI file and
  617.                          builds the Configuration Memory Image.
  618.  
  619.                  2. Other NDIS drivers do their initialization.
  620.  
  621.                       a. Open the PROTMAN$ device.
  622.  
  623.                       b. Issue GetProtocolManagerInfo to gain access to
  624.                          ProtMan configuration image.
  625.  
  626.                       c. Read config parameters from the image and use them
  627.                          to complete initialization.
  628.  
  629.                       d. Issue RegisterModule to register Characteristics
  630.                          info with Protocol Manager.
  631.  
  632.             B. CONFIG.SYS processing ends.
  633.  
  634.             C. Binding process starts when the NETBIND.EXE program opens
  635.                the PROTMAN$ device and issues a BindAndStart to Protocol
  636.                Manager.
  637.  
  638.                  1. Protocol Manager builds a binding tree from
  639.                     RegisterModule info.
  640.  
  641.                  2. Protocol Manager starts at the bottom and calls
  642.                     drivers with InitiateBind.
  643.  
  644.                       a. Each called driver issues Bind to the specified
  645.                          module to complete binding.
  646.  
  647.             D. When all modules are bound, Protocol Manager returns from
  648.                BindAndStart.
  649.  
  650.  
  651.         One more factor is involved in the binding process if more than
  652.         one protocol is to be bound to a MAC driver.  MAC drivers can
  653.         only have one binding at their upper boundary.  To link one MAC
  654.         to multiple protocols, the Protocol Manager inserts a component,
  655.         called Vector, between the MAC and the protocols (see Figure 3).
  656.         Vector is part of the Protocol Manager and will be bound between
  657.         the MAC and each of the protocols.  To do this, the Protocol
  658.         Manager first binds the MAC driver to Vector by issuing a Bind
  659.  
  660.  
  661.  
  662.  
  663.  
  664.                                     11
  665.  
  666.  
  667.  
  668.         call to the MAC driver, then it issues an InitiateBind call to
  669.         each of the protocols directing them to bind to a Vector entry
  670.         rather than the MAC entry.
  671.  
  672.         The basic function of Vector is to route incoming packets between
  673.         the protocols.  When a packet is received by a MAC driver, it
  674.         will issue a notification of the event to its upper boundary.
  675.         When vector is involved, it will pass this notification, first to
  676.         one, then to the other protocol, until one protocol accepts the
  677.         packet or all have rejected it.  Other functions can be passed,
  678.         essentially directly, between protocols and the MAC, but this
  679.         vectoring of incoming packets is key to implementing multiple
  680.         protocols on one MAC.
  681.  
  682.         MAC to Protocol Interface and Operation
  683.  
  684.         The main purpose of the NDIS interface is to let the bound
  685.         drivers communicate with each other.  To that end, the NDIS is
  686.         largely concerned with defining a set of functions that dictate
  687.         how the MAC driver will communicate with the protocol bound on
  688.         its upper layer.  Table 2, NDIS Primitives, lists the primitives
  689.         that are defined for this MAC-to-Protocol communication.  All
  690.         communication between the MAC and its bound protocol will be
  691.         accomplished using these primitives.
  692.  
  693.         In Table 2, the individual primitives are grouped into the main
  694.         functional categories that they perform.  In the first group
  695.         there are functions for the transmission of network packets from
  696.         the protocol through the MAC and onto the network, and for the
  697.         reception of packets in the reverse direction.  In the control
  698.         group are all the functions that the protocol uses to control or
  699.         modify the operation of the adapter and MAC driver.  The
  700.         asynchronous status group contains functions that the MAC uses to
  701.         report events to the protocol.  Finally, the Binding group has
  702.         the functions used to accomplish the driver binding process.  The
  703.         most important of these have already been described.  The
  704.         remainder are extensions to allow binding and unbinding of
  705.         dynamically loadable protocols.  More on this subject later.
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.                                     12
  723.         Table 2. NDIS PRIMITIVES
  724.         ┌───────────────────────────────────────────────────────────────┐
  725.         │   TRANSMIT AND RECEIVE                                        │
  726.         │                                                               │
  727.         │TransmitChain               v  Initiate transmission of a frame│
  728.         │TransmitConfirm             ^  Imply completion of frame       │
  729.         │                               transmit                        │
  730.         │ReceiveLookahead            ^  Indicate arrival of received    │
  731.         │                               frame and offer lookahead data  │
  732.         │TransferData                v  Request transfer of received    │
  733.         │                               frame from MAC to protocol      │
  734.         │IndicationComplete          ^  Allow protocol to do post-      │
  735.         │                               processing on indication        │
  736.         │ReceiveChain                ^  Indicate reception of a frame in│
  737.         │                               MAC managed buffers             │
  738.         │ReceiveRelease              v  Return frame buffer to the MAC  │
  739.         │                               that owns it                    │
  740.         │                                                               │
  741.         │   CONTROL                                                     │
  742.         │                                                               │
  743.         │IndicationOff               v  Disable indications from the MAC│
  744.         │IndicationOn                v  Enable indications from the MAC │
  745.         │InitiateDiagnostics         v  Start MAC runtime diagnostics   │
  746.         │ReadErrorLog                v  Get error log info from MAC     │
  747.         │SetStationAddress           v  Set network address of the      │
  748.         │                               station                         │
  749.         │OpenAdapter                 v  Issue open request to network   │
  750.         │                               adapter                         │
  751.         │CloseAdapter                v  Issue close request to network  │
  752.         │                               adapter                         │
  753.         │ResetMAC                    v  Reset MAC software and adapter  │
  754.         │                               hardware                        │
  755.         │SetPacketFilter             v  Specify filtering params for    │
  756.         │                               received packets                │
  757.         │AddMulticastAddress         v  Specify multicast address for   │
  758.         │                               adapter                         │
  759.         │DeleteMulticastAddress      v  Remove previously added         │
  760.         │                               multicast address               │
  761.         │UpdateStatistics            v  Cause MAC to update statistics  │
  762.         │                               counters                        │
  763.         │ClearStatistics             v  Cause MAC to clear statistics   │
  764.         │                               counters                        │
  765.         │InterruptRequest            v  Protocol requests later async   │
  766.         │                               indication from  MAC            │
  767.         │SetFunctionalAddress        v  Cause adapter to change its     │
  768.         │                               functional address              │
  769.         │SetLookahead                v  Set length of visible data for  │
  770.         │                               ReceiveLookahead                │
  771.         │GeneralRequestConfirmation  ^  Confirm completion of previous  │
  772.         │                               General Request (see text for   │
  773.         │                               more explanation)               │
  774.         │                                                               │
  775.         │   ASYNCHRONOUS STATUS                                         │
  776.         │                                                               │
  777.         │RingStatus                  ^  Indicate a change in ring status│
  778.         │AdapterCheck                ^  Indicate error from adapter     │
  779.         │StartReset                  ^  Indicate adapter has started a  │
  780.         │                                reset                          │
  781.         │EndReset                    ^  Indicate adapter has completed  │
  782.         │                                reset                          │
  783.         │InterruptIndication         ^  MAC response due to             │
  784.         │                                InterruptRequest               │
  785.         ■                                                               ■ ■                                                               ■
  786.         │   BINDING                                                     │
  787.         │                                                               │
  788.         │InitiateBind               p>m  Instruct a module to bind to   │
  789.         │                                another module                 │
  790.         │Bind                       m>m  Exchange Characteristic Table  │
  791.         │                                info with another module       │
  792.         │InitiatePrebind            p>m  In OS/2 dynamic bind mode,     │
  793.         │                                instruct a module  to restart  │
  794.         │                                its prebind initialization     │
  795.         │InitiateUnbind             p>m  Instruct a module to unbind    │
  796.         │                                from another module            │
  797.         │Unbind                     m>m  Delete linkage info with       │
  798.         │                                another module                 │
  799.         │GetProtocolManagerInfo     m>p  Retrieve pointer to            │
  800.         │                                Configuration Image            │
  801.         │RegisterModule             m>p  Register Characteristics and   │
  802.         │                                Bindlist with Protocol Manager │
  803.         │BindAndStart               e>p  Initiate the binding process   │
  804.         │GetProtocolManagerLinkage  m>p  Get entry point for Protocol   │
  805.         │                                Manager                        │
  806.         │GetProtocolIniPath         d>p  Get file path for the          │
  807.         │                                PROTOCOL.INI file              │
  808.         │RegisterProtocolManagerInfo d>p Dynamic mode, register new     │
  809.         │                                Configuration Image            │
  810.         │InitAndRegister            d>p  Dynamic mode OS/2, restart     │
  811.         │                                prebind initialization         │
  812.         │UnbindAndStop              d>p  Dynamic mode, Unbind and       │
  813.         │                                terminate a module             │
  814.         │BindStatus                 e>p  Retrieve info on current       │
  815.         │                                bindings                       │
  816.         │RegisterStatus             e>p  Query if a specific module is  │
  817.         │                                registered                     │
  818.         │                                                               │
  819.         │     KEY:                                                      │
  820.         │           ^    - MAC to protocol                              │
  821.         │           v    - protocol to MAC                              │
  822.         │          p>m   - Protocol Manager to driver module            │
  823.         │          m>p   - driver module to Protocol Manager            │
  824.         │          e>p   - ? to Protocol Manager; ? is normally an      │
  825.         │                  executable program                           │
  826.         │          d>p   - dynamic protocol or control program to       │
  827.         │                  Protocol Manager                             │
  828.         └───────────────────────────────────────────────────────────────┘
  829.  
  830.         The center column of the primitive table has a symbol that
  831.         indicates the direction in which the primitive calls are passed.
  832.         To submit a primitive, the caller driver pushes a series of
  833.         parameters on the system stack and calls an entry point in the
  834.         called driver.  The entry points are known to the calling driver
  835.         as a result of the binding process.  The common characteristics
  836.         table, whose address was passed during binding, has dispatch
  837.         tables chained off of it.  The defined entry points for the
  838.         driver are in a dispatch table.
  839.  
  840.  
  841.  
  842.  
  843.                                     14
  844.  
  845.  
  846.  
  847.         The MAC driver's upper dispatch table and the addresses it
  848.         contains are shown below:
  849.  
  850.         MAC Upper Dispatch Table
  851.                    GeneralRequest
  852.                    TransmitChain
  853.                    TransferData
  854.                    ReceiveRelease
  855.                    IndicationOn
  856.                    IndicationOff
  857.  
  858.         These are the entry points that the protocol driver will call to
  859.         request primitive execution by the MAC.  All of these, except
  860.         GeneralRequest, are called direct primitives because they serve
  861.         just the one primitive function implied by the entry name.  The
  862.         GeneralRequest entry serves the remainder of the primitive calls,
  863.         other than binding, that are passed to the MAC.  In Table 2, the
  864.         GeneralRequest primitives are all the primitives in the group
  865.         labeled CONTROL, except IndicationOn and IndicationOff, which
  866.         have their own direct entries.
  867.  
  868.         The Direct Primitives have their own entry points because these
  869.         are performance-critical functions.  The primitives employing the
  870.         GeneralRequest entry, being less critical, can share a common
  871.         entry.  The GeneralRequests identify themselves by passing an
  872.         opcode as one of their parameters.
  873.  
  874.         On the protocol driver side, the protocol lower dispatch table
  875.         defines the entry points from the MAC to the protocol.  The table
  876.         and its contents are as follows:
  877.  
  878.         Protocol Lower Dispatch Table
  879.                    GeneralRequestConfirm
  880.                    TransmitConfirm
  881.                    ReceiveLookahead*
  882.                    IndicationComplete
  883.                    ReceiveChain*
  884.                    Status*
  885.                      * denotes Indications
  886.  
  887.         All of these entries except Status are direct.  Status is the
  888.         entry for the asynchronous status group in the primitive table,
  889.         and these primitive calls also have an opcode that identifies the
  890.         type so they can share one entry. In a sense,
  891.         GeneralRequestConfirm can also be viewed as a shared entry.
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.                                     15
  902.  
  903.  
  904.  
  905.         There is only one primitive for this entry, but it is generated
  906.         by the MAC at the end of any of the GeneralRequests to the MAC
  907.         and contains the request handle of the original primitive request
  908.         to the MAC.  Therefore, it is shared functionally in response to
  909.         all of the GeneralRequest primitives.
  910.  
  911.         Some of the entries in this list are marked with an asterisk to
  912.         show that they are Indications.  Indications are a special class
  913.         of requests that imply some special handling.  In implementation,
  914.         they are usually associated with notifications to the protocol
  915.         that are made from the MAC while it is in interrupt context.
  916.         Because of this, the protocol is required to handle Indications
  917.         as efficiently as possible.  (For example, it might put the
  918.         received frame on a queue.)  After the protocol processes the
  919.         indication, it returns control to the caller, the MAC.  The MAC
  920.         will enable as much interrupt processing as possible and then
  921.         call IndicationComplete to give the protocol an opportunity to
  922.         perform more processing on the Indication in a less critical mode
  923.         (e.g., to decode the previously queued receive frame).
  924.  
  925.         Transmit and Receive
  926.  
  927.         Information in Table 2 identifies the basic purpose of each NDIS
  928.         Primitive.  Of these, transmit and receive are the key functions
  929.         at the MAC-protocol interface level, so let's examine the
  930.         primitives serving these functions in a little more detail.
  931.  
  932.         Network packets, or frames, are the data units that are
  933.         transferred between the MAC and the protocol by the transmit and
  934.         receive primitives.  These packets include all the information,
  935.         other than hardware related functions such as preamble and
  936.         checksum, that will be sent out on the network medium.  As a
  937.         result, the protocol, on transmit, must build the entire packet,
  938.         including data link fields such as source and destination
  939.         addresses.  Likewise, on receive, the protocol must process the
  940.         packet down to these levels.
  941.  
  942.         The passing of packet data across the interface between the
  943.         protocol and MAC is accomplished, whenever possible, by
  944.         exchanging pointers to buffers or to a descriptor that, in turn,
  945.         points to several data buffers.  The objective is to avoid
  946.         unnecessary, time-consuming copying of data between buffers.
  947.  
  948.         In transmit, the packet data buffers are owned by the host system
  949.         and managed by the protocol driver.  NDIS defines a structure,
  950.         the transmit data buffer descriptor, that allows the packet data
  951.         to be contained either in one buffer, or in a series of chained
  952.         buffers.  To initiate a transmit, the protocol assembles the
  953.         packet data into buffers, puts the buffer addresses in the buffer
  954.         descriptor structure, and calls the MAC with the TransmitChain
  955.         primitive.  The primitive contains a pointer to the buffer
  956.         descriptor.
  957.  
  958.  
  959.                                     16
  960.  
  961.  
  962.  
  963.         The MAC has two options for processing the transmit.  The MAC
  964.         will choose one or the other at its own discretion; the protocol
  965.         must be capable of handling either.  In the first, called
  966.         synchronous transmission, the MAC copies all the packet data and
  967.         returns to the protocol with a code signifying that the data
  968.         buffers are free and the transmit is complete.  Optionally, the
  969.         MAC can return with a code signifying that the transmit is queued
  970.         (this is called asynchronous transmission). It implies that the
  971.         buffers are not free and the transmit has not yet completed.
  972.         Later, after the MAC has copied all the transmit data, it will
  973.         call the protocol with a TransmitConfirm primitive (the
  974.         asynchronous response) to inform the protocol that the buffers
  975.         are now free and the transmit is complete.
  976.  
  977.         An additional feature available in transmit is immediate data.
  978.         The protocol has the option of beginning the transmit buffers
  979.         with up to 64 bytes of immediate data.  This immediate data, if
  980.         present, is always the first data to be transmitted.  The MAC
  981.         must fully process or copy this data before returning from the
  982.         TransmitChain call, even if it will asynchronously process any
  983.         remaining data buffers for the call.  This feature allows the
  984.         protocol to have a small locally managed buffer that only needs
  985.         to be valid during the TransmitChain primitive call.  A protocol
  986.         might use this for building packet header information, or for
  987.         entire small protocol-generated packets, such as
  988.         acknowledgements.
  989.  
  990.         For receiving packets, the process can work in one of two ways:
  991.         using ReceiveLookahead and TransferData primitives, or using the
  992.         ReceiveChain primitive.  The method that is used is determined by
  993.         the MAC, depending on how the MAC and adapter can handle data
  994.         buffering.  It is generally a function of whether the adapter has
  995.         on-board receive buffers that use I/O or DMA to transfer the
  996.         data, or whether the adapter buffers are memory-mapped and
  997.         accessible directly by the host.
  998.  
  999.         For buffers on the adapter that use programmed I/O or DMA to
  1000.         transfer the data, the reception process will use a
  1001.         ReceiveLookahead and TransferData pair of primitives.  When the
  1002.         MAC has received a packet that it wants to present to the
  1003.         protocol, it indicates this by calling the ReceiveLookahead
  1004.         primitive of the protocol.
  1005.         The ReceiveLookahead call contains a pointer to a short portion
  1006.         of the data at the beginning of the packet.  This usually means
  1007.         that the MAC must have first DMA'ed this lookahead data to a
  1008.         buffer in the host.
  1009.  
  1010.         At this point, the protocol driver can examine the lookahead data
  1011.         to determine if it wants the packet.  In some cases, the packet
  1012.         may not be of interest to the protocol.  If the packet is not
  1013.         needed, the protocol can return to the MAC indicating a reject
  1014.         and that the receive is complete.  If the packet is needed, the
  1015.  
  1016.  
  1017.                                     17
  1018.  
  1019.  
  1020.  
  1021.         protocol calls the TransferData primitive of the MAC which
  1022.         results in the MAC transferring the remainder of the data to a
  1023.         protocol buffer.
  1024.  
  1025.         The purpose of the ReceiveLookahead implementation is to avoid
  1026.         unnecessary data transfers between the MAC and the protocol.
  1027.         This technique improves the efficiency of the network stack.
  1028.  
  1029.         If the adapter has receive buffers that are accessible as host
  1030.         memory, receive will be implemented with the ReceiveChain
  1031.         primitive.  For this type of buffering, the MAC will own and
  1032.         manage the receive buffers.  For flexibility, this mode has a
  1033.         ReceiveChain buffer descriptor structure, similar to the transmit
  1034.         structure, that lets multiple separate buffers be joined for one
  1035.         packet transfer.  When the MAC has a received packet to present
  1036.         to the protocol, it builds a buffer descriptor for the packet and
  1037.         calls the protocol with ReceiveChain.
  1038.  
  1039.         When the protocol gets the ReceiveChain Indication, it has two
  1040.         options.  In the simplest case, the protocol can copy all of the
  1041.         packet data and return to the MAC specifying that the receive is
  1042.         complete and the buffers are free.  In the other case, the
  1043.         protocol can defer copying the buffers and return to the MAC
  1044.         specifying that the buffers are still in use.  The protocol will
  1045.         later complete the copying of the buffers and then call the MAC
  1046.         with a ReceiveRelease primitive to indicate that the buffers are
  1047.         now free and the receive is done.
  1048.  
  1049.         In all of these receive scenarios, the primitive calls issued to
  1050.         the protocol are indications.  This means that the protocol
  1051.         drivers need to observe certain rules and that the MAC must issue
  1052.         an IndicationComplete call to the protocol as part of the
  1053.         process.  See the NDIS document for more information about these
  1054.         indication issues.
  1055.  
  1056.         Dynamic Binding
  1057.  
  1058.         As mentioned earlier, some primitives for binding which haven't
  1059.         been discussed are provided to support dynamic binding.  Dynamic
  1060.         binding is a new concept that has been added in Version 2.0.1 of
  1061.         the NDIS document.  Dynamic binding allows a protocol to be added
  1062.         to, or removed from an existing network configuration after the
  1063.         initialization process has completed.  The dynamic protocol
  1064.         driver must be written for this purpose and will normally be
  1065.         implemented as a TSR or transient program module.  See the NDIS
  1066.         document for a full explanation of dynamic binding and unbinding.
  1067.  
  1068.         The main advantage of dynamic binding is freeing system memory
  1069.         until it is actually needed for a particular protocol.  This is
  1070.         most useful in the DOS environment where there is a 640K memory
  1071.         limit and it is difficult to have multiple protocol stacks loaded
  1072.         simultaneously.
  1073.  
  1074.  
  1075.                                     18
  1076.  
  1077.  
  1078.  
  1079.         DOS Versus OS/2
  1080.  
  1081.         NDIS has all the features needed to allow writing network drivers
  1082.         that will run in either the DOS or the OS/2 environment.  A
  1083.         driver can only be used with one of these operating systems (the
  1084.         very same driver can't be used for both), but the structure of
  1085.         the driver can be identical for both environments.  We have found
  1086.         that one set of source code can be used to make versions for both
  1087.         DOS and OS/2.  Where different techniques are required, a small
  1088.         piece of code can be selected via conditional compile or assembly
  1089.         statements for the two versions.  An example of such a
  1090.         difference, is that a certain call might need to use Interrupt
  1091.         21h in a DOS-based driver, versus an IOCTL call for OS/2.  A
  1092.         conditional selection of a few lines of code can implement one or
  1093.         the other.  The make process for the driver will select the
  1094.         correct environment.
  1095.  
  1096.         Network device drivers are not very different in structure from
  1097.         other types of device drivers.  The device driver must be written
  1098.         to conform to the architecture in which it will run - DOS or
  1099.         OS/2.  All of the normal issues apply in writing NDIS drivers for
  1100.         both of these environments.  Several books and articles are
  1101.         available that explain general driver development issues.  See
  1102.         the list of references at the end of this article for some
  1103.         titles.
  1104.  
  1105.         Summary
  1106.  
  1107.         One of the main goals of the Network Driver Interface
  1108.         Specification is to save network software developers from
  1109.         reinventing the wheel for each new version of network adapter
  1110.         hardware.  A protocol that is written with an NDIS interface at
  1111.         its base should be able to function, unchanged, with many
  1112.         different types of adapter hardware.  In addition, the
  1113.         manufacturers of the network hardware should be in the best
  1114.         position to write efficient and bug-free MAC drivers for their
  1115.         own boards.  3Com and many other vendors (see Table 1) have NDIS
  1116.         MAC drivers available to support their network hardware.
  1117.  
  1118.         Using the standardized NDIS interface also allows a new level of
  1119.         sharing of network resources in a machine.  Multiple protocols
  1120.         and multiple hardware adapters can coexist -- even those from
  1121.         different vendors.  Input was sought from many leaders in the
  1122.         network industry to guarantee that the specification is flexible
  1123.         enough to meet most networking needs, however, 3Com carefully
  1124.         defined the functions so that performance would not be sacrificed
  1125.         for this flexibility.
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.                                     19
  1134.  
  1135.  
  1136.  
  1137.  
  1138.         If you are a network software developer, I hope this article has
  1139.         provided enough information for you to evaluate whether NDIS can
  1140.         help in your situation.  For the complete description, the NDIS
  1141.         document can be obtained from 3Com at the following address:
  1142.  
  1143.                    3Com - Network Adapter Division
  1144.                    Software Product Marketing
  1145.                    5400 Bayfront Plaza
  1146.                    P.O. Box 58145
  1147.                    Santa Clara, Ca. 95052-8145
  1148.  
  1149.  
  1150.  
  1151.  
  1152.           -- Author Bio:
  1153.  
  1154.         Rex Allers is a Systems Engineer in the Technical Services
  1155.         Operation at 3Com, specializing in support for developers.  Rex
  1156.         has worked in engineering and support in the computer industry
  1157.         for longer than he cares to admit, and has been at 3Com since
  1158.         1986.
  1159.  
  1160.  
  1161.  
  1162.         References:
  1163.  
  1164.         1. "Microsoft/3Com LAN Manager Network Driver Interface
  1165.         Specification"
  1166.  
  1167.         2. "The Open Book", Marshall Rose, Prentice Hall, 1990
  1168.  
  1169.         3. "Advanced MS-DOS", Ray Duncan, Microsoft Press, 1986
  1170.  
  1171.         4. "Writing MS-DOS Device Drivers", Robert S. Lai, Addison
  1172.         Wesley, 1987
  1173.  
  1174.         5. "OS/2 Programmer's Guide", Ed Iacobucci, McGraw-Hill, 1988
  1175.  
  1176.         6. "Writing OS/2 Device Drivers", Raymond Westwater, Addison
  1177.         Wesley, 1989
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.                                 20
  1193.