IoAllocateMdl
PMDL
IoAllocateMdl(
IN PVOID VirtualAddress,
IN ULONG Length,
IN BOOLEAN SecondaryBuffer,
IN BOOLEAN ChargeQuota,
IN OUT PIRP Irp /* optional */
);
IoAllocateMdl allocates an MDL large enough to map a buffer, given its
starting address and length. Optionally, this routine associates the MDL with
an IRP.
Parameters
-
VirtualAddress
-
Points to the base virtual address of the buffer the MDL is to describe.
-
Length
-
Specifies the length in bytes of the buffer the MDL is to describe.
-
SecondaryBuffer
-
Indicates whether the buffer is a primary or secondary buffer. This parameter
determines how the MDL is to be linked to the IRP. All buffers except the
first buffer described by an MDL in an IRP are considered secondary buffers.
This field must be FALSE if no IRP is associated with the MDL.
-
ChargeQuota
-
Should be set to FALSE by intermediate drivers. This can be set to TRUE only
by highest-level drivers that are called in the context of the thread that
originates the I/O request for which the driver is allocating another IRP.
-
Irp
-
Points to an IRP to be associated with the MDL. If the Irp pointer is
nonNULL, the allocated MDL is associated with the specified IRP’s MDL list,
according to the value of SecondaryBuffer.
Return Value
IoAllocateMdl returns a pointer to an MDL or a NULL pointer if the MDL
cannot be allocated.
Comments
IoAllocateMdl can be used by a driver that needs to break a buffer into
pieces, each mapped by a separate MDL, or to map a driver-allocated buffer.
The driver should call MmBuildMdlForNonPagedPool with the MDL allocated
by this call to set up an MDL describing a driver-allocated buffer in nonpaged
pool.
Callers of IoAllocateMdl must be running at IRQL <= DISPATCH_LEVEL.
See Also
IoBuildPartialMdl, IoFreeMdl,
MmBuildMdlForNonPagedPool