IoBuildPartialMdl 関数 (wdm.h)

IoBuildPartialMdl ルーチンは、既存の MDL によって記述されるバッファーの一部を表す新しいメモリ記述子リスト (MDL) を構築します。

構文

void IoBuildPartialMdl(
  [in]      PMDL  SourceMdl,
  [in, out] PMDL  TargetMdl,
  [in]      PVOID VirtualAddress,
  [in]      ULONG Length
);

パラメーター

[in] SourceMdl

サブ範囲をマップする元のバッファーを記述する MDL へのポインター。

[in, out] TargetMdl

呼び出し元によって割り当てられた MDL へのポインター。 この MDL は、 VirtualAddressLength で指定されたサブ範囲のページを記述するのに十分な大きさにする必要があります。

[in] VirtualAddress

TargetMdl によって記述されるサブ範囲のベース仮想アドレスへのポインター。

[in] Length

TargetMdl によってマップされる長さをバイト単位で指定します。 この値は 、VirtualAddress と組み合わせて、 SourceMdl によって記述されるバッファーの適切なサブ範囲であるバッファーを指定する必要があります。 Length が 0 の場合、マップされるサブ範囲は VirtualAddress から始まり、SourceMdl によって記述された残りの範囲が含まれます。

戻り値

なし

解説

このルーチンは、ソース MDL によって記述されるバッファーのサブ範囲を記述するターゲット MDL を構築します。 このサブ範囲は、 VirtualAddress パラメーターと Length パラメーターで指定されます。 SourceMdl パラメーターと TargetMdl パラメーターは、ソース MDL とターゲット MDL を指します。

ドライバーは 、IoBuildPartialMdl を使用して、大きな転送要求をより小さな転送要求に分割できます。 ソース MDL が記述する物理ページは、ドライバーが IoBuildPartialMdl を呼び出す前にロックする必要があります。 通常、ソース MDL はユーザー アドレス空間内のバッファーを記述し、ドライバーは MmProbeAndLockPages ルーチンを呼び出して、このバッファー内のページをロックします。 ただし、ドライバーは、 MmBuildMdlForNonPagedPoolMmAllocatePagesForMdlEx、または MmAllocatePagesForMdl ルーチンを呼び出すことによって、非ページ メモリからソース MDL を ビルドできます。

部分的な MDL を作成する場合:

  • 元の MDL が既にシステム空間にマップされている場合、部分的な MDL はそのマッピングを共有し、再度マップする必要はありません。
  • 元の MDL がシステム空間にマップされていない場合、部分的な MDL もマップされません。 システム モード アドレスが必要な場合は、部分的な MDL で MmGetSystemAddressForMdlSafe を呼び出します。
  • 上記のどれが適用されるかがわからない場合は、関係なく MmGetSystemAddressForMdlSafe を呼び出しても安全です。 システム アドレス空間に既にマップされているソース MDL から部分的な MDL がビルドされている場合、 MmGetSystemAddressForMdlSafe は既存のソース マッピングを使用します。 それ以外の場合は、 MmGetSystemAddressForMdlSafe によって新しいマッピングが作成されます。

この新しいマッピングがリークされないようにするには、ドライバーは部分的な MDL を再利用する前に MmPrepareMdlForReuse を呼び出す必要があります。 さらに、 IoFreeMdl ルーチンは、そのようなマッピングが存在する場合に、部分的な MDL のシステム アドレス空間マッピングを解放します。

MDL の詳細については、「MDL の使用」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 MdlAfterReqCompletedIntIoctlA(kmdf)MdlAfterReqCompletedIoctlA(kmdf)MdlAfterReqCompletedReadA(kmdf)MdlAfterReqCompletedWriteA(kmdf)

こちらもご覧ください

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages