受信バッファー内の共有メモリ
このセクションでは、VMQ 受信バッファーの共有メモリのレイアウトについて説明します。受信インジケーターでバッファーを使用する方法の詳細については、「VMQ 受信パス」を参照してください。
上にあるプロトコル ドライバーがNDIS_RECEIVE_QUEUE_PARAMETERS構造体の Flags メンバーにNDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED フラグを設定する場合、ネットワーク アダプターは、要求された先読みサイズ以上のオフセットで受信パケットを分割し、DMA を使用して先読みデータと先読み後データを個別の共有メモリ セグメントに転送する必要があります。
ミニポート ドライバーは、共有メモリが割り当てられているときに、先読みの種類 (NdisSharedMemoryUsageReceiveLookahead) またはその他の共有メモリの種類の設定を指定します。 たとえば、ミニポート ドライバーは NdisAllocateSharedMemory 関数を呼び出し、NDIS_SHARED_MEMORY_PARAMETERS構造体の Usage メンバーを NdisSharedMemoryUsageReceiveLookahead に設定します。 ミニポート ドライバーは、キューの割り当てが完了したときに、キューの共有メモリを割り当てる必要があります。 キューの共有メモリ リソースの割り当てと解放については、「共有メモリ リソースの割り当て」を参照してください。
次の図は、受信データが 2 つの共有メモリ バッファーに分割されたときのネットワーク データのリレーションシップを示しています。
NET_BUFFER_SHARED_MEMORY 構造体は、共有メモリ情報を指定します。 このような共有メモリ バッファーのリンクされたリストが、NET_BUFFER 構造体に関連付けられている場合があります。
NET_BUFFER_SHARED_MEM_NEXT_SEGMENT、NET_BUFFER_SHARED_MEM_FLAGS、NET_BUFFER_SHARED_MEM_HANDLE、NET_BUFFER_SHARED_MEM_OFF SET、およびNET_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 フラグを設定しません。