Miniportlnitialize函数做如下工作 为维护NC运行状态的适配器相关环境区域分配内存。 ·读取注册表配置数据库来确定它正初始化的NC的参数。微端口在适配器相关环境 区域,为NC贮存这些信息。 ·如果可能的话,读取由O总线维护的总线相关信息。有关总线相关信息的例子包括 PCI或EISA信息。 通过调用 NdisMSetAttributes或 NdisMSetattributesex向NDS注册NC。一个非串行 化微端口必须通过设置 NDIS ATTRIBUTE DESERIALIZE标志,来调用 NdiMSetAttributesEx表明它被串行化了。 ·声明操作NC所需的系统资源。这些资源包括包所需的内存和缓冲区,用来对设备 的LO端口地址进行读写操作,总线管理器要求的映射注册,等等。 ·初始化NC ·如果NC产生一个中断,注册一个中断 注册一个关闭句柄 初始化任何一个用来选取NC的轮询时钟 有关 Miniportlnitialize函数的更多详情,参见3,2节。 21,3对查询和设置微端口信息作出响应 为了査询无连接微端口的性能和统计信息,NDIS调用微端口的 MiniportQuerylnformation函数。NDS可为完成自身任务或为上层的任务调用这个函数。查 询一个面向连接微端口,NDS调用微端口的 MiniportCoRequest函 MiniportQuerylnformation或 MiniportCo Request函数获取信息并且返回给NDS 为了设置由一个无连接微端口维护的信息,NDS调用微端口的 MiniportSetInformation 函数,它设置指定的对象标识并且将操作状态返回给NDS。为了设置由一个面向连接微端 口维护的对象标识(OID),NDS调用微端口的 MiniportCoRequest函数 微端口查询和设置函数可能是异步的。如果它们是同步完成的,它们立刻返回一个状态 代码而不是 NDIS STATUS PENDING。如果它们是异步完成的,函数返回 NDIS STATUS PENDING。为了异步完成一个査询或设置,无连接微端口将分别为 MiniportQuerylnformation调用 NdisMQuerylnformation Complete或为 MiniportSetInformation 调用 Ndis MSetlnformation Complete一个面向连接的微端口调用 NdisMCo RequestComplete 来完成异步查询或设置。 NDS库确保微端口不会有一个未完成的査询或设置请求,所以微端口不需要对查询排 更多有关查询和设置无连接微端口的内容,参见第五章,有关特定的OID信息,参见 在线DDK的“ Network Drivers Reference”。 214产生,激活,去活,和删除虚连接 个面向连接的微端口经常通过一个虚连接(VC来发送和接收数据——无论这个包是 为面向连接客户方的还是为一个呼叫管理器发消息。在由ⅤC发送和接收数据之前,一个面 向连接微端口必须为每一个ⅤC建立环境,它包括分配和初始化内存,推荐用 Ndis. NpagedLookasidelist函数完成此项任务。然后微端口必须激活ⅤC,这包括进行NIC 所要求的各种处理以满足请求需要。当一个呼叫不再需要ⅤC时,微端口去活VC并且也许
- 36- MiniportInitialize 函数做如下工作: ·为维护 NIC 运行状态的适配器相关环境区域分配内存。 ·读取注册表配置数据库来确定它正初始化的 NIC 的参数。微端口在适配器相关环境 区域,为 NIC 贮存这些信息。 ·如果可能的话,读取由 I/O 总线维护的总线相关信息。有关总线相关信息的例子包括 PCI 或 EISA 信息。 ·通过调用 NdisMSetAttributes 或 NdisMSetAttributesEx 向 NDIS 注册 NIC。一个非串行 化 微 端 口 必 须 通 过 设 置 NDIS_ATTRIBUTE_DESERIALIZE 标 志 , 来 调 用 NdiMSetAttributesEx 表明它被串行化了。 ·声明操作 NIC 所需的系统资源。这些资源包括包所需的内存和缓冲区,用来对设备 的 I/O 端口地址进行读写操作,总线管理器要求的映射注册,等等。 ·初始化 NIC ·如果 NIC 产生一个中断,注册一个中断 ·注册一个关闭句柄 ·初始化任何一个用来选取 NIC 的轮询时钟 有关 MiniportInitialize 函数的更多详情,参见 3.2 节。 2.1.3 对查询和设置微端口信息作出响应 为 了 查 询 无 连 接 微 端 口 的 性 能 和 统 计 信 息 , NDIS 调 用 微 端 口 的 MiniportQueryInformation 函数。NDIS 可为完成自身任务或为上层的任务调用这个函数。查 询 一 个 面 向 连 接 微 端 口 , NDIS 调 用 微 端 口 的 MiniportCoRequest 函数。 MiniportQueryInformation 或 MiniportCo Request 函数获取信息并且返回给 NDIS。 为了设置由一个无连接微端口维护的信息,NDIS 调用微端口的 MiniportSetInformation 函数,它设置指定的对象标识并且将操作状态返回给 NDIS。为了设置由一个面向连接微端 口维护的对象标识(OID),NDIS 调用微端口的 MiniportCoRequest 函数。 微端口查询和设置函数可能是异步的。如果它们是同步完成的,它们立刻返回一个状态 代 码 而 不 是 NDIS_STATUS_PENDING 。 如 果 它 们 是 异 步 完 成 的 , 函 数 返 回 NDIS_STATUS_PENDING。为了异步完成一个查询或设置,无连接微端口将分别为 MiniportQueryInformation 调用 NdisMQueryInformationComplete 或为 MiniportSetInformation 调用 NdisMSetInformationComplete。一个面向连接的微端口调用 NdisMCoRequestComplete 来完成异步查询或设置。 NDIS 库确保微端口不会有一个未完成的查询或设置请求,所以微端口不需要对查询排 队。 更多有关查询和设置无连接微端口的内容,参见第五章,有关特定的 OID 信息,参见 在线 DDK 的“Network Drivers Reference”。 2.1.4 产生,激活,去活,和删除虚连接 一个面向连接的微端口经常通过一个虚连接(VC)来发送和接收数据——无论这个包是 为面向连接客户方的还是为一个呼叫管理器发消息。在由 VC 发送和接收数据之前,一个面 向连接微端 口必须为 每一个 VC 建立 环境, 它包括分 配和初始 化内存, 推荐用 Ndis...NpagedLookasideList 函数完成此项任务。然后微端口必须激活 VC,这包括进行 NIC 所要求的各种处理以满足请求需要。当一个呼叫不再需要 VC 时,微端口去活 VC 并且也许
会删除ⅤC 在下列情况下,一个面向连接的微端口产生一个VC 在呼叫管理器和微端口完成了它们的初始化操作后,呼叫管理器调用 NdisCoCreatev 请求微端口建立一条呼叫管理器可用来发送信令消息的ⅤC。作为这个调用的响应,NDIS 调用 Miniport Vc函数,它用来建立每个ⅤC的环境。 当一个网络管理员手工添加一个永久ⅤC(PVo)时,呼叫管理器调用 NdisCoCreateVc 来请求微端口建立VC 在请求一个呼叫管理器建立一个外出呼叫之前,面向连接客户方调用 NdisCoCreateV 请求微端口建立一个VC用来发送呼叫数据。 在向一个面向连接的客户方指示一个内入呼叫之前,呼叫管理器调用 Ndiscocreatevc 来请求微端口建立一条VC用来接收呼叫数据 在一个呼叫结束或因其他原因不再需要ⅤC时,呼叫管理器或集成微端口呼叫管理器 (MCM通过调用 Ndiscm Deactivate Vc来去活VC,它将引起NDS调用微端口的 MiniportCoDeactivateVc函数。对面向连接的客户方或呼叫管理器可以通过调用 NdisCoDeleteVc来引发删除ⅤC操作,它将引发NDS调用微端口的 Miniport CoDelete Vc函 数。 Miniport CoDelete Vc断开由微端口分配的每个vC状态 更多有关在VC上的微端口操作信息和由NDS提供的面向连接的结构的概述,参见第 四部分的第四章 215发送数据 个无连接微端口可以有两种函数来发送包 MiniportsendPackets NDS一次将一个或多个包作为一组指向包标识符的指针传给 MiniportSendPackets Miniportsend NDIS通常一次传给 MiniportSend一个包标识符 面向连接的微端口必须有一个 MiniportCoSendPackets函数用来发送包。NDS一次将 个或多个包作为一组指向包标识符的指针传给 MiniportCoSendPacket 21.5.1多包发送 无连接微端口的 MiniportSendPackets或面向连接微端口的 MiniportCoSend Packets接收 一个指向一组指针的指针,这一组指针指向一个或多个将要发向网络的包。微端口必须保存 包传递给 Miniport( Co) Send Packets函数的顺序 NIC驱动程序可以使用NDS宏从包标识符中取出带外(OOB)数据中的介质特性和权值 信息,(参见43节) 从串行徹端口多包发送 个串行微端口可以同步或异步地完成发送操作。在它的 MiniportSendPackets函数中 (如果提供这样的函数),串行化微端口必须在 MiniportSendPackets返回之前,为每个包在 OOB数据中设置发送完成状态。任何一种非 NDIS STATUS PENDING的状态都表明了微 端口处理了包(即就是,同步地完成了发送操作)并且返回了包标识符的所有权和与它相关的 用来重新使用或将要释放的资源。如果微端口在一个包中返回NDIS_ STATUS PENDING 那么驱动程序保持包资源的所有权,直到微端口调用 NdisMSend Complete处理包为止。更 多有关从串行微端口进行多包发送的操作参见44.1.1节 从非串行化微端口多包发送
- 37- 会删除 VC。 在下列情况下,一个面向连接的微端口产生一个 VC。 ·在呼叫管理器和微端口完成了它们的初始化操作后,呼叫管理器调用 NdisCoCreateVc 请求微端口建立一条呼叫管理器可用来发送信令消息的 VC。作为这个调用的响应,NDIS 调用 MiniportCoCreateVc 函数,它用来建立每个 VC 的环境。 ·当一个网络管理员手工添加一个永久 VC(PVC)时,呼叫管理器调用 NdisCoCreateVc 来请求微端口建立 VC。 ·在请求一个呼叫管理器建立一个外出呼叫之前,面向连接客户方调用 NdisCoCreateVc 请求微端口建立一个 VC 用来发送呼叫数据。 ·在向一个面向连接的客户方指示一个内入呼叫之前,呼叫管理器调用 NdisCoCreateVc 来请求微端口建立一条 VC 用来接收呼叫数据。 在一个呼叫结束或因其他原因不再需要 VC 时,呼叫管理器或集成微端口呼叫管理器 (MCM) 通过 调用 NdisCmDeactivateVc 来去活 VC, 它将引 起 NDIS 调用微 端口的 MiniportCoDeactivateVc 函数。对面向连接的客户方或呼叫管理器可以通过调用 NdisCoDeleteVc 来引发删除 VC 操作,它将引发 NDIS 调用微端口的 MiniportCoDeleteVc 函 数。MiniportCoDeleteVc 断开由微端口分配的每个 VC 状态。 更多有关在 VC 上的微端口操作信息和由 NDIS 提供的面向连接的结构的概述,参见第 四部分的第四章。 2.1.5 发送数据 一个无连接微端口可以有两种函数来发送包: ·MiniportSendPackets NDIS 一次将一个或多个包作为一组指向包标识符的指针传给 MiniportSendPackets。 ·MiniportSend NDIS 通常一次传给 MiniportSend 一个包标识符。 面向连接的微端口必须有一个 MiniportCoSendPackets 函数用来发送包。NDIS 一次将一 个或多个包作为一组指向包标识符的指针传给 MiniportCoSendPackets。 2.1.5.1 多包发送 无连接微端口的 MiniportSendPackets 或面向连接微端口的 MiniportCoSendPackets 接收 一个指向一组指针的指针,这一组指针指向一个或多个将要发向网络的包。微端口必须保存 包传递给 Miniport(Co)SendPackees 函数的顺序。 NIC 驱动程序可以使用 NDIS 宏从包标识符中取出带外(OOB)数据中的介质特性和权值 信息,(参见 4.3 节) 从串行微端口多包发送 一个串行微端口可以同步或异步地完成发送操作。在它的 MiniportSendPackets 函数中 (如果提供这样的函数),串行化微端口必须在 MiniportSendPackets 返回之前,为每个包在 OOB 数据中设置发送完成状态。任何一种非 NDIS_STATUS_PENDING 的状态都表明了微 端口处理了包(即就是,同步地完成了发送操作)并且返回了包标识符的所有权和与它相关的 用来重新使用或将要释放的资源。如果微端口在一个包中返回 NDIS_STATUS_PENDING, 那么驱动程序保持包资源的所有权,直到微端口调用 NdisMSendComplete 处理包为止。更 多有关从串行微端口进行多包发送的操作参见 4.4.1.1 节。 从非串行化微端口多包发送
个非串行化微端口的 MiniportSendPackets函数并不能返回 NDIS STATUS RESOURCES,并且必须通过调用 NdisMSend Complete来异步地完成对每 个包的发送。因此,NDIS忽略由非串行微端口发送来的包中的OOB数据发送完成状态。 当 MiniportSendPackets没有足够资源发送一个给定的包时,非串行化微端口管理自己的内部 包队列,而不是依赖NDIS来排队和重提交包,NDIS也不会要求重新发包。一个非串行化 微端口负责在其内部队列中保持发送包,直到它们可以发送到网络为止。并且,一个非串行 化微端口必须同步它自身函数的执行,以便 MiniportSendPackets可以与其他 MiniportXxx函 数保持一致性执行( MiniportPortReset除外)。更多有关非串行化微端口信息参见45节。更 多有关从非串行化微端口进行多包发送的细节参见4412节。 通过面向连接微端口多包发送 如同一个非串行化微端口,一个面向连接的微端口 不能返回 NDIS STATUS RESOURCES作为多包发送的响 在一个多包发送中并没有为每个包指示发送一完成状态 必须对NDS传递给它的包进行内部排队 同步它自己的 MiniportXxx函数的执行 面向连接微端口与无连接微端口不同点在于它使用 Miniport CoSendPackets并且总是在 个虚连接(VC)上发送(接收)包。更多通过面向连接微端口多包发送的信息,参见443节。 2152单包发送 串行化和非串行化的非连接微端口可以使用 MiniportSend函数,将单个包通过NC发 送到网络上。 MiniportSent将包转换成数据帧并且执行发送操作。在微端口实际发送包之前, 它可以通过调用 NdisgetPacketflags来査询包标识标,从而读取协议驱动程序传递给NC驱 动程序的包标识符头结构中的fags成员。fags成员包含着发送操作的信息(它不包括在包 的数据中),这个信息被用于在相关的协议和定义标记的微端口驱动程序之间进行信息通信 如果驱动程序支持这个特性的话,驱动程序也可以查询带外(OOB)数据的权值信息和介质。 如果在返回之前 MiniportSend完成了发送操作,它将返回一个状态代码而不是 NDIS STATUS PENDING或 NDLS STATUS RESOURCES。完成发送操作意味着微端口驱 动程序完成了包标识符和它所指向的资源,并且将资源返回给调用者以重新使用或等待释 放 在异步情况下,微端口返回 NDIS STATUS RESOURCES,并且当它对包操作以后, 必须调用 Ndis Complete,用来表明释放了包,以便重新使用或等待删除包。 串行化微端口可以返回 NDIS STATUS PENDING来表明它没有足够的内部资源发送 包。在这种情况下,NDIS将返回的包标识符在内部排队,并且当有更多资源可用时,或微 端口调用 NdisMSendComplete或 NdisMSendResources Available时,不管哪一个事件先发生, 都促使NDS将它再提交给NC驱动程序。 当串行化微端口调用 NdisMSend Complete或 NdisMSend ResourcesAvailable时,它向 NDS表明发送资源是可用的,并且微端口己作好了接收新包标识符的准备。 更多有关从无连接微端口单包发送的描述参见442节 21.6指示和传递接收的数据 个无连接微端口可以调用以下函数中的一种来将到来的数据指示给上层: NdisMIndicateReceivePacket:参数为一个指向一组指向一个或多个接收数据包标识符 的指针的指针
- 38- 一个非串行化微端口的 MiniportSendPackets 函数并不能返回 NDIS_STATUS_RESOURCES,并且必须通过调用 NdisMSendComplete 来异步地完成对每一 个包的发送。因此,NDIS 忽略由非串行微端口发送来的包中的 OOB 数据发送完成状态。 当 MiniportSendPackets 没有足够资源发送一个给定的包时,非串行化微端口管理自己的内部 包队列,而不是依赖 NDIS 来排队和重提交包,NDIS 也不会要求重新发包。一个非串行化 微端口负责在其内部队列中保持发送包,直到它们可以发送到网络为止。并且,一个非串行 化微端口必须同步它自身函数的执行,以便 MiniportSendPackets 可以与其他 MiniportXxx 函 数保持一致性执行(MiniportPortReset 除外)。更多有关非串行化微端口信息参见 4.5 节。更 多有关从非串行化微端口进行多包发送的细节参见 4.4.1.2 节。 通过面向连接微端口多包发送 如同一个非串行化微端口,一个面向连接的微端口: ·不能返回 NDIS_STATUS_RESOURCES 作为多包发送的响应 ·在一个多包发送中并没有为每个包指示发送一完成状态 ·必须对 NDIS 传递给它的包进行内部排队 ·同步它自己的 MiniportXxx 函数的执行 面向连接微端口与无连接微端口不同点在于它使用 MiniportCoSendPackets 并且总是在 一个虚连接(VC)上发送(接收)包。更多通过面向连接微端口多包发送的信息,参见 4.4.3 节。 2.1.5.2 单包发送 串行化和非串行化的非连接微端口可以使用 MiniportSend 函数,将单个包通过 NIC 发 送到网络上。MiniportSent 将包转换成数据帧并且执行发送操作。在微端口实际发送包之前, 它可以通过调用 NdisGetPacketFlags 来查询包标识标,从而读取协议驱动程序传递给 NIC 驱 动程序的包标识符头结构中的 flags 成员。flags 成员包含着发送操作的信息(它不包括在包 的数据中),这个信息被用于在相关的协议和定义标记的微端口驱动程序之间进行信息通信。 如果驱动程序支持这个特性的话,驱动程序也可以查询带外(OOB)数据的权值信息和介质。 如果在返回之前 MiniportSend 完成了发送操作,它将返回一个状态代码而不是 NDIS_STATUS_PENDING 或 NDLS_STATUS_RESOURCES。完成发送操作意味着微端口驱 动程序完成了包标识符和它所指向的资源,并且将资源返回给调用者以重新使用或等待释 放。 在异步情况下,微端口返回 NDIS_STATUS_ RESOURCES,并且当它对包操作以后, 必须调用 NdisMSendComplete,用来表明释放了包,以便重新使用或等待删除包。 串行化微端口可以返回 NDIS_STATUS_PENDING 来表明它没有足够的内部资源发送 包。在这种情况下,NDIS 将返回的包标识符在内部排队,并且当有更多资源可用时,或微 端口调用 NdisMSendComplete 或 NdisMSendResourcesAvailable 时,不管哪一个事件先发生, 都促使 NDIS 将它再提交给 NIC 驱动程序。 当串行化微端口调用 NdisMSendComplete 或 NdisMSendResourcesAvailable 时,它向 NDIS 表明发送资源是可用的,并且微端口已作好了接收新包标识符的准备。 更多有关从无连接微端口单包发送的描述参见 4.4.2 节。 2.1.6 指示和传递接收的数据 一个无连接微端口可以调用以下函数中的一种来将到来的数据指示给上层: ·NdisMIndicateReceivePacket:参数为一个指向一组指向一个或多个接收数据包标识符 的指针的指针
NdisMXxxIndicate Receive,参数为一个指向预先准备的缓存地址的指针,相关协议驱 动程序将数据拷贝到这个缓存 个面向连接的微端口必须调用 NdisMColndicateReceivePacket,将到来的数据传送到 上层 216.1多包接收 当一个无连接微端口调用 NdisMIndicate ReceivePacket或一个面向连接的微端口调用 NdisMColndicate ReceivePacket时,微端口将一个指向已完成包的标识符的指针上传给相关 协议驱动程序。向上指示的每一个包标识符的返回状态都必须独自完成设置。任一个 NdisM(Co) IndicateReceivePacket返回未定状态的包标识符都将为上层所保留。包标识符所描 述的资源将在以后由微端口的 MiniportReturnPacket函数返回。如果 Ndis(Co) Indicate ReceivePacket返回任意一个非 NDIS STATUS PENDING的状态,它所描 述的包标识符和资源的所有权将返回给微端口 一组指向己指示包的指针的所有权在从 NdisM(Co) IndicateReceivePacket返回时,就已 返回给了微端口驱动程序,而不用考虑任一个包标识符的返回状态。 面向连接微端口应指出包从那个ⅤC上接收到的。对于从网络接收内入呼叫的面向连接 呼叫管理器或集成微端口管理器(MCM的请求,要求微端口提前建立和激活ⅤC(这些操作 是由NDS调用微端口的 MiniportCoCreateVc和 Miniport CoActivate Vc函数完成的)。微端口 在 NdisMColndicate ReceivePacket中传递NDS提供的VC句柄,有关多包接收的细节参见 4.6.1。 21.62单包接收 无连接微端口调用特定协议的 NdisMXxxIndicate Receive函数来向上层指示一个单独的 包。当网络接口卡(NC)从网络接收到一个数据包,它的微端口通过为网络介质调用恰当的 函数向上指示一个包: 对于 ARCNET,微端口调用 NdisArclndicate Receive 对于 Ethernet,微端口调用 NdisEthIndicate Receive 对于FDDI,微端口调用 NdisFddilndicate Receive 对于 Token ring,微端口调用 Ndis TrIndicateReceive 微端口向上指示一个部分包,如果包很小的话也许会是一个完整的包。NDS将这个指 示传递给所有相关协议。如果它是一个部分包并且协议对完整包感兴趣,那么协议调用 NdisTransfer Data请求包的剩余部分,它向下传递一个由分配协议分配的包描述符 然后,NDS调用微端口的 Miniport Transfer Date函数通知微端口将数据传递到链接在包 描述符中的协议分配缓存中, MiniportTransfer Data将接收到的数据帧拷贝到缓存中 如果 MiniportTransfer Data同步完成,它仅仅将接收到的数据写入所提供的缓存中,并 且返回非 NDIS STATUS PENDING状态。如果 MiniportTransfer Data在返回之前不能完成 传递操作,它将返回 NDIS STATUS PENDING。当数据传送完毕,微端口必须调用 NdisMTransfer Data Complete 在NC完成接收所有发送来的数据帧之后,微端口为网络媒体调用恰当的 NdisMXxXIndicateReceive Complete函数。这将导致对上层协议驱动程序的调用,指示上层 协议驱动程序可以执行post- -receive处理 更多有关单包接收的描述,参见462节。 217指示状态
- 39- ·NdisMXxxIndicateReceive,参数为一个指向预先准备的缓存地址的指针,相关协议驱 动程序将数据拷贝到这个缓存。 一个面向连接的微端口必须调用 NdisMCoIndicateReceivePacket,将到来的数据传送到 上层。 2.1.6.1 多包接收 当一个无连接微端口调用 NdisMIndicateReceivePacket 或一个面向连接的微端口调用 NdisMCoIndicateReceivePacket 时,微端口将一个指向已完成包的标识符的指针上传给相关 协议驱动程序。向上指示的每一个包标识符的返回状态都必须独自完成设置。任一个 NdisM(Co)IndicateReceivePacket 返回未定状态的包标识符都将为上层所保留。包标识符所描 述 的 资 源 将 在 以 后 由 微 端 口 的 MiniportReturnPacket 函 数 返 回 。 如 果 NdisM(Co)IndicateReceivePacket 返回任意一个非 NDIS_STATUS_PENDING 的状态,它所描 述的包标识符和资源的所有权将返回给微端口。 一组指向已指示包的指针的所有权在从 NdisM(Co)IndicateReceivePacket 返回时,就已 返回给了微端口驱动程序,而不用考虑任一个包标识符的返回状态。 面向连接微端口应指出包从那个 VC 上接收到的。对于从网络接收内入呼叫的面向连接 呼叫管理器或集成微端口管理器(MCM)的请求,要求微端口提前建立和激活 VC(这些操作 是由 NDIS 调用微端口的 MiniportCoCreateVc 和 MiniportCoActivateVc 函数完成的)。微端口 在 NdisMCoIndicateReceivePacket 中传递 NDIS 提供的 VC 句柄,有关多包接收的细节参见 4.6.1。 2.1.6.2 单包接收 无连接微端口调用特定协议的 NdisMXxxIndicateReceive 函数来向上层指示一个单独的 包。当网络接口卡(NIC)从网络接收到一个数据包,它的微端口通过为网络介质调用恰当的 函数向上指示一个包: ·对于 ARCNET,微端口调用 NdisArcIndicateReceive ·对于 Ethernet,微端口调用 NdisEthIndicateReceive ·对于 FDDI,微端口调用 NdisFddiIndicateReceive ·对于 Token Ring,微端口调用 NdisTrIndicateReceive 微端口向上指示一个部分包,如果包很小的话也许会是一个完整的包。NDIS 将这个指 示传递给所有相关协议。如果它是一个部分包并且协议对完整包感兴趣,那么协议调用 NdisTransferData 请求包的剩余部分,它向下传递一个由分配协议分配的包描述符。 然后,NDIS 调用微端口的 MiniportTransferDate 函数通知微端口将数据传递到链接在包 描述符中的协议分配缓存中,MiniportTransferData 将接收到的数据帧拷贝到缓存中。 如果 MiniportTransferData 同步完成,它仅仅将接收到的数据写入所提供的缓存中,并 且返回非 NDIS_STATUS_PENDING 状态。如果 MiniportTransferData 在返回之前不能完成 传递操作,它将返回 NDIS_STATUS_PENDING。当数据传送完毕,微端口必须调用 NdisMTransferDataComplete。 在 NIC 完成接 收所有发 送来的数 据帧之后 ,微端口 为网络媒 体调用恰 当的 NdisMXxxIndicateReceiveComplete 函数。这将导致对上层协议驱动程序的调用,指示上层 协议驱动程序可以执行 post—receive 处理。 更多有关单包接收的描述,参见 4.6.2 节。 2.1.7 指示状态
个无连接微端口调用 NdisMIndicateStatus,指示它管理的NC的状态变化,面向连接 微端口调用 NdismColndicateStatus来指示这种变化 Ndis(Co) Indicate Status传递这个调用到所绑定的协议驱动程序,协议驱动程序将解释 基本的状态代码。然后,协议驱动程序、NDS库、WM或其他OS入口可以记录状态变化, 采取适当的动作,或者两者都进行 无连接微端口在发送状态变化时,必须指示状态变化。在一个或多个 NdisMIndicateStatus调用之后,无连接微端口调用 NdisMIndicate Status Complete。NDIS将完 成调用传递给协议驱动程序使得它们可以进行任何必要的后续处理。当一个面向连接微端口 发送状态变化时,它不用进行指示。 微端口不允许在它的 Miniportlnitialize, MiniportISr, MiniportHalt,或 MiniportShutdown 函数的环境中指示状态 有关指示状态的细节,参见54节。 218复位网络接口卡 当下列情况发生时,NDS复位NC: NC驱动程序的 MiniportCheck For Hang函数返回TRUE 当一个对微端口的请求(查询或设置)操作超时 ·当一个串行微端口发送操作超时 当NDS库决定必须重置一个NC时,它调用微端口的 MiniportReset函数 MiniportReset 向NC发布一个硬件重置,并且更新它自己的软件状态。 MiniportReset以一个成功或失败状态代码同步的完成,或以NDlS_ STATUS PENDING 异步的完成。如果函数是异步的,微端口随后调用 NdisMResetComplete来允许后续处理 当一个重置正在进行时,NC驱动程序必须保证NDS不会发送任何请求,并且,NDS 将完成任何目前未完成的请求或发送,所以微端口不需要明确地完成它们 有关重置串行微端口管理的NC的细节描述,参见7.1节。 219终止一个微端口NIC驱动程序 NDS通过调用微端口的 MiniportHalt函数来终止一个微端口。 MiniportHolt函数释放由 微端口所声明的系统资源。例如,如果 Miniportlnitialize函数通过 NdisMRegisterInterrupt注 册了一个中断,那么微端口的 MiniportHalt函数必须通过 NdisMDeregisterInterrupt注销这个 中断。 如果微端口初始化一个NC或声明所需的系统资源失败,它的 MiniportInitialize函数释 放所有分配给微端口的资源。否则,微端口将在它的 MiniportHalt函数的环境中释放它的资 由于一个微端口的 MiniportShutdown函数不应释放任何已分配资源, MiniportShutdown 函数应当停止任何正在进行的数据传输并且将NC置为初始状态 有关终止一个微端口NC驱动程序的更多信息,参见72节 2.2微端口上层函数 这一节提供了由微端口支持的上层函数的概述。NDS为完成自身任务或其他层的网络 软件的任务而调用这些函数。例如,这个高层网络软件可以是一个绑定到由NC驱动程序
- 40- 一个无连接微端口调用 NdisMIndicateStatus,指示它管理的 NIC 的状态变化,面向连接 微端口调用 NdisMCoIndicateStatus 来指示这种变化。 NdisM(Co)IndicateStatus 传递这个调用到所绑定的协议驱动程序,协议驱动程序将解释 基本的状态代码。然后,协议驱动程序、NDIS 库、WMI 或其他 OS 入口可以记录状态变化, 采取适当的动作,或者两者都进行。 无 连 接 微 端 口 在 发 送 状 态 变 化 时 , 必 须 指 示 状 态 变 化 。 在 一 个 或 多 个 NdisMIndicateStatus 调用之后,无连接微端口调用 NdisMIndicateStatusComplete。NDIS 将完 成调用传递给协议驱动程序使得它们可以进行任何必要的后续处理。当一个面向连接微端口 发送状态变化时,它不用进行指示。 微端口不允许在它的 MiniportInitialize,MiniportISR,MiniportHalt,或 MiniportShutdown 函数的环境中指示状态。 有关指示状态的细节,参见 5.4 节。 2.1.8 复位网络接口卡 当下列情况发生时,NDIS 复位 NIC: ·NIC 驱动程序的 MiniportCheckForHang 函数返回 TRUE ·当一个对微端口的请求(查询或设置)操作超时 ·当一个串行微端口发送操作超时 当NDIS库决定必须重置一个NIC时,它调用微端口的MiniportReset函数。MiniportReset 向 NIC 发布一个硬件重置,并且更新它自己的软件状态。 MiniportReset 以一个成功或失败状态代码同步的完成,或以 NDIS_STATUS_PENDING 异步的完成。如果函数是异步的,微端口随后调用 NdisMResetComplete 来允许后续处理。 当一个重置正在进行时,NIC 驱动程序必须保证 NDIS 不会发送任何请求,并且,NDIS 将完成任何目前未完成的请求或发送,所以微端口不需要明确地完成它们。 有关重置串行微端口管理的 NIC 的细节描述,参见 7.1 节。 2.1.9 终止一个微端口 NIC 驱动程序 NDIS 通过调用微端口的 MiniportHalt 函数来终止一个微端口。MiniportHolt 函数释放由 微端口所声明的系统资源。例如,如果 MiniportInitialize 函数通过 NdisMRegisterInterrupt 注 册了一个中断,那么微端口的 MiniportHalt 函数必须通过 NdisMDeregisterInterrupt 注销这个 中断。 如果微端口初始化一个 NIC 或声明所需的系统资源失败,它的 MiniportInitialize 函数释 放所有分配给微端口的资源。否则,微端口将在它的 MiniportHalt 函数的环境中释放它的资 源。 由于一个微端口的 MiniportShutdown 函数不应释放任何已分配资源,MiniportShutdown 函数应当停止任何正在进行的数据传输并且将 NIC 置为初始状态。 有关终止一个微端口 NIC 驱动程序的更多信息,参见 7.2 节。 2.2 微端口上层函数 这一节提供了由微端口支持的上层函数的概述。NDIS 为完成自身任务或其他层的网络 软件的任务而调用这些函数。例如,这个高层网络软件可以是一个绑定到由 NIC 驱动程序