다음을 통해 공유


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에서 설명하는 첫 번째 버퍼를 제외한 모든 버퍼는 보조 버퍼로 간주됩니다. MDL과 연결된 IRP가 없는 경우 이 필드는 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이면 루틴은 Irp-MdlAddress > 를 업데이트하여 새 MDL을 가리킵니다. SecondaryBufferTRUE이면 루틴은 Irp-MdlAddress > 가 가리키는 MDL 체인의 끝에 MDL을 추가합니다.

MDL에 대한 자세한 내용은 MDL 사용을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

추가 정보

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool