このセクションでは、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構造体のNET_BUFFER_SHARED_MEMORYにアクセスするには、NET_BUFFER_SHARED_MEM_NEXT_SEGMENT、NET_BUFFER_SHARED_MEM_FLAGS、NET_BUFFER_SHARED_MEM_HANDLE、NET_BUFFER_SHARED_MEM_OFFSET、およびNET_BUFFER_SHARED_MEM_LENGTHのマクロを使用します。 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 フラグを設定しません。