当一个高层NDIS协议驱动程序调用 NdisOpenAdapter来绑定一个具体的NC时,它提 供了一系列它所能操作的介质类型,NDS使用来自NC的信息和来自协议驱动程序的信息 来正确绑定它们。这个绑定提供了一条路径,通过这条路径,包可以在协议栈中往下传递并 通过网络传递出去,通过这条路径,接收到的包可以传到高层驱动程序 为 ARCNET定义的介质类型是 NdisMedium Arcnet8782,这种介质类的定义与为 RawARCNET定义的 Novell的 ARCNET说明完全兼容 Raw aRCnet格式,由 Novell出版的《 ARCNET Packet Header Definition standard》中 定义,它由 Net Ware使用,支持这种格式的传输驱动程序负责从这三种不同帧格式( short long或ε xception)中选择格式,所选的格式依赖于它想送出数据的长度,传输驱动程序负责 执行与使用这个标准相关的必要操作,包括组帧,填充数据和设置分隔标志和顺序号等。 Ndis MediumArcnet8782格式允许传输驱动程序知道它是运行在 ARCNET上的,但不 需要处理帧的分段和组装细节。 NdisMedium Arne8782的on-the-ware格式与 Raw arcnet 相同。但是,许多帧格式的细节对传输驱动程序都屏避了。NC驱动程序执行组帧操作,选 择合式的帧格式,填入数据,设置分隔标志和队列号,以及其他相关字段。NDS库对发送 的包从802.3格式转换成 ARCHET格式,对从 ARCNET微端口接收到的包从 ARCHET格 式转换成802.3格式 Windows2000 Tcpip和 Nwlink传输驱动程序使用 NdisMedium arcnet8782a Windows2000Nbf传输(也叫 NetBEUI)则不使用它 NdisMediumAtm格式允许NC驱动程序使用NDS50的固有的AM支持 Ndismediumlrda格式允许NC驱动程序使用NDS5.0的固有的红外线驱动器支持。 NIC的类型 微端口用 NdisXxx函数来初始化它的适配器和发送与接收包数据,这些函数依赖于它 的NC的如下特征 1.总线管理 DMA NIC 这些NC可以通过一个DMA控制器直接访问主机的内存,DMA控制器用来管理在网 络和主机内存之间不经过主机CPU进行数据传输。 当发送时,微端口驱动程序将NC映射到发送的缓存中。然后微端口触发设备从这个 内存开始传输。NC的DMA控制器将数据从共享的系统内存传输到网络,并且当传输结束 后向CPU发出中断。当接收时,DMA控制器将接收的数据传输到主机内存后,向主机发出 个中断指示。 个总线管理 DMA NIC一般地装有一个板上的环行缓冲区,微端口可以将它映射到一 系列系统内存中的缓冲区。典型地,可对NC进行编程来有效地处理好几个包。由于NIC 可以有效地处理好几个包,所以管理这种NIC的微端口驱动程序通常支持多包的发送和接 收,因此这样就可以提高IO效率 2.非总线管理 DMA NIC 这包含三种基本的NIC类型 NIC包含板上的共享内存 微端口管理的NC必须能将NC的共享内存映射到主机内存,并且可将发送包拷贝到 NIC内存,或者将收到的帧从NC内存拷贝到由上层协议驱动程序或其他驱动程序提供的 缓冲区中。这种微端口基本上不能通过支持多包发送和接收来提高它的能力。 从属的 DMA NIC 一个微端口管理的NC使用系统的DMA控制器来管理从网络发送和接收的数据包 传输数据要求主机CPU的合作
- 31- 当一个高层 NDIS 协议驱动程序调用 NdisOpenAdapter 来绑定一个具体的 NIC 时,它提 供了一系列它所能操作的介质类型,NDIS 使用来自 NIC 的信息和来自协议驱动程序的信息 来正确绑定它们。这个绑定提供了一条路径,通过这条路径,包可以在协议栈中往下传递并 通过网络传递出去,通过这条路径,接收到的包可以传到高层驱动程序。 为 ARCNET 定义的介质类型是 NdisMediumArcnet878_2,这种介质类的定义与为 RawARCNET 定义的 Novell 的 ARCNET 说明完全兼容。 Raw ARCNET 格式,由 Novell 出版的《ARCNET Packet Header Definition standard》中 定义,它由 NetWare 使用,支持这种格式的传输驱动程序负责从这三种不同帧格式(short, long 或 exception)中选择格式,所选的格式依赖于它想送出数据的长度,传输驱动程序负责 执行与使用这个标准相关的必要操作,包括组帧,填充数据和设置分隔标志和顺序号等。 NdisMediumArcnet878_2 格式允许传输驱动程序知道它是运行在 ARCNET 上的,但不 需要处理帧的分段和组装细节。NdisMediumArcnet878_2的on-the-ware格式与Raw ARCNET 相同。但是,许多帧格式的细节对传输驱动程序都屏避了。NIC 驱动程序执行组帧操作,选 择合式的帧格式,填入数据,设置分隔标志和队列号,以及其他相关字段。NDIS 库对发送 的包从 802.3 格式转换成 ARCHET 格式,对从 ARCNET 微端口接收到的包从 ARCHET 格 式转换成 802.3 格式。 Windows 2000 Tcpip 和 Nwlink 传输驱动程序使用 NdisMediumArcnet878_2。 Windows 2000 Nbf 传输(也叫 NetBEUI)则不使用它。 NdisMediumAtm 格式允许 NIC 驱动程序使用 NDIS5.0 的固有的 ATM 支持。 NdisMediumIrda 格式允许 NIC 驱动程序使用 NDIS5.0 的固有的红外线驱动器支持。 NIC 的类型 微端口用 NdisXxx 函数来初始化它的适配器和发送与接收包数据,这些函数依赖于它 的 NIC 的如下特征。 1. 总线管理 DMA NIC 这些 NIC 可以通过一个 DMA 控制器直接访问主机的内存,DMA 控制器用来管理在网 络和主机内存之间不经过主机 CPU 进行数据传输。 当发送时,微端口驱动程序将 NIC 映射到发送的缓存中。然后微端口触发设备从这个 内存开始传输。NIC 的 DMA 控制器将数据从共享的系统内存传输到网络,并且当传输结束 后向 CPU 发出中断。当接收时,DMA 控制器将接收的数据传输到主机内存后,向主机发出 一个中断指示。 一个总线管理 DMA NIC 一般地装有一个板上的环行缓冲区,微端口可以将它映射到一 系列系统内存中的缓冲区。典型地,可对 NIC 进行编程来有效地处理好几个包。由于 NIC 可以有效地处理好几个包,所以管理这种 NIC 的微端口驱动程序通常支持多包的发送和接 收,因此这样就可以提高 I/O 效率。 2. 非总线管理 DMA NIC 这包含三种基本的 NIC 类型。 ·NIC 包含板上的共享内存。 微端口管理的 NIC 必须能将 NIC 的共享内存映射到主机内存,并且可将发送包拷贝到 NIC 内存,或者将收到的帧从 NIC 内存拷贝到由上层协议驱动程序或其他驱动程序提供的 缓冲区中。这种微端口基本上不能通过支持多包发送和接收来提高它的能力。 ·从属的 DMA NIC 一个微端口管理的 NIC 使用系统的 DMA 控制器来管理从网络发送和接收的数据包。 传输数据要求主机 CPU 的合作
使用可编程的LO的NC 微端口管理的PlO设备使用的NDS函数以byte,word,long为单位将发送帧转移到 设备寄存器,然后让设备发送数据,这种设备的驱动程序并没有从NDS的多包发送和接收 支持中受益。这种NC类型的微端口只实现单包的发送和接收,如第四章所述。 1.3微端口驱动程序代码的重要特征 这一节介绍微端口驱动程序代码的以下几个重要特征 1.3. MiniportXxx函数 ·1.32与NDS库链接 1.33微端口适配器环境 1.34vC环境(仅针对面向连接的微端口) 1.3.5网络OID 13 I MiniportXxx函数 典型的微端口驱动程序仅使用很少的函数来通过NDS与上层和硬件进行通信。NDS 为了完成自身的任务或协议驱动程序的服务调用在22.1节和222节提供上层( MiniportXxx) 函数列表与微端口通信:并不是所有的这些函数都是必须的。3.1.22节将介绍哪些函数是可 选的,哪些函数是必须的,并且给出了原因 NDIS NIC微端口和上层驱动程序使用NDS库(nds.ys通过调用 NdisXxy函数在彼此 间通信。一个关于微端口可以调用的 NdisXxx函数和宏的总结在23节提供 许多微端口函数可以异步运行或同步运行。对于异步函数,当操作完成以后,必须调用 NdisXxx. Complete例如,如果一个协议驱动程序调用 NdisReset来复位一个NC,微端口 的 MiniportReset函数通过返回NDlS_ STATUS_ PENDING来挂起复位操作。最终, MiniportReset函数必须调用 NdisMReset Complete来指示复位请求的最终状态。参见第二章 和在线DDK的“ Network Drivers Reference”来获得更多的关于异步 MiniportXxx函数以 及相应的完成函数的信息 13.2与NDS库链接 NDS库封装在 ndis.sys中,这个内核模式库提供了一系列函数接口,它侧重于使功能 最大化的宏。提供接口的库是一个sys文件,它的函数与动态链接库相似。NDS库函数在 在线DDK的“ Network Drivers Reference”中给予了讲述,包括协议和NC驱动程序, 以及 WAN NIC驱动程序,它们都与NDIS库相链接。 Windows2000DDK提供了ndsh作为微端口的主要头文件。这个文件定义了微端口入 口点,NDS库函数,和通常的数据结构。在线的DDK的“ Network Drivers Reference” 讲述了微端口,协议和 NdisXxx函数,以及通常的数据结构和OID。 13.3微端口适配器环境 NDS使用叫一个逻辑适配器的软件对象来代表系统中每一个NIC。这个对象由NDS 管理,并且对微端口和协议驱动程序是透明的。NDS将这个结构的句柄传递给NC驱动程 序的 MiniportInitialize函数。以后微端口驱动程序在调用 NdisXxx函数时,如果这个函数与
- 32- ·使用可编程的 I/O 的 NIC 微端口管理的 PIO 设备使用的 NDIS 函数以 byte, word,long 为单位将发送帧转移到 设备寄存器,然后让设备发送数据,这种设备的驱动程序并没有从 NDIS 的多包发送和接收 支持中受益。这种 NIC 类型的微端口只实现单包的发送和接收,如第四章所述。 1.3 微端口驱动程序代码的重要特征 这一节介绍微端口驱动程序代码的以下几个重要特征。 ·1.3.1 MiniportXxx 函数 ·1.3.2 与 NDIS 库链接 ·1.3.3 微端口适配器环境 ·1.3.4 VC 环境 (仅针对面向连接的微端口) ·1.3.5 网络 OID 1.3.1 MiniportXxx 函数 典型的微端口驱动程序仅使用很少的函数来通过 NDIS 与上层和硬件进行通信。NDIS 为了完成自身的任务或协议驱动程序的服务,调用在2.2.1节和2.2.2节提供上层(MiniportXxx) 函数列表与微端口通信;并不是所有的这些函数都是必须的。3.1.2.2 节将介绍哪些函数是可 选的,哪些函数是必须的,并且给出了原因。 NDIS NIC 微端口和上层驱动程序使用 NDIS 库(ndis.sys)通过调用 NdisXxx 函数在彼此 间通信。一个关于微端口可以调用的 NdisXxx 函数和宏的总结在 2.3 节提供。 许多微端口函数可以异步运行或同步运行。对于异步函数,当操作完成以后,必须调用 NdisXxx...Complete。例如,如果一个协议驱动程序调用 NdisReset 来复位一个 NIC,微端口 的 MiniportReset 函数通过返回 NDIS_STATUS_PENDING 来挂起复位操作。最终, MiniportReset 函数必须调用 NdisMResetComplete 来指示复位请求的最终状态。参见第二章 和在线 DDK 的“Network Drivers Reference”来获得更多的关于异步 MiniportXxx 函数以 及相应的完成函数的信息。 1.3.2 与 NDIS 库链接 NDIS 库封装在 ndis.sys 中,这个内核模式库提供了一系列函数接口,它侧重于使功能 最大化的宏。提供接口的库是一个.sys 文件,它的函数与动态链接库相似。NDIS 库函数在 在线 DDK 的“Network Drivers Reference”中给予了讲述,包括协议和 NIC 驱动程序, 以及 WAN NIC 驱动程序,它们都与 NDIS 库相链接。 Windows 2000 DDK 提供了 ndis.h 作为微端口的主要头文件。这个文件定义了微端口入 口点,NDIS 库函数,和通常的数据结构。在线的 DDK 的“Network Drivers Reference” 讲述了微端口,协议和 NdisXxx 函数,以及通常的数据结构和 OID。 1.3.3 微端口适配器环境 NDIS 使用叫一个逻辑适配器的软件对象来代表系统中每一个 NIC。这个对象由 NDIS 管理,并且对微端口和协议驱动程序是透明的。NDIS 将这个结构的句柄传递给 NIC 驱动程 序的 MiniportInitialize 函数。以后微端口驱动程序在调用 NdisXxx 函数时,如果这个函数与
此句柄表示的NC有关,它应在函数中传递此句柄 当调用微端口NC驱动程序来初始化一个它管理的NC时,微端口驱动程序产生自己 的内部数据结构来代表NIC。驱动程序使用这个结构,把它当作微端口适配器环境,来维护 特定设备的状态信息,这些信息是管理NC所必须的。当驱动程序的 Miniportlnitialize函数 调用 NdisMSet attributes或 NdisMSetattributesex时,它将这个结构的句柄传递给NDIS。当 NDS调用与NC相关的微端口的 MiniportXxx函数时,它将指向NC的句柄传递给适当驱 动程序。微端口适配器环境为微端口所拥用并且为微端口所管理,它对于NDIS和协议驱动 程序是透明的。 134C环境 在建立一个呼叫之前,面向连接的客户方请求面向连接的微端口建立一个虚拟连接 (VC),通过它可以发送和或接收包。同样,在向面向连接的客户方指示一个入站呼叫之前, 呼叫管理器或集成的微端口呼叫管理器(MCM请求微端口为入站呼叫建立一个VC。一个虚 拟连接是两个面向连接实体间的一个逻辑连接。面向连接的发送和接收通常在一个特定的 VC上进行 面向连接微端口在微端口在为每个ⅤC分配的环境区中保存状态信息。每一个VC的环 境由微端口来管理,并且它对于NDIS和协议驱动程序是透明的。在它的 Miniport CoCreateVC 函数中,面向连接的微端口将ⅤC环境区域的句柄传递给NDIS,NDS将一个唯一指定的 已存在的VC的 Ndisvchandle回传给微端口、回传给适当的的面向连接的客户方、回传给 呼叫管理器或集成微端口呼叫管理器(MCM。 在ⅤC上发送和接收数据之前,ⅤC必须被激话。呼叫管理器通过调用Nds(M) CmDeactivate vc来初始化激活的VC并且向呼叫管理器传递呼叫参数,这包括用来激活VC 的参数。作为响应,NDIS调用微端口的 Miniport CoActivateVc函数来激活ⅤC 在一个呼叫结束或因其他原因不再需要VC时,呼叫管理器通过调用 Ndis( M)CmDeactivateVc来去活VC,这也将引起NDS调用微端口的 MiniportCoDeactivateV 函数。对于面向连接的客户方或呼收管理器,可以通过调用 NdisCoDeleteVc来指示对ⅤC 的删除,它将引起NDS调用微端口的 MiniportCoDelete Vc函数 更多在vC上进行微端口操作的信息,请参见第一部分的“微端口驱动程序指南”。 13.5网络OD 微端口维护有关它的性能和当前状况的信息,以及有关它所控制的每个NC的信息。 每一个信息类型都由一个对象标识(OⅠD)确认,OID由系统定义 NDIS和高层驱动程序可以使用OD来查询信息以及在某些情况下设置信息 对于无连接介质的高层驱动程序,它调用 NdisRequest来査询或设置一个无连接微端 口中的信息。为了执行查询操作,NDS调用微端口的 Miniport Querylnformation函数。为了 执行设置操作,NDS调用微端口的 MiniportSetlnformation函数。 对于面向连接介质的高层驱动程序,它调用 NdisCoRequest来查询或设置面向连接微 端口中的信息。为了执行查询和设置操作,NDS调用微端口的 MiniportCoRequest函数 NDS将许多系统为微端口定义的OD映射为全局的唯一标识( GUIDs)。NDIS向内核模 式的 Windows管理检测器(wM)来注册这些 GUIDS。WM支持用户模式下的基于Web的 企业管理(WBEM)应用。当一个WM客户方查询或设置这些 GUIDS中的一个值时,NDS 将这些请求转换为一个恰当的OD查询操作或一个OD设置操作,并且把信息和状态返回
- 33- 此句柄表示的 NIC 有关,它应在函数中传递此句柄。 当调用微端口 NIC 驱动程序来初始化一个它管理的 NIC 时,微端口驱动程序产生自己 的内部数据结构来代表 NIC。驱动程序使用这个结构,把它当作微端口适配器环境,来维护 特定设备的状态信息,这些信息是管理 NIC 所必须的。当驱动程序的 MiniportInitialize 函数 调用 NdisMSetAttributes 或 NdisMSetAttributesEx 时,它将这个结构的句柄传递给 NDIS。当 NDIS 调用与 NIC 相关的微端口的 MiniportXxx 函数时,它将指向 NIC 的句柄传递给适当驱 动程序。微端口适配器环境为微端口所拥用并且为微端口所管理,它对于 NDIS 和协议驱动 程序是透明的。 1.3.4 VC 环境 在建立一个呼叫之前,面向连接的客户方请求面向连接的微端口建立一个虚拟连接 (VC),通过它可以发送和/或接收包。同样,在向面向连接的客户方指示一个入站呼叫之前, 呼叫管理器或集成的微端口呼叫管理器(MCM)请求微端口为入站呼叫建立一个 VC。一个虚 拟连接是两个面向连接实体间的一个逻辑连接。面向连接的发送和接收通常在一个特定的 VC 上进行。 面向连接微端口在微端口在为每个 VC 分配的环境区中保存状态信息。每一个 VC 的环 境由微端口来管理,并且它对于NDIS和协议驱动程序是透明的。在它的MiniportCoCreateVC 函数中,面向连接的微端口将 VC 环境区域的句柄传递给 NDIS,NDIS 将一个唯一指定的 已存在的 VC 的 NdisVcHandle 回传给微端口、回传给适当的的面向连接的客户方、回传给 呼叫管理器或集成微端口呼叫管理器(MCM)。 在 VC 上发送和接收数据之前,VC 必须被激话。呼叫管理器通过调用 Ndis(M) CmDeactivateVc 来初始化激活的 VC 并且向呼叫管理器传递呼叫参数,这包括用来激活 VC 的参数。作为响应,NDIS 调用微端口的 MiniportCoActivateVc 函数来激活 VC。 在 一 个 呼 叫 结 束 或 因 其 他 原 因 不 再 需 要 VC 时 , 呼 叫 管 理 器 通 过 调 用 Ndis(M)CmDeactivateVc来去活 VC,这也将引起NDIS调用微端口的MiniportCoDeactivateVc 函数。对于面向连接的客户方或呼收管理器,可以通过调用 NdisCoDeleteVc 来指示对 VC 的删除,它将引起 NDIS 调用微端口的 MiniportCoDeleteVc 函数。 更多在 VC 上进行微端口操作的信息,请参见第一部分的 “微端口驱动程序指南”。 1.3.5 网络 OID 微端口维护有关它的性能和当前状况的信息,以及有关它所控制的每个 NIC 的信息。 每一个信息类型都由一个对象标识(OID)确认,OID 由系统定义。 NDIS 和高层驱动程序可以使用 OID 来查询信息以及在某些情况下设置信息。 ·对于无连接介质的高层驱动程序,它调用 NdisRequest 来查询或设置一个无连接微端 口中的信息。为了执行查询操作,NDIS 调用微端口的 MiniportQueryInformation 函数。为了 执行设置操作,NDIS 调用微端口的 MiniportSetInformation 函数。 ·对于面向连接介质的高层驱动程序,它调用 NdisCoRequest 来查询或设置面向连接微 端口中的信息。为了执行查询和设置操作,NDIS 调用微端口的 MiniportCoRequest 函数。 NDIS 将许多系统为微端口定义的 OID 映射为全局的唯一标识(GUIDs)。NDIS 向内核模 式的 Windows 管理检测器(WMI)来注册这些 GUIDS。WMI 支持用户模式下的基于 Web 的 企业管理(WBEM)应用。当一个 WMI 客户方查询或设置这些 GUIDS 中的一个值时,NDIS 将这些请求转换为一个恰当的 OID 查询操作或一个 OID 设置操作,并且把信息和状态返回
给WMI。驱动程序编写者可将自定义的GUID映射为客户OID或微端口状态。一个微端口 必须在初始化时向NDS注册客户的GUID-to-OD或GUID-to- status映射。 更多有关查询和设置OD信息、创建自定义OID以及WM的NDS支持,参见第五 章。有关系统定义的OID的描述,参见在线的DDK的“ Network Drivers Reference”。 14驱动程序例子 DDK包括了用来管理几种类型网络卡的微端口的代码例子。这些驱动程序的例子可以 根据驱动程序开发者的要求进行组合。驱动程序的例子包含了可以改写为新的相似的驱动程 序的函数。硬件相关的函数必须由驱动程序开发者重写。但是,许多函数都是很标准的。例 如,与NDS库而不是与网络接口卡通信的函数都是很标准的。对于这些驱动程序函数,在 驱动程序例子中的代码可以经过很少的改动,有时甚至不经过修改就可使用
- 34- 给 WMI。驱动程序编写者可将自定义的 GUID 映射为客户 OID 或微端口状态。一个微端口 必须在初始化时向 NDIS 注册客户的 GUID-to-OID 或 GUID-to-status 映射。 更多有关查询和设置 OID 信息、创建自定义 OID 以及 WMI 的 NDIS 支持,参见第五 章。有关系统定义的 OID 的描述,参见在线的 DDK 的“Network Drivers Reference”。 1.4 驱动程序例子 DDK 包括了用来管理几种类型网络卡的微端口的代码例子。这些驱动程序的例子可以 根据驱动程序开发者的要求进行组合。驱动程序的例子包含了可以改写为新的相似的驱动程 序的函数。硬件相关的函数必须由驱动程序开发者重写。但是,许多函数都是很标准的。例 如,与 NDIS 库而不是与网络接口卡通信的函数都是很标准的。对于这些驱动程序函数,在 驱动程序例子中的代码可以经过很少的改动,有时甚至不经过修改就可使用
第二章NIC微端口操作和函数概要 本章提供了一个关于NC微端口操作的概要,例如初始化和发送数据。这些操作涉及 MiniportXxx函数和 NdisXxx函数。这一章也提供了一个关于 MiniportXxx函数的概要(它 是由NIC微端口驱动程序提供的),以及关于 NdisXxx函数的概要(它是一个由NC微端 口驱动程序调用的)。 这一章包括以下内容: ·2.1NC微端口操作 22微端口上层函数 ·2.3微端口调用的NDS函数 2.1NIC微端口操作 NIC微端口所执行的操作如下所示: 2.1.1初始化NDS库和注册微端口驱动程序 ·2.1.2注册网络接口卡 ·2.1.3对查询和设置微端口信息作出响应 2.14产生、激活、去活和删除虚连接(仅对面向连接的微端口) 2.1.5发送数据 ·2.1.6指示和传递接受的的数据 2.1.7向上层指示硬件状态的变化 ·2.18重新设置一个网络接口卡 19卸载和注销驱动程序 2.1.1初始化NDS库和注册微端口驱动程序 当装载一个微端口驱动程序时,操作系统为微端口驱动程序产生一个驱动程序对象并且 调用驱动程序的 Driver Entry函数。在 Driver Entry函数的环境中,微端口完成以下工作 调用 NdisMInitialize Wrapper,将驱动程序对象的地址和指向确定程序相关信息的注 册表路径作为参数。 调用 NdisMRegister Miniport来将自己注册到NDS。包括他兼容的NDIS版本号以及 提供他的上层( MinportXxx)函数的入口点。NDS库保存这些入口指针供以后调用微端口 时使用。 如果 NdisMRegister Miniport或 NdisIMReqisterLayerdMiniportde的调用没有返回 NDS_ STATUS_ SUCCESS,那么 Driver Entry将返回由 NdisMRegister Miniport或 NdisIMReqister LayerdMiniport返回的值,并且调用 NdisTerminate Wrapper。对 NdisTerminate Wrapper的调用将使的NDS清除微端口调用 NdisMInitialize Wrapper时分配的 资源 有关更详细的 DriverEntry函数的描述,参见3.1节。 212注册网络接口卡 在经过网络接收和发送包之前,NDS库必须注册它所管理的每一个网络接口卡(NO)
- 35- 第二章 NIC 微端口操作和函数概要 本章提供了一个关于 NIC 微端口操作的概要,例如初始化和发送数据。这些操作涉及 MiniportXxx 函数和 NdisXxx 函数。这一章也提供了一个关于 MiniportXxx 函数的概要(它 是由 NIC 微端口驱动程序提供的),以及关于 NdisXxx 函数的概要(它是一个由 NIC 微端 口驱动程序调用的)。 这一章包括以下内容: ·2.1 NIC 微端口操作 ·2.2 微端口上层函数 ·2.3 微端口调用的 NDIS 函数 2.1 NIC 微端口操作 NIC 微端口所执行的操作如下所示: ·2.1.1 初始化 NDIS 库和注册微端口驱动程序 ·2.1.2 注册网络接口卡 ·2.1.3 对查询和设置微端口信息作出响应 ·2.1.4 产生、激活、去活和删除虚连接(仅对面向连接的微端口) ·2.1.5 发送数据 ·2.1.6 指示和传递接受的的数据 ·2.1.7 向上层指示硬件状态的变化 ·2.1.8 重新设置一个网络接口卡 ·2.1.9 卸载和注销驱动程序 2.1.1 初始化 NDIS 库和注册微端口驱动程序 当装载一个微端口驱动程序时,操作系统为微端口驱动程序产生一个驱动程序对象并且 调用驱动程序的 DriverEntry 函数。在 DriverEntry 函数的环境中,微端口完成以下工作: ·调用 NdisMInitializeWrapper,将驱动程序对象的地址和指向确定程序相关信息的注 册表路径作为参数。 ·调用 NdisMRegisterMiniport 来将自己注册到 NDIS。包括他兼容的 NDIS 版本号以及 提供他的上层(MinportXxx)函数的入口点。NDIS 库保存这些入口指针供以后调用微端口 时使用。 如 果 NdisMRegisterMiniport 或 NdisIMReqisterLayerdMiniportde 的调用没有返回 NDIS_STATUS_SUCCESS ,那么 DriverEntry 将返回由 NdisMRegisterMiniport 或 NdisIMReqisterLayerdMiniport 返 回 的 值 , 并 且 调 用 NdisTerminateWrapper 。 对 NdisTerminateWrapper 的调用将使的 NDIS 清除微端口调用 NdisMInitializeWrapper 时分配的 资源。 有关更详细的 DriverEntry 函数的描述,参见 3.1 节。 2.1.2 注册网络接口卡 在经过网络接收和发送包之前,NDIS 库必须注册它所管理的每一个网络接口卡(NIC)