接收缓冲区中的共享内存

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

如果覆盖协议驱动程序在 NDIS_RECEIVE_QUEUE_PARAMETERS 结构的 Flags 成员中设置了 NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED 标志,则网络适配器应在等于或大于请求的 lookahead 大小的偏移量处拆分收到的数据包,并使用 DMA 传输 lookahead 数据和后查看头数据以分隔共享内存段。

分配共享内存时,微型端口驱动程序指定查找类型 (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 标志。