Поделиться через


функция обратного вызова NDK_FN_BUILD_LAM (ndkpi.h)

Функция NdkBuildLam (NDK_FN_BUILD_LAM) получает сопоставление логических адресов адаптера (LAM) от поставщика NDK для практически непрерывной области памяти.

Синтаксис

NDK_FN_BUILD_LAM NdkFnBuildLam;

NTSTATUS NdkFnBuildLam(
  [in]           NDK_ADAPTER *pNdkAdapter,
  [in]           MDL *Mdl,
  [in]           SIZE_T Length,
  [in]           NDK_FN_REQUEST_COMPLETION RequestCompletion,
  [in, optional] PVOID RequestContext,
                 NDK_LOGICAL_ADDRESS_MAPPING *pNdkLAM,
                 ULONG *pLAMSize,
  [out]          ULONG *pFBO
)
{...}

Параметры

[in] pNdkAdapter

Указатель на объект адаптера NDK (NDK_ADAPTER).

[in] Mdl

Список дескрипторов памяти (MDL) или цепочка mdl. Часть цепочки MDL от начального виртуального адреса до количества байтов в параметре Length должна представлять практически непрерывную область памяти.

[in] Length

Число байтов для сопоставления, начиная с виртуального адреса первого MDL. Виртуальный адрес MDL можно получить с помощью макроса MmGetMdlVirtualAddress . Длина не должна превышать общее количество байтов, представленных цепочкой MDL.

[in] RequestCompletion

Указатель на функцию обратного вызова NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION).

[in, optional] RequestContext

Значение контекста для поставщика, передаваемое обратно функции обратного вызова NdkRequestCompletion , указанной в параметре RequestCompletion .

pNdkLAM

Указатель на буфер, который будет содержать структуру NDK_LOGICAL_ADDRESS_MAPPING , содержащую массив страниц адаптера. Массив страниц адаптера хранится в элементе AdapterPageArray , а элемент AdapterPageCount содержит количество элементов страницы адаптера.

pLAMSize

Размер (в байтах) буфера в параметре pNdkLAM для входных данных или фактическое число байтов, записанных для вывода.

[out] pFBO

В этом расположении возвращается первое значение смещения байтов (FBO). FBO — это начальное смещение первой страницы адаптера.

Возвращаемое значение

Функция NdkBuildLam возвращает один из следующих кодов NTSTATUS.

Код возврата Описание
STATUS_SUCCESS
Операция выполнена успешно.
STATUS_PENDING
Запрос находится в состоянии ожидания, функция, указанная в параметре RequestCompletion (NDK_FN_REQUEST_COMPLETION), будет вызываться после завершения операции сборки LAM.
STATUS_INVALID_PARAMETER
Часть цепочки MDL от начального виртуального адреса до количества байтов, указанного в параметре Length , не представляет практически непрерывную область памяти.
STATUS_INSUFFICIENT_RESOURCES
Запрос завершился сбоем из-за нехватки ресурсов.
Важно Запрос может завершиться как встроенным, так и асинхронным с этим кодом состояния.
 
STATUS_BUFFER_TOO_SMALL
Размер буфера, указанный параметром *pLAMSize , слишком мал для хранения LAM. В этом случае значение *pLAMSize обновляется с учетом требуемого размера буфера.
Другие коды состояния
Произошла ошибка.

Комментарии

Часть цепочки MDL от начального виртуального адреса до количества байтов, указанного в параметре Length , должна представлять практически непрерывную область памяти. В противном случае поставщик NDK должен завершить запрос ошибкой. Потребитель NDK отвечает за блокировку цепочки MDL. То есть страницы изменения MDL закрепляются в физической памяти.

Важно Потребитель NDK не должен использовать цепочку MDL, пока NdkBuildLam ожидает завершения.
 
Адаптер обращается к физической памяти с помощью логических адресов. Это похоже на то, что ЦП обращается к физической памяти с помощью виртуальных адресов. Если потребитель NDK будет использовать страницы физической памяти непосредственно в качестве локальных буферов данных в запросах отправки, получения, чтения или записи, он должен получить сопоставление логических адресов адаптера NDK от поставщика NDK и использовать логические адреса, а не физические адреса. Аналогичным образом потребитель NDK также должен использовать логические адреса в запросах с быстрой регистрацией.

Потребитель NDK может вызвать функцию NdkGetPrivilegedMemoryRegionToken (NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN), чтобы получить маркер привилегированного региона памяти от поставщика NDK.

Все страницы адаптера, возвращаемые поставщиком NDK, должны иметь длину PAGE_SIZE байт, где PAGE_SIZE — это размер страницы памяти, поддерживаемый платформой узла, как определено в wdm.h.

Поставщик должен рассматривать значение виртуального адреса, возвращаемое макросом MmGetMdlVirtualAddress для MDL, как индекс в начале сопоставляемой области памяти. Поставщик не должен использовать значение виртуального адреса в качестве допустимого виртуального адреса для чтения или записи содержимого буфера.

Если поставщик имеет ошибку при обработке запроса NdkBuildLam , поставщик должен освободить все частичные сопоставления, созданные им на данный момент, прежде чем завершить запрос с ошибкой.

Требования

Требование Значение
Минимальная версия клиента Не поддерживается, поддерживается в NDIS 6.30 и более поздних версиях.
Минимальная версия сервера Windows Server 2012
Целевая платформа Windows
Header ndkpi.h (включая Ndkpi.h)
IRQL <=DISPATCH_LEVEL

См. также раздел

MmGetMdlVirtualAddress

Требования к времени существования объекта NDKPI

NDK_ADAPTER

NDK_ADAPTER_DISPATCH

NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN

NDK_FN_RELEASE_LAM

NDK_FN_REQUEST_COMPLETION

NDK_LOGICAL_ADDRESS_MAPPING