NDIS驱动程序堆栈

news2024/12/23 13:59:07

NDIS 6.0 引入了暂停和重启驱动程序堆栈的功能。 若要支持 NDIS 6.0 提供的堆栈管理功能,必须重写旧版驱动程序。

NDIS 6.0 还引入了 NDIS Filter驱动程序。 Filter驱动程序可以监视和修改协议驱动程序与微型端口驱动程序之间的交互。 与 NDIS 5 相比,Filter驱动程序更易于实现,并且处理开销更少。x 中间驱动程序。 出于这些原因,应使用Filter驱动程序而不是Filter中间驱动程序。

驱动程序堆栈包含以下逻辑元素:

  • 微型端口适配器:微型端口适配器是 NDIS 微型端口驱动程序或中间驱动程序的适配器实例。 中间驱动程序的虚拟微型端口是微型端口适配器。 设备可用后,NDIS 在微型端口适配器上配置驱动程序堆栈的其他元素。
  • 协议绑定:协议绑定是协议驱动程序的绑定实例。 协议绑定将 NDIS 协议驱动程序绑定到微型端口适配器。 多个协议驱动程序可以绑定到微型端口适配器。
  • Filter模块:Filter模块是Filter驱动程序的实例。 NDIS 可以暂停驱动程序堆栈以插入、删除或重新配置Filter模块。 Filter模块可以监视和修改微型端口适配器的行为。
两种堆栈配置

中间层驱动和Filter驱动是两个不同的概念,这一点非常奇特,因为在最开始的时候(NDIS 5.1)只有中间层过滤驱动,那时候需要同时实现协议驱动和小端口驱动,但是6.0之后,这个部分可以使用Filter来完成,一个明显的需求就是包过滤防火墙,不过由于Filter驱动的加入,导致堆栈变复杂了,下面是没有中间层驱动的堆栈:

以及有中间层驱动的堆栈:

在最开始的时候,我们认为中间层驱动会被Filter取代,但是后来发现中间层被用于其它目的了。下面分别给出三种驱动的状态图,注意可能和其他分栏中的内容重合,不过,给出这些图是为了综合的讨论整个NDIS堆栈。

微型端口驱动程序的适配器状态图

对于它管理的每个微型端口适配器, NDIS 微型端口驱动程序 必须支持以下一组操作状态:

  • 停止
  • 关闭
  • 正在初始化
  • 已暂停
  • 重新启动
  • 正在运行
  • 正在暂停

下图显示了这些状态之间的相互关系:

注意 重置操作不会影响微型端口适配器的操作状态。 此外,重置操作正在进行时,适配器的状态可能会更改。 例如,当重置操作正在进行时,NDIS 可能会调用驱动程序的暂停处理程序。 在这种情况下,驱动程序可以按任何顺序完成重置或暂停操作,同时遵循每个操作的正常要求。 对于重置操作,驱动程序可能会使传输请求数据包失败,也可以让数据包保持排队并稍后完成。 但是,应注意,在传输数据包挂起时,过分的驱动程序无法完成暂停操作。

下面定义了适配器状态:

  • “已停止 ”是所有微型端口适配器的初始状态。 当微型端口适配器处于“已停止”状态,并且 NDIS 调用驱动程序的 MiniportInitializeEx 函数来初始化微型端口适配器时,微型端口适配器将进入“正在初始化”状态。 如果 MiniportInitializeEx 失败,微型端口适配器将返回到 Halted 状态。 当微型端口适配器处于“已暂停”状态并且 NDIS 调用 MiniportHaltEx 函数时,微型端口适配器将返回到“已暂停”状态。
  • 在系统关闭并重新启动之前,不能使用处于 关闭 状态的微型端口适配器。 当微型端口适配器处于“已暂停”、“正在重启”、“正在运行”或“正在暂停”状态,并且 NDIS 调用微型端口驱动程序的 MiniportShutdownEx 函数时,微型端口适配器将进入“关闭”状态。
  • 在 “正在初始化 ”状态下,微型端口驱动程序完成初始化微型端口适配器所需的任何操作。 当微型端口适配器处于“已停止”状态,并且 NDIS 调用微型端口驱动程序的 MiniportInitializeEx 函数时,微型端口适配器将进入“正在初始化”状态。 如果 MiniportInitializeEx 成功,微型端口适配器将进入 Paused 状态。 如果 MiniportInitializeEx 失败,微型端口适配器将返回到 Halted 状态。
  • 当微型端口适配器处于 “已暂停” 状态时,微型端口驱动程序不会指示已收到网络数据或接受发送请求。 当微型端口适配器处于暂停状态并且暂停操作完成时,微型端口适配器将进入“已暂停”状态。 当微型端口适配器处于“正在初始化”状态并且 MiniportInitializeEx 成功时,微型端口适配器将进入“已暂停”状态。 当 NDIS 调用微型端口驱动程序的 MiniportRestart 函数时,微型端口适配器将从“已暂停”状态转换为“正在重启”状态。 当 NDIS 调用微型端口驱动程序的 MiniportHaltEx 函数时,微型端口适配器将从“已暂停”状态转换为“已停止”状态。
  • 在 “正在重启” 状态下,微型端口驱动程序完成重启微型端口适配器的发送和接收操作所需的任何操作。 当微型端口适配器处于“已暂停”状态并且 NDIS 调用驱动程序的 MiniportRestart 函数时,微型端口适配器将进入“正在重启”状态。 如果重启失败,微型端口适配器将返回到“已暂停”状态。 如果重启成功,微型端口适配器将进入“正在运行”状态。
  • 在 “正在运行” 状态下,微型端口驱动程序对微型端口适配器执行正常的发送和接收处理。 当微型端口适配器处于“正在重启”状态,并且驱动程序已准备好执行发送和接收操作时,微型端口适配器将进入“正在运行”状态。
  • 在 暂停 状态下,微型端口驱动程序完成停止微型端口适配器的发送和接收操作所需的任何操作。 驱动程序必须等待 NDIS 返回所有未完成的接收指示。 当微型端口适配器处于“正在运行”状态并且 NDIS 调用驱动程序的 MiniportPause 函数时,微型端口适配器将进入暂停状态。 微型端口驱动程序不能使暂停操作失败。 暂停操作完成后,微型端口适配器将进入“已暂停”状态。
协议驱动程序的绑定状态

对于驱动程序管理的每个绑定, NDIS 协议驱动程序 必须支持以下操作状态:

  • 未绑定
  • 打开
  • 正在运行
  • 关闭
  • 正在暂停
  • 已暂停
  • 重新启动

下图显示了这些状态之间的关系:

下面定义了协议驱动程序绑定状态:

  • “未绑定”状态是绑定的初始状态。 在此状态下,协议驱动程序等待 NDIS 调用 ProtocolBindAdapterEx 函数。 NDIS 调用 ProtocolBindAdapterEx 后,绑定将进入“打开”状态。 取消绑定操作完成后,绑定将从“关闭”状态返回到“未绑定”状态。
  • 在 “打开” 状态下,协议驱动程序为绑定分配资源,并尝试打开微型端口适配器。 NDIS 调用驱动程序的 ProtocolBindAdapterEx 函数后,绑定将进入“打开”状态。 如果协议驱动程序无法绑定到微型端口适配器,则绑定将返回到“未绑定”状态。 如果驱动程序成功绑定到微型端口适配器,绑定将进入“已暂停”状态。
  • 在 “正在运行” 状态下,协议驱动程序对绑定执行正常的发送和接收处理。 当绑定处于“正在重启”状态并且驱动程序已准备好执行发送和接收操作时,绑定将进入“正在运行”状态。
  • 在 “关闭” 状态下,协议驱动程序关闭与微型端口适配器的绑定,然后释放绑定的资源。 NDIS 调用协议驱动程序的 ProtocolUnbindAdapterEx 函数后,绑定将进入“正在关闭”状态。 协议驱动程序完成取消绑定操作后,绑定将进入“未绑定”状态。
  • 在 暂停 状态下,协议驱动程序完成停止绑定的发送和接收操作所需的任何操作。 当绑定处于“正在运行”状态并且 NDIS 向协议驱动程序发送 PnP 暂停通知时,绑定将进入暂停状态。 协议驱动程序必须等待其所有未完成的发送请求完成。 协议驱动程序无法使暂停操作失败。 暂停操作完成后,绑定将进入“已暂停”状态。
  • 在 “已暂停” 状态下,协议驱动程序不对绑定执行发送或接收操作。 当绑定处于暂停状态并且暂停操作完成时,绑定将进入“已暂停”状态。 当绑定处于“打开”状态并且打开操作成功完成时,绑定将进入“已暂停”状态。 如果 NDIS 向协议驱动程序发送绑定的 PnP 重启通知,则绑定将进入“正在重启”状态。 如果 NDIS 调用驱动程序的 ProtocolUnbindAdapterEx 函数,则绑定将进入“正在关闭”状态。
  • 在 “正在重启” 状态下,协议驱动程序完成重启绑定的发送和接收操作所需的任何操作。 当绑定处于“已暂停”状态并且 NDIS 向协议驱动程序发送 PnP 重启通知时,绑定将进入“正在重启”状态。 如果重启失败,绑定将返回到“已暂停”状态。 如果重启成功,绑定将进入“正在运行”状态。
Filter驱动程序的模块状态

NDIS Filter驱动程序必须支持驱动程序管理的每个Filter模块 (Filter驱动程序) 实例的以下操作状态:

  • 分离
  • 附加
  • 已暂停
  • 重新启动
  • 运行
  • 正在暂停

下图显示了这些状态之间的关系。

下面定义了Filter模块状态:

  • 分离分离状态是Filter模块的初始状态。 当Filter模块处于此状态时,NDIS 可以调用Filter驱动程序的 FilterAttach 函数,以将Filter模块附加到驱动程序堆栈。 当 NDIS 调用Filter驱动程序的 FilterAttach 函数时,Filter模块将进入“正在附加”状态。 如果附加操作失败,Filter模块将返回到“分离”状态。 当模块处于“已暂停”状态且 NDIS 调用 FilterDetach 函数时,模块将返回到“已分离”状态;
  • 附加当Filter模块处于 “正在附加” 状态时,Filter驱动程序准备将模块附加到驱动程序堆栈。 Filter模块准备完成后,Filter模块将进入“已暂停”状态。 例如,如果 (发生故障,因为所需的资源在) 不可用,Filter模块将返回到“分离”状态;
  • 暂停当Filter模块处于 “已暂停” 状态时,Filter模块不会执行发送或接收操作。 当Filter模块处于 “正在附加” 状态并且 FilterAttach 成功时,Filter模块将进入“ 已暂停” 状态。 当Filter模块处于 暂停 状态并且暂停操作完成时,Filter模块将进入 “已暂停” 状态。 当Filter模块处于 “已暂停” 状态并且 NDIS 调用Filter驱动程序的 FilterRestart 函数时,Filter模块将进入 “正在重启” 状态。 当Filter模块处于 “已暂停” 状态并且 NDIS 调用驱动程序的 FilterDetach 处理程序时,Filter模块将进入 “已分离 ”状态;
  • 重新 启动在 “正在重启” 状态下,Filter驱动程序完成重启Filter模块的发送和接收操作所需的任何操作。 当Filter模块处于“已暂停”状态并且 NDIS 调用驱动程序的 FilterRestart 函数时,Filter模块将进入“正在重启”状态。 如果重启失败,Filter模块将返回到“已暂停”状态。 如果重启成功,Filter模块将进入“正在运行”状态;
  • 运行在 “正在运行” 状态下,Filter驱动程序对Filter模块执行正常的发送和接收处理。 当Filter模块处于“正在重启”状态并且驱动程序已准备好执行发送和接收操作时,Filter模块将进入“正在运行”状态;
  • 暂停在 暂停 状态下,Filter驱动程序完成停止Filter模块的发送和接收操作所需的任何操作。 Filter驱动程序必须等待其所有未完成的发送请求完成,并且 NDIS 必须返回其所有未完成的接收指示。 当Filter模块处于“正在运行”状态并且 NDIS 调用驱动程序的 FilterPause 函数时,Filter模块将进入“正在暂停”状态。 Filter驱动程序无法使暂停操作失败。 暂停操作完成后,Filter模块将进入“已暂停”状态;
启动驱动程序堆栈

系统检测到网络设备后,系统将启动设备的 NDIS 驱动程序堆栈。 设备可以是虚拟设备,也可以是物理设备。 在任一情况下,驱动程序堆栈启动操作将按如下所示进行:

1. 如果驱动程序尚未加载,系统会加载并初始化这些驱动程序。它不会按任何特定顺序加载驱动程序;

2. 系统调用每个驱动程序的 DriverEntry 函数。在 DriverEntry 返回后:

  • 设备的微型端口适配器处于“已停止”状态;
  • Filter模块处于“分离”状态;
  • 协议绑定处于“未绑定”状态;

3. 系统请求 NDIS 启动微型端口适配器。为了初始化微型端口适配器,NDIS 调用微型端口驱动程序的 MiniportInitializeEx 函数。 如果 MiniportInitializeEx 成功,微型端口适配器将进入 Paused 状态;

4. NDIS 附加Filter模块,从最靠近微型端口驱动程序的模块开始,并前进到驱动程序堆栈的顶部。若要请求驱动程序将Filter模块附加到驱动程序堆栈,NDIS 调用Filter驱动程序的 FilterAttach 函数。 如果每个附加操作都成功,Filter模块将进入“已暂停”状态;

5. 在所有基础驱动程序都处于“已暂停”状态后,NDIS 会调用协议驱动程序的 ProtocolBindAdapterEx 函数。然后,协议驱动程序绑定进入“打开”状态。 协议驱动程序调用 NdisOpenAdapterEx 函数以使用微型端口适配器打开绑定;

6. NDIS 为绑定分配必要的资源,并调用协议驱动程序的 ProtocolOpenAdapterCompleteEx 函数。绑定进入“已暂停”状态;

7. 若要完成绑定操作,协议驱动程序调用 NdisCompleteBindAdapterEx 函数;

8. NDIS 重启驱动程序堆栈;

停止驱动程序堆栈

如果删除了设备,NDIS 将停止驱动程序堆栈。 驱动程序堆栈停止操作继续如下:

  • NDIS 暂停驱动程序堆栈;
  • NDIS 调用协议驱动程序的 ProtocolUnbindAdapterEx 函数。绑定进入“正在关闭”状态。 完成未完成的 OID 和发送请求并返回所有接收数据后,绑定将进入“未绑定”状态;
  • NDIS 分离所有Filter模块,从堆栈的顶部开始,向下推进到微型端口驱动程序。在 NDIS 调用Filter驱动程序的 FilterDetach 函数并且Filter驱动程序释放Filter模块的所有资源后,Filter模块将处于“分离”状态;
  • NDIS 停止微型端口适配器。在 NDIS 调用微型端口驱动程序的 MiniportHaltEx 函数后,微型端口驱动程序将释放微型端口适配器的所有资源,并且微型端口适配器处于“已停止”状态;
  • 如果分离了Filter驱动程序的所有模块,则系统可以卸载Filter驱动程序;
  • 如果微型端口驱动程序管理的所有微型端口适配器已停止,则系统可以卸载微型端口驱动程序;
暂停驱动程序堆栈

NDIS 暂停驱动程序堆栈以完成插入Filter模块或添加绑定等操作。 通常,驱动程序堆栈暂停操作将按如下所示进行:

  • NDIS 将 PnP 暂停事件发送到协议驱动程序。绑定进入暂停状态。 完成所有未完成的发送请求后,协议驱动程序将完成 PnP 事件。 绑定处于“已暂停”状态;
  • NDIS 暂停所有Filter模块,从堆栈顶部开始,并向下推进到微型端口驱动程序。NDIS 调用Filter驱动程序的 FilterPause 函数后,Filter模块将进入暂停状态。 NDIS 返回所有未完成的接收指示并完成所有未完成的发送操作后,Filter模块将进入“已暂停”状态;
  • NDIS 暂停微型端口适配器。NDIS 调用微型端口驱动程序的 MiniportPause 函数后,微型端口适配器将进入暂停状态。 NDIS 返回所有未完成的接收指示后,微型端口适配器将进入“已暂停”状态;

注意 NDIS 驱动程序无法使暂停请求失败。 应记录发生的任何错误。

重启驱动程序堆栈

NDIS 在插入Filter模块或添加绑定等操作后重启驱动程序堆栈。 驱动程序堆栈重启操作将按如下所示进行:

  • NDIS 重启微型端口适配器。NDIS 调用微型端口驱动程序的 MiniportRestart 函数后,微型端口适配器将进入“正在重启”状态。 微型端口驱动程序准备恢复发送和接收操作。 如果准备失败,微型端口适配器将返回到“已暂停”状态。 驱动程序准备好继续发送和接收操作后,微型端口适配器将进入“正在运行”状态;
  • NDIS 重启Filter模块,从驱动程序堆栈的底部开始,一直升级到协议驱动程序。NDIS 调用Filter驱动程序的 FilterRestart 函数后,Filter模块将进入“正在重启”状态。 Filter驱动程序准备恢复发送和接收操作。 如果准备失败,模块将返回到“已暂停”状态。 驱动程序准备好恢复发送和接收操作后,Filter模块将进入“正在运行”状态;
  • NDIS 将 PnP 重启事件发送到协议驱动程序。绑定进入“正在重启”状态。 协议驱动程序准备恢复发送和接收操作。 如果准备失败,绑定将返回到“已暂停”状态。 在协议驱动程序准备好恢复发送和接收操作后,绑定将进入“正在运行”状态;
修改正在运行的驱动程序堆栈

NDIS 修改用于插入、删除或重新配置Filter模块等操作的驱动程序堆栈。 NDIS 可以在Filter模块中激活或停用绕过模式。

注意 如果Filter驱动程序入口点更改,即由于绕过模式,NDIS 将暂停并重启驱动程序堆栈。 暂停和重启可能会导致某些网络数据包在传输路径或接收路径上被删除。 提供可靠传输机制的网络协议可能会在数据包丢失时重试网络 I/O 操作,但其他不保证可靠性的协议不会重试该操作。

NDIS 修改正在运行的驱动程序堆栈,如下所示:

  • NDIS 暂停驱动程序堆栈;
  • NDIS 修改堆栈。例如,若要添加Filter模块,NDIS 将确定将新Filter模块插入堆栈的位置,并创建、插入和附加Filter模块;
  • 插入或删除Filter模块时,驱动程序堆栈的特征可能会更改。 在这种情况下,NDIS 会向驱动程序堆栈中的所有协议绑定和Filter模块发送即插即用事件通知,以通知驱动程序此更改;
  • NDIS 重启驱动程序堆栈;
绕过模式-数据旁路模式

Filter驱动程序 数据旁路模式 可提供改进的系统性能。 NDIS 不调用绕过的 FilterXxx 函数。 例如,如果给定的Filter应用程序不需要发送和接收服务,则Filter驱动程序可以绕过发送和接收函数。

Filter驱动程序指定在驱动程序初始化期间调用 NdisFRegisterFilterDriver 函数时可以绕过的函数的默认入口点。 对于默认跳过的函数,入口点为 NULL 。 

若要在运行时更改绕过状态,驱动程序必须在驱动程序初始化期间为 FilterSetModuleOptions 函数指定入口点。 驱动程序可以初始化NDIS_FILTER_PARTIAL_CHARACTERISTICS结构,并从 FilterSetModuleOptions 的上下文中将新特征传递给 NdisSetOptionalHandlers 函数。

NDIS 在重启操作开始时调用 FilterSetModuleOptions 函数(如果有)。 Filter驱动程序可以为每个Filter模块单独设置绕过模式。 

Filter驱动程序可以绕过在 NDIS_FILTER_DRIVER_CHARACTERISTICS 结构中指定的以下可选 FilterXxx 函数:

  • FilterSendNetBufferLists
  • FilterSendNetBufferListsComplete
  • FilterCancelSendNetBufferLists
  • FilterReturnNetBufferLists
  • FilterReceiveNetBufferLists

若要将 FilterXxx 函数设置为绕过模式,Filter驱动程序会为该函数的入口点指定 NULL 。 但是,如果驱动程序调用具有关联的 FilterXxx 函数的任何 NDIS 函数,则必须为该 FilterXxx 函数提供入口点。 例如,如果驱动程序调用 NdisFIndicateReceiveNetBufferLists 函数,则必须提供 FilterReturnNetBufferLists 函数。

如果Filter驱动程序指定 FilterSendNetBufferLists 函数并排队发送请求,则它还必须指定 FilterCancelSendNetBufferLists 函数。

如果Filter驱动程序指定 FilterReceiveNetBufferLists 或 FilterReturnNetBufferLists 函数,则驱动程序还必须指定 FilterStatus 函数。

若要在运行时更改其绕过模式设置,Filter驱动程序可以调用 NdisFRestartFilter 函数。 NdisFRestartFilter 计划一个暂停操作,然后是指定Filter模块的重启操作。 当 NDIS 调用 FilterSetModuleOptions 时,Filter驱动程序可以通过调用 NdisSetOptionalHandlers 并指定一组新的入口点来更改该Filter模块的函数。

注意 暂停和重启可能会导致某些网络数据包丢弃在传输路径或接收路径上,或同时删除两者。 如果数据包丢失,则提供可靠传输机制的网络协议可能会重试网络 I/O 操作,但其他不保证可靠性的协议不会重试该操作。

Filter驱动程序可以注册支持可选驱动程序服务的其他可选函数。 驱动程序在 FilterSetOptions 函数中注册这些可选服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1704469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI智能体研发之路-模型篇(四):一文入门pytorch开发

博客导读: 《AI—工程篇》 AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效 AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署 AI智能体研发之路-工程篇(三&am…

Vue中,点击提交按钮,路由多了个问号

问题 当点击提交按钮是路由多了问号: http://localhost:8100/#/ 变为 http://localhost:8100/?#/原因 路由中出现问号通常是由于某些路径或参数处理不当造成的。在该情况下,是因为表单的默认行为导致的。提交表单时,如果没有阻止表单的默…

完全背包洛谷题单

[USACO08NOV] Buying Hay S 题解:这题看到每个都可以卖出无限多个干草包,就应该想到完全背包,但又不同于普通的完全背包,普通的完全背包是让你通过对应的背包求出最大的价值,但是在这题理解上却是知道能够达到背包容量…

EPSON爱普生RTC RA8900CE/RA8000CE+松下Panasonic电池组合

RTC是一种实时时钟,用于记录和跟踪时间,具有独立供电和时钟功能。在某些应用场景中,为了保证RTC在断电或者其他异常情况下依然能够正常工作,需要备份电池方案来提供稳定的供电。本文将介绍EPSON爱普生RTC RA8900CE/RA8000CE松下Pa…

【Linux】升级GCC(版本9.3),补充:binutils

GCC:GNU Compiler Collection 。编译器,几乎Linux中所有程序(包括内核)都是gcc编译的,包括libc。 gcc不仅仅是编译器,gcc也有很多库,依赖libc。gcc和libc互相依赖。 GCC官网:GCC, …

【B站 heima】小兔鲜Vue3 项目学习笔记Day05

Day05 文章目录 Day05登录1. 整体认识和路由设置2. 表单校验实现3. 表单-统一校验4. 基础登录业务实现5. Pinia管理用户数据6. Pinia 数据持久化7. 登录和非登录状态下的模板适配8. 请求拦截器携带Token9. 退出登录功能的实现10. Token失效401拦截处理 购物车1. 流程梳理2. 本地…

ubuntu下vscode的安装包

1.引言 ubuntu下面安装vscode,编码调用接口时可以跳到接口api的位置,因此在ubuntu下安装vscode还是非常有意义的。 2.下载地址 链接:https://pan.baidu.com/s/1j3XNmvbL574p_hYeBqO6dg?pwdryr7 提取码:ryr7 --来自百度网盘超…

【考研数学】线代除了「李永乐」,还能跟谁?

考研线代,除了利用了老师,我觉得还有一个宝藏老师的课程值得听! 那就是喻老,这个是我在b站上面新发现的老师,听完他的课程发现真的喜欢 他不仅在B站上开设了课程,还编写了配套的线性代数辅导讲义&#xff…

网页图片加载慢的求解指南

网页/图片加载慢的求解指南 一、前言与问题描述 今天刚换上华为的HUAWEI AX3 Pro New,连上WIFI后测速虽然比平时慢,但是也不算太离谱,如下图所示: 估计读者们有也和作者一样,还没意识到事情的严重性😁。 …

智能客服新突破:大型模型训练助力提升客户服务体验

项目场景:训练大模型智能客服 智能客服新方法在金融服务领域的科技前沿应用 ** 一、 引言 随着科技的飞速发展,智能客服作为金融服务领域的一大创新点,正在逐渐改变传统的客户服务模式。特别是在自然语言处理(NLP)等…

马斯克:AI时代人人高收入,不需要工作,商品服务不再短缺,可能性80%

当前人工智能现状和未来如何?AI时代下,人类未来会发生哪些变化? 埃隆马斯克(Elon Musk)在2024 VivaTech大会上分享了关于地球未来的诸多愿景。 投资作业本课代表摘录了其中的要点,分享给大家&#xff1a…

传承的智慧:故事里的人生启示

传承的智慧:故事里的人生启示 在你的书中,通过故事元素来呈现自己的经历、教训和见解。通过情节、角色发展和冲突展示知识和经验,对主人公的影响和变化,以及对读者的启发和教育作用。 一、故事写作的“三种格式” 要创造一个引人入胜的故事,能够吸引读者,同时有效地传达…

STM32高级控制定时器(STM32F103):输入捕获模式

目录 概述 1 输入捕获模式 1.1 原理介绍 1.2 实现步骤 1.3 发生输入捕获流程 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM调制占空比函数 3.2 应用函数库 4 测试 4.1 功能框图 4.2 运行结果 源代码下载地址&#xf…

leetcode 1241每个帖子的评论数(postgresql)

需求 编写 SQL 语句以查找每个帖子的评论数。 结果表应包含帖子的 post_id 和对应的评论数 number_of_comments 并且按 post_id 升序排列。 Submissions 可能包含重复的评论。您应该计算每个帖子的唯一评论数。 Submissions 可能包含重复的帖子。您应该将它们视为一个帖子。…

C++入门3——类与对象(2)

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。可是空类中真的什么都没有吗? 其实并不是的,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现&#xf…

【AN】制作二维机械专业的动画课件,播放、停止、显示和拖拽

下面代码实现了播放、停止、显示结构图,需要配合舞台的美术资源、元件动画来实现 stop(); Bt_play.addEventListener(MouseEvent.CLICK, playmc); function playmc(event:MouseEvent):void {MC_LINE01.play();MC_Jiantou.play();MC_xiexian.play();MC_LINE02.play()…

最新php项目加密源码

压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹(子文件夹里的php文件也会被加密),加密后的压缩包需要先修复一下,步骤:打开压缩包 》 工具 》 修复压缩文件…

使用LabVIEW开发RFID读卡器程序

使用LabVIEW开发RFID读卡器程序,涵盖硬件选择、初始化、数据读取与处理的整个流程。通过详细的开发步骤和示例代码,展示LabVIEW在快速开发和调试RFID应用中的优势,使用户能有效实现RFID技术在各类项目中的应用。 工作原理 RFID(…

[数据集][目标检测]打架检测数据集VOC格式3146张2类别

数据集格式:Pascal VOC格式(不包含分割的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):3146 标注数量(xml文件个数):3146 标注类别数:2 标注类别名称:["nofight","fight"] 每个类别…

电脑技巧:一台主机两个显示器的连接设置方法

目录 一、先与电脑连接好两个显示器 二、先来看看WIN7连接两个显示器设置方法 三、再来看看WIN10连接两个显示器设置方法 在日常办公场景中,为了提高工作效率和增强交互体验,常需一台电脑同时连接两个显示器,正如我们在营业厅常见到的那样…