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 は、VirtualAddress および Lengthで指定されたサブ範囲のページ 記述するのに十分な大きさである必要があります。
[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 ルーチンを呼び出して、このバッファー内のページをロックします。 ただし、ドライバーは、MmBuildMdlForNonPagedPool、MmAllocatePagesForMdlEx、または mmAllocatePagesForMdl ルーチン を呼び出すことによって、非ページ メモリからソース MDL をビルドできます。
部分的な MDL を作成する場合:
- 元の MDL が既にシステム空間にマップされている場合、部分的な MDL はそのマッピングを共有し、再マップする必要はありません。
- 元の MDL がシステム空間にマップされていない場合、部分的な MDL もマップされません。 システム モード アドレスが必要な場合は、部分的な MDL MmGetSystemAddressForMdlSafe を呼び出します。
- 上記のどれが適用されるかがわからない場合は、MmGetSystemAddressForMdlSafe を呼び出しても問題ありません。 システム アドレス空間に既にマップされているソース MDL から部分的な MDL がビルドされている場合、mmGetSystemAddressForMdlSafe は既存のソース マッピングを使用します。 それ以外の場合は、mmGetSystemAddressForMdlSafe 新しいマッピングが作成されます。
この新しいマッピングがリークされないようにするには、部分的な MDL を再利用する前に、ドライバー MmPrepareMdlForReuse を呼び出す必要があります。 さらに、IoFreeMdl ルーチンは、部分的な MDL のシステム アドレス空間マッピングを解放します (そのようなマッピングが存在する場合)。
MDL の詳細については、「MDLの使用」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 2000 以降で使用できます。 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=DISPATCH_LEVEL |
DDI コンプライアンス規則 を する | MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf) |
関連項目
IoFreeMdl の
mmAllocatePagesForMdl の
mmAllocatePagesForMdlEx の
mmGetSystemAddressForMdlSafe の
mmPrepareMdlForReuse の