次の方法で共有


NdisMAllocateNetBufferSGList 関数 (ndis.h)

注意事項

ARM および ARM64 プロセッサの場合、NDIS ドライバー ライターでは、NDIS 散布/収集 DMA の代わりに WDF DMA または WDM DMA を使用することを強くお勧めします。

WDF DMA の詳細については、「 KMDF ドライバーでの DMA 操作の処理」を参照してください。

WDM DMA の詳細については、「 ドライバーの入出力の管理」の DMA 関連の子トピックを参照してください。

バス マスター ミニポート ドライバーは 、NdisMAllocateNetBufferSGList 関数を呼び出して、 NET_BUFFER 構造に関連付けられているネットワーク データの散布図/収集リストを取得します。

構文

NDIS_STATUS NdisMAllocateNetBufferSGList(
  [in]           NDIS_HANDLE NdisMiniportDmaHandle,
  [in]           PNET_BUFFER NetBuffer,
  [in]           PVOID       Context,
  [in]           ULONG       Flags,
  [in, optional] PVOID       ScatterGatherListBuffer,
  [in]           ULONG       ScatterGatherListBufferSize
);

パラメーター

[in] NdisMiniportDmaHandle

NDIS が DMA リソースの管理に使用するコンテキスト領域へのハンドル。 呼び出し元は、 を呼び出してこのハンドルを取得しました。 NdisMRegisterScatterGatherDma 関数。

[in] NetBuffer

NET_BUFFER構造体へのポインター。 NdisMAllocateNetBufferSGList は、このNET_BUFFER構造に関連付けられているネットワーク データの散布/収集リストを割り当てます。 散布図/収集リストは、関連付けられたNET_BUFFER_DATA構造体の CurrentMdl メンバーで指定された MDL の先頭からデータから生成されます。

[in] Context

呼び出し元が作成したコンテキスト領域へのポインター。 HAL は、HAL が散布図/収集リストを作成した後 に、このポインターを MiniportProcessSGList に渡します。 呼び出し元は、独自の目的でこのコンテキスト領域を使用できます。

[in] Flags

OR 操作と組み合わせることができる NDIS フラグ。 すべてのフラグをクリアするには、このメンバーを 0 に設定します。 この関数は、NDIS_SG_LIST_WRITE_TO_DEVICE フラグをサポートします。が設定されている場合は、DMA 転送の方向がNET_BUFFERからデバイスに送信されていることを示します。 NDIS_SG_LIST_WRITE_TO_DEVICEが明確な場合、転送はデバイスから行われます。 DMA 操作がNET_BUFFERからデバイスにデータを転送する場合、ミニポート ドライバーは送信パスにこのフラグを設定する必要があります。 デバイスから事前に割り当てられたNET_BUFFERに DMA 操作を実行するミニポート ドライバー (たとえば、受信操作中にチムニー オフロード対応 NIC) は、このフラグをクリアする必要があります。

[in, optional] ScatterGatherListBuffer

NULL でない場合、ScatterGatherListBuffer は、呼び出し元が散布/収集リストを保持するために割り当てるストレージへのポインターを指定します。 NULL の場合、NDIS は散布/収集リストの記憶域を割り当てます。

[in] ScatterGatherListBufferSize

ScatterGatherListBuffer パラメーターが NULL でない場合、ScatterGatherListBufferSize は、散布/収集リストを含むバッファーのサイズを指定します。 このサイズが小さすぎる場合、NDIS は散布図/収集リストに記憶域を割り当てます。 ScatterGatherListBuffer パラメーターが NULL の場合、このパラメーターは使用されません。

戻り値

NdisMAllocateNetBufferSGList は、次のいずれかを返します。

リターン コード 説明
NDIS_STATUS_SUCCESS
NdisMAllocateNetBufferSGList は、指定したNET_BUFFER構造体の散布/収集リストを正常に作成しました。
NDIS_STATUS_RESOURCES
リソースが不足しているため、NdisMAllocateNetBufferSGList が失敗しました。

注釈

NDIS バス マスター ミニポート ドライバーは、 そのから NdisMAllocateNetBufferSGList を呼び出します。 MiniportSendNetBufferLists 関数。 ミニポート ドライバーは、散布図/収集リストを取得する必要がある各NET_BUFFER構造体に対して NdisMAllocateNetBufferSGList を 1 回呼び出します。

ミニポート ドライバーが NdisMAllocateNetBufferSGList を呼び出すと、NDIS は HAL を呼び出して散布/収集リストを構築します。 HAL は、散布図/収集リストをビルドした後、ミニポート ドライバーを呼び出すことによって登録されている ミニポートProcessSGList 関数を呼び出します。 NdisMRegisterScatterGatherDma

HAL は、NDIS が NdisMAllocateNetBufferSGList から返される前または後に、MiniportProcessSGList を呼び出すことができます。 ミニポート ドライバーは、HAL が MiniportProcessSGList を呼び出すまで、散布図/収集リストへのアクセスを試みてはいけません。

システム パフォーマンスを向上させるために、ミニポート ドライバーは NdisMAllocateNetBufferSGListScatterGatherListBuffer パラメーターで使用するためにバッファーを事前割り当てする必要があります。 NDIS は、ミニポート ドライバーが NdisMRegisterScatterGatherDma を呼び出すときに DmaDescription パラメーターの ScatterGatherListSize メンバーのバッファーに推奨されるサイズを提供します。 ミニポート ドライバーは、NdisMAllocateNetBufferSGList を呼び出すときに、ScatterGatherListBufferSize パラメーター内のバッファーのサイズを指定します。

ミニポート ドライバーが ScatterGatherListBuffer パラメーターでバッファーを指定している場合でも、NDIS はバッファーを割り当てる可能性があります。 これは、指定されたバッファーが小さすぎて散布/収集リストを保持できない場合に発生する可能性があります。 したがって、ドライバー ライターは、 ScatterGatherListBuffer パラメーターで指定されたバッファーに散布/収集リストが含まれていると想定しないでください。 HAL は、ミニポート ドライバーの MiniportProcessSGList 関数に正しい散布図/収集リスト ポインターを渡します。

システム パフォーマンスを向上させるために、関連付けられたNET_BUFFER_DATA構造の CurrentMdl メンバーで指定された MDL の先頭から、ネットワーク データから散布図/収集リストが生成されます。 SG リスト内のネットワーク データの開始は、関連付けられたNET_BUFFER_DATA構造体の CurrentMdlOffset メンバーで指定された値によって、SG リストの先頭からオフセットされます。

ミニポート ドライバーは、散布図/収集リストを解放するために NdisMFreeNetBufferSGList 関数を呼び出す必要があります。

要件

要件
サポートされている最小のクライアント NDIS 6.0 以降でサポートされています。
対象プラットフォーム ユニバーサル
Header ndis.h (Ndis.h を含む)
Library Ndis.lib
IRQL DISPATCH_LEVEL
DDI コンプライアンス規則 Irql_Gather_DMA_Function(ndis)

こちらもご覧ください

MiniportProcessSGList

MiniportSendNetBufferLists

NDIS Scatter/Gather DMA

NET_BUFFER

NET_BUFFER_DATA

NdisMFreeNetBufferSGList

NdisMRegisterScatterGatherDma