Функция NdisAllocateMdl (ndis/mdlapi.h)
Функция NdisAllocateMdl выделяет MDL, описывающий буфер памяти по указанному виртуальному адресу.
Синтаксис
NDIS_EXPORTED_ROUTINE MDL * NdisAllocateMdl(
[in] NDIS_HANDLE NdisHandle,
[in] PVOID VirtualAddress,
[in] ULONG Length
);
Параметры
[in] NdisHandle
Дескриптор NDIS, полученный во время инициализации вызывающего объекта. Дополнительные сведения см. в разделе Получение дескрипторов пула.
[in] VirtualAddress
Указатель на базовый виртуальный адрес буфера, описываемого MDL.
Параметр VirtualAddress для NdisAllocateMdl принимает память только из непагрегированного пула. Другими словами, требуется память из ExAllocatePool*(NonPagedNx), NdisAllocateMemoryWithTagPriority или NdisMAllocateSharedMemory. В частности, его не следует использовать с памятью из стека, выстраивного пула, глобальных данных драйвера или других регионов памяти.
Если драйверу необходимо создать MDL для одного из этих непагрегированных регионов пула, он должен использовать соответствующие API ядра для этого типа памяти, например IoAllocateMdl в сочетании с MmProbeAndLockPages.
[in] Length
Размер буфера памяти (в байтах).
Возвращаемое значение
NdisAllocateMdl возвращает указатель на выделенный MDL. Если выделение не удается, возвращаемое значение равно NULL.
Комментарии
Все mdls, выделенные путем вызова NdisAllocateMdl , должны быть освобождены путем вызова функции NdisFreeMdl .
NdisAllocateMdl выделяет память и создает MDL за один шаг. Этот процесс отличается от IoAllocateMdl, который выделяет только память для MDL, то есть вызывающий объект должен создать MDL путем вызова mmBuildMdlForNonPagedPool или MmProbeAndLockPages.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Поддерживается в NDIS 6.0 и более поздних версиях. |
Целевая платформа | Универсальное |
Минимальная версия UMDF | 2.33 |
Верхняя часть | ndis/mdlapi.h (включая ndis.h) |
Библиотека | Ndis.lib |
IRQL | <= DISPATCH_LEVEL |
Правила соответствия DDI | Irql_NetBuffer_Function(ndis), NdisAllocateMdl(ndis) |