NDIS Filter开发-网络数据的传输

和NIC小端口驱动不同的是,无需考虑网络数据具体是如何传输的,只需要针对NBL进行处理即可。Filter驱动程序可以启动发送请求和接收指示,或“过滤”其他驱动程序的请求和指示。Filter模块堆叠在微型端口适配器上。

驱动程序堆栈中的Filter模块可以筛选与基础适配器关联的所有发送请求和接收指示。 这适用于适配器的所有协议绑定。

Filter驱动程序不直接支持基于 NDIS_PACKET 结构的旧发送和接收操作。 相反,NDIS 将接收来自旧微型端口驱动程序的指示转换为 NET_BUFFER 结构。 此外,NDIS 还处理从基于NET_BUFFER结构的发送请求到基于NDIS_PACKET结构的旧发送请求的所需转换。

Filter驱动程序缓冲区管理

Filter驱动程序创建缓冲区以复制从其他驱动程序获取的网络数据,或启动发送或接收操作。

如果Filter驱动程序不创建缓冲区,则驱动程序不会管理缓冲池。 此类驱动程序只是传递它从其他驱动程序接收的缓冲区。

创建缓冲区以支持发送或接收操作的Filter驱动程序必须管理 NET_BUFFER_LIST 结构池和 NET_BUFFER 结构池。

若要创建这些池,驱动程序会调用以下函数:

  • NdisAllocateNetBufferListPool
  • NdisAllocateNetBufferPool

Filter驱动程序可以使用以下函数从池中分配结构:

  • NdisAllocateNetBufferAndNetBufferList
  • NdisAllocateNetBufferList
  • NdisAllocateNetBuffer

调用 NdisAllocateNetBufferAndNetBufferList 比调用 NdisAllocateNetBufferList 和 NdisAllocateNetBuffer 更高效。 但是, NdisAllocateNetBufferAndNetBufferList 仅在NET_BUFFER_LIST结构上创建一个NET_BUFFER结构。 若要使用 NdisAllocateNetBufferAndNetBufferList,驱动程序必须在调用 NdisAllocateNetBufferListPool 时将 AllocateNetBuffer 参数设置为 TRUE。

源自发送请求的Filter驱动程序应确定基础驱动程序的上下文和回填空间要求。 Filter驱动程序使用重启属性来确定基础驱动程序的回填要求。 Filter驱动程序应确定处于 “正在重启” 状态的回填和上下文要求。 驱动程序应为整个堆栈分配足够的回填和上下文空间。 如有必要,Filter驱动程序可以释放池并将其重新分配为 “正在重启” 状态。

Filter驱动程序使用以下函数来释放池:

  • NdisFreeNetBufferListPool
  • NdisFreeNetBufferPool

Filter驱动程序使用以下函数释放从池中分配的结构:

  • NdisFreeNetBufferList
  • NdisFreeNetBuffer

在释放关联的NET_BUFFER_LIST结构之前,驱动程序应释放使用 NdisAllocateNetBuffer 分配NET_BUFFER结构。 当驱动程序为关联的NET_BUFFER_LIST结构调用 NdisFreeNetBufferList 时,将释放使用 NdisAllocateNetBufferAndNetBufferList 分配的NET_BUFFER结构。

从Filter驱动程序发送数据
发送Filter驱动程序启动的请求

Filter驱动程序可以启动发送请求或过滤驱动程序启动的发送请求。 当协议驱动程序调用 NdisSendNetBufferLists 函数时,NDIS 会将指定的 NET_BUFFER_LIST 结构提交到驱动程序堆栈中最顶层的Filter模块,下图演示了Filter驱动程序启动的发送操作。

Filter驱动程序调用 NdisFSendNetBufferLists 函数以发送 在NET_BUFFER_LIST 结构列表中定义的网络数据。

Filter驱动程序必须将它创建的每个NET_BUFFER_LIST结构的 SourceHandle 成员设置为它传递给 NdisFSendNetBufferLists 的 NdisFilterHandle 参数的相同值。 NDIS 驱动程序不应修改该驱动程序未源自NET_BUFFER_LIST结构的 SourceHandle 成员。

在调用 NdisFSendNetBufferLists 之前,Filter驱动程序可以设置随 NET_BUFFER_LIST_INFO 宏一起发送请求的信息。 基础驱动程序可以使用 NET_BUFFER_LIST_INFO 宏检索此信息。

Filter驱动程序一旦调用 NdisFSendNetBufferLists,就会放弃NET_BUFFER_LIST结构和所有关联资源的所有权。 NDIS 可以处理发送请求或将请求传递给基础驱动程序。

NDIS 调用 FilterSendNetBufferListsComplete 函数,将结构和数据返回到Filter驱动程序。 在将列表传递给 FilterSendNetBufferListsComplete 之前,NDIS 可以将多个发送请求中的结构和数据收集到NET_BUFFER_LIST结构的单个链接列表中

在 NDIS 调用 FilterSendNetBufferListsComplete 之前,发送请求的当前状态是未知的。 在 NDIS 将结构返回到 FilterSendNetBufferListsComplete 之前,Filter驱动程序绝不应尝试检查NET_BUFFER_LIST结构或任何关联数据。

FilterSendNetBufferListsComplete 执行完成发送操作所需的任何后处理。

当 NDIS 调用 FilterSendNetBufferListsComplete 时,Filter驱动程序将重新获得与 NetBufferLists 参数指定的NET_BUFFER_LIST结构关联的所有资源的所有权。 FilterSendNetBufferListsComplete 可以释放这些资源 ,例如,通过调用 NdisFreeNetBuffer 和 NdisFreeNetBufferList 函数 ,或者准备在后续调用 NdisFSendNetBufferLists 时重复使用。

NDIS 始终按照传递给 NdisFSendNetBufferLists 的Filter驱动程序确定的顺序向基础驱动程序提交Filter提供的网络数据。 但是,按指定顺序发送数据后,基础驱动程序可以按任意顺序返回缓冲区。

Filter驱动程序可以请求其发起的发送请求的环回。 若要请求环回,驱动程序在 NdisFSendNetBufferLists 的 SendFlags 参数中设置NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK标志。 NDIS 指示包含发送数据的已接收数据包。

注意 Filter驱动程序应跟踪其发起的发送请求,并确保在此类请求完成时不会调用 NdisFSendNetBufferListsComplete 函数。

过滤发送请求

下图说明了如何过滤由过度分配的驱动程序发起的发送请求:

NDIS 调用Filter驱动程序的 FilterSendNetBufferLists 函数来筛选过大驱动程序的发送请求。

Filter驱动程序不得修改从其他驱动程序接收的 NET_BUFFER_LIST 结构中的 SourceHandle 成员。

Filter驱动程序可以筛选数据并将筛选的数据发送到基础驱动程序。 对于提交到 FilterSendNetBufferLists 的每个NET_BUFFER结构,Filter驱动程序可以执行以下操作:

  • 通过调用 NdisFSendNetBufferLists 函数,将缓冲区传递到下一个基础驱动程序。 NDIS 保证上下文空间的可用性, 查看Filter驱动程序 NET_BUFFER_LIST_CONTEXT结构。 Filter驱动程序可以在调用 NdisFSendNetBufferLists 之前修改缓冲区内容。 筛选数据的处理与Filter驱动程序启动的发送操作一样进行;
  • 通过调用 NdisFSendNetBufferListsComplete 函数删除缓冲区;
  • 在本地数据结构中将缓冲区排队,供以后处理。 Filter驱动程序的设计决定了导致驱动程序处理排队缓冲区的原因。 一些示例包括超时后的处理或在收到特定缓冲区后进行处理。注意 如果驱动程序将发送请求排队以供以后处理,则必须支持发送取消请求。 有关发送取消请求的详细信息,请参阅 在Filter驱动程序中取消发送请求;
  • 复制缓冲区,并使用副本发起发送请求。 发送操作类似于Filter驱动程序发起的发送请求。 在这种情况下,驱动程序必须通过调用 NdisFSendNetBufferListsComplete 函数,将原始缓冲区返回到上置驱动程序;

完成发送请求会继续上行驱动程序堆栈。 当微型端口驱动程序调用 NdisMSendNetBufferListsComplete 函数时,NDIS 将调用 FilterSendNetBufferListsComplete 函数以获取最低覆盖Filter模块。

发送操作完成后,Filter驱动程序将反转对Filter驱动程序在 FilterSendNetBufferLists 中对过度覆盖驱动程序的缓冲区描述符的修改。 驱动程序调用 NdisFSendNetBufferListsComplete 函数,以将NET_BUFFER_LIST结构的链接列表返回到上部驱动程序,并返回发送请求的最终状态。

当最顶层的Filter模块调用 NdisFSendNetBufferListsComplete 时,NDIS 将调用原始协议驱动程序的 ProtocolSendNetBufferListsComplete 函数。

不提供 FilterSendNetBufferLists 函数的Filter 驱动程序仍然可以启动发送请求。 如果此类驱动程序确实启动发送请求,则必须提供 FilterSendNetBufferListsComplete 函数,并且不得在驱动程序堆栈上传递完整事件。

Filter驱动程序可以传递或筛选过大驱动程序的环回请求。 若要传递环回请求,如果 NDIS 在 FilterSendNetBufferLists 的 SendFlags 参数中设置NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK,Filter驱动程序在调用 NdisFSendNetBufferLists 时在 SendFlags 参数中设置NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK。 NDIS 指示包含发送数据的已接收数据包。

通常,如果Filter驱动程序以 NDIS 无法提供标准服务(如环回 )的方式修改任何行为,则Filter驱动程序必须为 NDIS 提供该服务。 例如,修改硬件地址请求 ( OID_802_3_CURRENT_ADDRESS) 的Filter驱动程序应处理定向到新硬件地址的缓冲区的环回。 在这种情况下,NDIS 无法提供它通常提供的环回服务,因为Filter更改了地址。 此外,如果Filter驱动程序设置杂乱模式 ,例如OID_GEN_CURRENT_PACKET_FILTER),则它不应将其收到的额外数据传递给过度覆盖的驱动程序。

取消Filter驱动程序中的发送请求

Filter驱动程序可以取消发送由Filter驱动程序发起或由过度分配驱动程序发起的请求。

取消Filter驱动程序发送请求

下图说明了如何取消由Filter驱动程序发起的发送请求:

Filter驱动程序为它为发送操作创建的每个NET_BUFFER_LIST结构调用 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID宏。 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID 函数使用取消标识符标记指定的数据。

在将取消 ID 分配给网络数据之前,Filter驱动程序必须调用 NdisGeneratePartialCancelId 以获取它分配的每个取消 ID 的高序字节。 这可确保驱动程序不会重复系统中其他驱动程序分配的取消 ID。 驱动程序通常从 DriverEntry 例程调用 NdisGeneratePartialCancelId 一次。 但是,驱动程序可以通过多次调用 NdisGeneratePartialCancelId 来获取多个部分取消标识符。

若要取消标记NET_BUFFER_LIST结构中数据的挂起传输,Filter驱动程序会将取消 ID 传递给 NdisFCancelSendNetBufferLists 函数。 驱动程序可以通过调用 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 宏来获取 NET_BUFFER_LIST 结构的取消 ID。

如果Filter驱动程序使用相同的取消标识符标记所有NET_BUFFER_LIST结构,则只需调用 NdisFCancelSendNetBufferLists 即可取消所有挂起的传输。 如果Filter驱动程序使用唯一标识符标记NET_BUFFER_LIST结构的子组中的所有NET_BUFFER_LIST结构,则只需调用 NdisFCancelSendNetBufferLists 即可取消该子组中所有挂起的传输。

NDIS 调用基础驱动程序的取消发送函数。 中止挂起的传输后,基础驱动程序调用 send complete 函数 (例如 NdisMSendNetBufferListsComplete) ,以返回完成状态为NDIS_STATUS_SEND_ABORTED的NET_BUFFER_LIST结构。 NDIS 又调用Filter驱动程序的 FilterSendNetBufferListsComplete 函数。

在 FilterSendNetBufferListsComplete 中,Filter驱动程序可以在 CancelId 设置为 NULL 的情况下调用NDIS_SET_NET_BUFFER_LIST_CANCEL_ID。 这可以防止NET_BUFFER_LIST意外地再次使用过时的取消 ID。

取消发送由过度覆盖驱动程序发出的请求 

 下图说明了如何取消由过度分配的驱动程序发起的发送请求:

过度调用驱动程序 ( NdisFCancelSendNetBufferLists 或 NdisCancelSendNetBufferLists) 取消未完成的发送请求。 在发出发送请求之前,这些过度的驱动程序必须使用取消 ID 标记发送数据。

NDIS 调用Filter驱动程序的 FilterCancelSendNetBufferLists 函数来取消所有标有指定取消标识符的 NET_BUFFER_LIST 结构的传输。

FilterCancelSendNetBufferLists 执行以下操作:

  • 遍历指定Filter模块的已排队NET_BUFFER_LIST结构的Filter驱动程序列表,并调用 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 宏以获取每个结构的取消标识符。 Filter驱动程序将NDIS_GET_NET_BUFFER_LIST_CANCEL_ID返回的取消 ID 与 NDIS 传递给 FilterCancelSendNetBufferLists 的取消 ID 进行比较;
  • 从发送队列中删除 (取消链接) 其取消标识符与指定取消标识符匹配的所有NET_BUFFER_LIST结构;
  • 为所有未链接的NET_BUFFER_LIST结构调用 NdisFSendNetBufferListsComplete 函数以返回结构。 Filter驱动程序将NET_BUFFER_LIST结构的状态字段设置为NDIS_STATUS_SEND_ABORTED;
  • 调用 NdisFCancelSendNetBufferLists 函数,将取消发送请求传递给基础驱动程序。 Filter驱动程序传递它从过度的驱动程序收到的取消标识符。 取消操作与Filter驱动程序发起的取消发送操作一样继续;
在Filter驱动程序中接收数据

Filter驱动程序可以启动接收指示,也可以从基础驱动程序启动Filter接收指示。 当微型端口驱动程序调用 NdisMIndicateReceiveNetBufferLists 函数时,NDIS 会将指定的 NET_BUFFER_LIST 结构提交到驱动程序堆栈中最低的过度筛选模块。

接收Filter驱动程序启动的指示

下图演示了Filter驱动程序启动的接收指示。

Filter驱动程序调用 NdisFIndicateReceiveNetBufferLists 函数来指示收到的数据。 NdisFIndicateReceiveNetBufferLists 函数将堆栈上NET_BUFFER_LIST结构的指示列表传递给超载驱动程序。 Filter驱动程序从它在初始化期间创建的池中分配结构。

如果Filter驱动程序在 NdisFIndicateReceiveNetBufferLists 的 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAGS_RESOURCES标志,则表示Filter驱动程序必须立即重新获得NET_BUFFER_LIST结构的所有权。 在这种情况下,NDIS 不会调用Filter驱动程序的 FilterReturnNetBufferLists 函数来返回 NET_BUFFER_LIST 结构。 Filter驱动程序在 NdisFIndicateReceiveNetBufferLists 返回后立即重新获得所有权。

如果Filter驱动程序未在 NdisFIndicateReceiveNetBufferLists 的 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAGS_RESOURCES标志,则 NDIS 会将指示的NET_BUFFER_LIST结构返回到Filter驱动程序的 FilterReturnNetBufferLists 函数。 在这种情况下,Filter驱动程序将放弃所指示结构的所有权,直到 NDIS 将它们返回到 FilterReturnNetBufferLists。

注意 Filter驱动程序应跟踪它启动的接收指示,并确保它在接收操作完成时不调用 NdisFReturnNetBufferLists 函数。

过滤接收指示

下图演示了基础驱动程序启动的过滤接收指示:

NDIS 调用Filter驱动程序的 FilterReceiveNetBufferLists 函数来处理来自基础驱动程序的接收指示。 NDIS 在基础驱动程序调用接收指示函数后调用 FilterReceiveNetBufferLists , (例如 ,NdisMIndicateReceiveNetBufferLists) 来指示接收的网络数据或环回数据。

如果未设置 FilterReceiveNetBufferLists 的 ReceiveFlags 参数中的NDIS_RECEIVE_FLAGS_RESOURCES标志,Filter驱动程序将保留NET_BUFFER_LIST结构的所有权,直到调用 NdisFReturnNetBufferLists 函数。

如果设置了 ReceiveFlags 参数中的NDIS_RECEIVE_FLAGS_RESOURCES标志,则Filter驱动程序无法保留NET_BUFFER_LIST结构和关联的基础驱动程序分配的资源。 此标志可以指示基础驱动程序的接收资源不足。 FilterReceiveNetBufferLists 函数应尽快返回。

注意 如果设置了 NDIS_RECEIVE_FLAGS_RESOURCES 标志,Filter驱动程序必须在链接列表中保留原始 NET_BUFFER_LIST 结构集。 例如,当设置此标志时,驱动程序可能会处理结构,并一次一个地在堆栈上指示它们,但在函数返回之前,它必须还原原始链接列表。

Filter驱动程序可以先对收到的数据执行筛选操作,然后再将数据指示给过度覆盖的驱动程序。 对于提交到 FilterReceiveNetBufferLists 函数的每个缓冲区,Filter驱动程序可以执行以下操作:

  • 通过调用 NdisFIndicateReceiveNetBufferLists,将其传递给下一个过度覆盖的驱动程序。 驱动程序可以修改缓冲区的内容。 NDIS 保证上下文空间的可用性, 通过查看 NET_BUFFER_LIST_CONTEXT结构;Filter驱动程序可以更改 NDIS 传递到 FilterReceiveNetBufferLists 的状态,也可以直接将其传递给 NdisFIndicateReceiveNetBufferLists。注意即使 NDIS 在 FilterReceiveNetBufferLists 的ReceiveFlags 参数中设置了 NDIS_RECEIVE_FLAGS_RESOURCES 标志,Filter驱动程序也可以使用 NdisFIndicateReceiveNetBufferLists 传递缓冲区。 在这种情况下,Filter驱动程序不得从 FilterReceiveNetBufferLists 返回,直到它重新获得缓冲区的所有权;
  • 放弃缓冲区。 如果 NDIS 清除 FilterReceiveNetBufferLists 的 ReceiveFlags 参数中的NDIS_RECEIVE_FLAGS_RESOURCES标志,请调用 NdisFReturnNetBufferLists 函数以放弃缓冲区。 如果 NDIS 在 FilterReceiveNetBufferLists 的 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAGS_RESOURCES标志,则不执行任何操作,并从 FilterReceiveNetBufferLists 返回以放弃缓冲区;
  • 在本地数据结构中将缓冲区排队,供以后处理。 如果 NDIS 在 FilterReceiveNetBufferLists 的 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAGS_RESOURCES标志,则Filter驱动程序必须在从 FilterReceiveNetBufferLists 返回之前创建副本;
  • 复制缓冲区,并使用副本生成接收指示。 接收指示类似于Filter驱动程序启动的接收指示。 在这种情况下,驱动程序必须将原始缓冲区返回到基础驱动程序;

NdisFIndicateReceiveNetBufferLists 函数将指示的NET_BUFFER_LIST结构列表传递到驱动程序堆栈上到过度覆盖的驱动程序。 接收操作的继续方式类似于Filter驱动程序发起的接收操作。

如果过分驱动程序保留了缓冲区的所有权,NDIS 会为Filter模块调用 FilterReturnNetBufferLists 函数。 在其 FilterReturnNetBufferLists 函数中,Filter驱动程序将撤消它在接收指示路径上的缓冲区上执行的操作。

当最低层Filter模块指示它已使用缓冲区完成时,NDIS 会将缓冲区返回到微型端口驱动程序。 如果 NDIS 清除 FilterReceiveNetBufferLists 的 ReceiveFlags 参数中的 NDIS_RECEIVE_FLAGS_RESOURCES 标志,则Filter驱动程序会调用 NdisFReturnNetBufferLists 以返回缓冲区。 如果 NDIS 在 FilterReceiveNetBufferLists 的 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAGS_RESOURCES标志,则从 FilterReceiveNetBufferLists 返回将返回缓冲区。

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

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

相关文章

谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 1)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第326p-第p331的内容 关注的问题 sentinel(哨兵) sentinel来实现熔断、降级、限流等操作 腾讯开源的tendis&#xff0c…

ctfshow web

【nl】难了 <?php show_source(__FILE__); error_reporting(0); if(strlen($_GET[1])<4){echo shell_exec($_GET[1]); } else{echo "hack!!!"; } ?> //by Firebasky //by Firebasky ?1>nl //先写个文件 ?1*>b //这样子会把所有文件名写在b里…

JSON 无法序列化

JSON 无法序列化通常出现在尝试将某些类型的数据转换为 JSON 字符串时&#xff0c;这些数据类型可能包含不可序列化的内容。 JSON 序列化器通常无法处理特定类型的数据&#xff0c;例如日期时间对象、自定义类实例等。在将数据转换为 JSON 字符串之前&#xff0c;确保所有数据都…

「动态规划」如何求地下城游戏中,最低初始健康点数是多少?

174. 地下城游戏https://leetcode.cn/problems/dungeon-game/description/ 恶魔们抓住了公主并将她关在了地下城dungeon的右下角。地下城是由m x n个房间组成的二维网格。我们英勇的骑士最初被安置在左上角的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。骑士…

【Text2SQL 论文】C3:使用 ChatGPT 实现 zero-shot Text2SQL

论文&#xff1a;C3: Zero-shot Text-to-SQL with ChatGPT ⭐⭐⭐⭐ arXiv:2307.07306&#xff0c;浙大 Code&#xff1a;C3SQL | GitHub 一、论文速读 使用 ChatGPT 来解决 Text2SQL 任务时&#xff0c;few-shots ICL 的 setting 需要输入大量的 tokens&#xff0c;这有点昂贵…

MacOS M系列芯片一键配置多个不同版本的JDK

第一步&#xff1a;下载JDK。 官网下载地址&#xff1a;Java Archive | Oracle 选择自己想要下载的版本&#xff0c;一般来说下载一个jdk8和一个jdk11就够用了。 M系列芯片选择这两个&#xff0c;第一个是压缩包&#xff0c;第二个是dmg可以安装的。 第二步&#xff1a;编辑…

eclipse插件开发(二)RCP第三方库的引入方式

RCP第三方库的引入 最近在RCP开发过程中遇到JSON串与对象互转的问题&#xff0c;如何像spring开发模式一样引入第三方库呢&#xff1f;eclipse插件开发中用到p2库&#xff0c;但也支持maven库的引入。关键在于.target这个关键文件。 .target 文件用于定义一个目标平台&#x…

民主测评要做些什么?

民主测评&#xff0c;作为一种重要的民主管理工具&#xff0c;旨在通过广泛征求群众意见&#xff0c;对特定对象或事项进行客观、公正的评价。它不仅是推动民主参与、民主监督的重要手段&#xff0c;也是提升治理效能、促进社会和谐的有效途径。以下将详细介绍民主测评的主要过…

如何以非交互方式将参数传递给交互式脚本

文章目录 问题回答1. 使用 Here Document2. 使用 echo 管道传递3. 使用文件描述符4. 使用 expect 工具 参考 问题 我有一个 Bash 脚本&#xff0c;它使用 read 命令以交互方式读取命令参数&#xff0c;例如 yes/no 选项。是否有一种方法可以在非交互式脚本中调用这个脚本&…

Chrome 源码阅读:跟踪一个鼠标事件的流程

我们通过在关键节点打断点的方式&#xff0c;去分析一个鼠标事件的流程。 我们知道chromium是多进程模型&#xff0c;那么&#xff0c;我们可以推测&#xff1a;一个鼠标消息先从主进程产生&#xff0c;再通过跨进程通信发送给渲染进程&#xff0c;渲染进程再发送给WebFrame&a…

【FAS】《CN103106397B》

原文 CN103106397B-基于亮瞳效应的人脸活体检测方法-授权-2013.01.19 华南理工大学 方法 / 点评 核心方法用的是传统的形态学和模板匹配&#xff0c;亮点是双红外发射器做差分 差分&#xff1a;所述FPGA芯片控制两组红外光源&#xff08;一近一远&#xff09;交替亮灭&…

RDMA (2)

iWARP(RDMA)怎么工作的 招式1:bypass内核 非iWARP时,当应用向网络适配器发出读或者写命令时,命令穿过用户空间以及内核空间,因此需要在用户空间和内核空间间进行切换。 iWARP使用RDMA,让应用直接将命令送达到网络适配器。这规避了对内核的调用,减少了开销和延迟。 招式2…

【Kubernetes】三证集齐 Kubernetes实现资源超卖(附镜像包)

目录 插叙前言一、思考和原理二、实现步骤0. 资料包1. TLS证书签发2. 使用 certmanager 生成签发证书3. 获取secret的内容 并替换CA_BUNDLE4.部署svc deploy 三、测试验证1. 观察pod情况2. 给node 打上不需要超售的标签【可以让master节点资源不超卖】3. 资源实现超卖4. 删除还…

IP域名关系的研究与系统设计(学习某知名测绘系统)

IP域名关系库管理包括域名库检索和whois库检索&#xff0c;详情如下。 域名库检索支持以下5项功能&#xff1a; 1.通过过滤器检索 筛选条件包含IP地址、口令、工具名称、可利用的漏洞编号、创建时间&#xff1b; 2.通过关键字检索 在查询框中输入域名库名称的部分关键词&a…

计算机组成结构—IO系统概述

目录 一、I/O 系统的发展 1. 早期阶段 2. 接口模块和 DMA 阶段 3. 通道结构阶段 4. 处理机阶段 二、I/O 系统的组成 1. I/O 软件 2. I/O 硬件 三、I/O 设备 1. I/O 设备分类 2. I/O 设备的组成 在计算机中&#xff0c;除 CPU 和主存两大模块之外&#xff0c;第三个重…

Apple开发者应用商店(AppStore)描述文件及ADHOC描述文件生成

创建AD HOC描述文件 1.选中Profiles,然后点击加号创建 2.创建已注册设备可安装描述文件 3.选择要注册的id 4.选择证书 5.选择设备 6.输入文件名,点击生成 7.生成成功,点击下载

Java使用OpenCV计算两张图片相似度

业务&#xff1a;找出两个表的重复的图片。 图片在表里存的是二进制值&#xff0c;存在大量由于一些特殊情况例如扫描有差异&#xff0c;导致图片存的二进制值不同&#xff0c;但图片其实是一样来的。 所以找出两个表重复相同的图片&#xff0c;不可能只是单纯的比较二进制值…

flask招聘数据分析及展示平台-计算机毕业设计源码39292

目 录 摘要 1 绪论 1.1研究意义 1.2国内外研究进展 1.3flask框架介绍 2 1.4论文结构与章节安排 3 2 招聘数据分析及展示平台分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除流程 5 2.3 系统功能分析 5 2.3.1 功能性分…

亚马逊新品如何快速吸引流量?自养号测评助卖家一臂之力

在亚马逊平台上每天都会有大量的新品推出&#xff0c;而这些新品中有部分可能并没有什么流量和订单&#xff0c;有些可能上架后立马就能获得流量了&#xff0c;那么亚马逊上新品一般几天出单&#xff1f; 一、亚马逊上新品一般几天出单&#xff1f; 亚马逊上新品出单的时间因…

人工智能时代,想转型AI产品经理?这篇文章你不应该错过

前言 在这个日新月异的智能时代&#xff0c;人工智能&#xff08;AI&#xff09;已经从未来概念转变为推动各行各业发展的核心驱动力。作为连接技术与市场的桥梁&#xff0c;AI产品经理的角色愈发关键&#xff0c;他们不仅是技术的翻译者&#xff0c;更是创新的推动者。如果你…