接收缓冲区中的共享内存

本部分介绍 VMQ 接收缓冲区中共享内存的布局。有关在接收指示中使用缓冲区的详细信息,请参阅 VMQ 接收路径

如果上层协议驱动程序在 NDIS_RECEIVE_QUEUE_PARAMETERS 结构的 Flags 成员中设置了 NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED 标志,则网络适配器应将接收到的数据包按所请求的看头大小偏移或更大的位置拆分,并使用 DMA 将看头数据和后续数据传输到不同的共享内存段。

微型端口驱动程序在分配共享内存时,指定查找头类型(NdisSharedMemoryUsageReceiveLookahead)或其他类型共享内存的设置。 例如,微型端口驱动程序调用 NdisAllocateSharedMemory 函数,并将 NDIS_SHARED_MEMORY_PARAMETERS 结构中的 Usage 成员设置为 NdisSharedMemoryUsageReceiveLookahead。 队列分配完成后,微型端口驱动程序应为队列分配共享内存。 有关为队列分配和释放共享内存资源的信息,请参阅 共享内存资源分配

下图显示了将传入数据拆分为两个共享内存缓冲区时网络数据的关系。

显示网络数据关系图,其中传入数据拆分为两个共享内存缓冲区。

NET_BUFFER_SHARED_MEMORY结构指定共享内存信息。 可以有与 NET_BUFFER 结构关联的此类共享内存缓冲区的链接列表。

使用 NET_BUFFER_SHARED_MEM_NEXT_SEGMENTNET_BUFFER_SHARED_MEM_FLAGSNET_BUFFER_SHARED_MEM_HANDLENET_BUFFER_SHARED_MEM_OFFSETNET_BUFFER_SHARED_MEM_LENGTH宏来访问NET_BUFFER结构中的NET_BUFFER_SHARED_MEMORY。 NET_BUFFER结构的 SharedMemoryInfo 成员包含链接列表中的第一个NET_BUFFER_SHARED_MEMORY结构。

注意 从 NDIS 6.30 开始,不再支持将数据包数据拆分为单独的看头缓冲区。 从 Windows Server 2012 开始,上层协议驱动程序不会在 NDIS_RECEIVE_QUEUE_PARAMETERS 结构的 Flags 成员中设置 NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED 标志。