IoAllocateMdl 関数 (wdm.h)
IoAllocateMdl ルーチンは、バッファーの開始アドレスと長さを指定して、バッファーをマップするのに十分な大きさのメモリ記述子リスト (MDL) を割り当てます。 必要に応じて、このルーチンは、MDL を IRP に関連付けます。
構文
PMDL IoAllocateMdl(
[in, optional] __drv_aliasesMem PVOID VirtualAddress,
[in] ULONG Length,
[in] BOOLEAN SecondaryBuffer,
[in] BOOLEAN ChargeQuota,
[in, out, optional] PIRP Irp
);
パラメーター
[in, optional] VirtualAddress
MDL が記述するバッファーのベース仮想アドレスへのポインター。
[in] Length
MDL が記述するバッファーの長さをバイト単位で指定します。 詳細については、「解説」を参照してください。
[in] SecondaryBuffer
バッファーがプライマリ バッファーかセカンダリ バッファーかを示します。 このパラメーターは、MDL を IRP にリンクする方法を決定します。 IRP の MDL によって記述された最初のバッファーを除くすべてのバッファーは、セカンダリ バッファーと見なされます。 IRP が MDL に関連付けられていない場合、このフィールドは FALSE である必要があります。 詳細については、「解説」を参照してください。
[in] ChargeQuota
システムで使用するために予約されています。 ドライバーは、このパラメーターを FALSE に設定する必要があります。
[in, out, optional] Irp
MDL に関連付ける IRP へのポインター。 Irp ポインターが NULL 以外の場合、割り当てられた MDL は、SecondaryBuffer の値に従って、指定された IRP の MDL リストに関連付けられます。
戻り値
IoAllocateMdl は MDL へのポインターを返すか、MDL を割り当てることができない場合は NULL を返します。
注釈
IoAllocateMdl は、バッファーを分割して個別の MDL によってマップする必要があるドライバー、またはドライバーによって割り当てられたバッファーをマップする必要があるドライバーで使用できます。 ドライバーは、この呼び出しによって割り当てられた MDL を使用して MmBuildMdlForNonPagedPool を呼び出して、非ページ プール内のドライバー割り当てバッファーを記述する MDL を設定する必要があります。
Length パラメーターは、MDL によって記述されるバッファーのサイズを指定します。 Windows Server 2003、Windows XP、Windows 2000 では、このルーチンが割り当てることができる最大バッファー サイズ (バイト単位) PAGE_SIZE は、 * (65535 - sizeof(MDL)) / sizeof(ULONG_PTR) です。 Windows Vista および Windows Server 2008 では、最大バッファー サイズは (2 ギガバイト - PAGE_SIZE) です。 Windows 7 および Windows Server 2008 R2 以降では、最大バッファー サイズは (4 ギガバイト - PAGE_SIZE) です。
SecondaryBuffer パラメーターが FALSE の場合、ルーチンは新しい MDL を指す Irp-MdlAddress> を更新します。 SecondaryBuffer が TRUE の場合、ルーチンは、Irp-MdlAddress> が指す MDL チェーンの末尾に MDL を追加します。
MDL の詳細については、「MDL の使用」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |