функция обратного вызова PBUILD_SCATTER_GATHER_LIST_EX (wdm.h)
Подпрограмма buildScatterGatherListEx выделяет ресурсы, необходимые для передачи DMA, создает список точечной и сборной и вызывает подпрограмму, предоставляемую драйвером, AdapterListControl для запуска передачи DMA.
Осторожность
Не вызывайте эту подпрограмму для системного устройства DMA.
Синтаксис
PBUILD_SCATTER_GATHER_LIST_EX PbuildScatterGatherListEx;
NTSTATUS PbuildScatterGatherListEx(
[in] PDMA_ADAPTER DmaAdapter,
[in] PDEVICE_OBJECT DeviceObject,
[in] PVOID DmaTransferContext,
[in] PMDL Mdl,
[in] ULONGLONG Offset,
[in] ULONG Length,
[in] ULONG Flags,
[in, optional] PDRIVER_LIST_CONTROL ExecutionRoutine,
[in, optional] PVOID Context,
[in] BOOLEAN WriteToDevice,
[in] PVOID ScatterGatherBuffer,
[in] ULONG ScatterGatherLength,
[in, optional] PDMA_COMPLETION_ROUTINE DmaCompletionRoutine,
[in, optional] PVOID CompletionContext,
[out, optional] PVOID ScatterGatherList
)
{...}
Параметры
[in] DmaAdapter
Указатель на структуру DMA_ADAPTER. Эта структура — это объект адаптера, представляющий основное устройство DMA драйвера или канал DMA системы. Вызывающий объект получил этот указатель из предыдущего вызова подпрограммы IoGetDmaAdapter.
[in] DeviceObject
Указатель на структуру DEVICE_OBJECT. Эта структура представляет собой объект физического устройства (PDO), представляющий целевое устройство для запрошенной операции DMA.
[in] DmaTransferContext
Указатель на инициализированный контекст передачи DMA. Этот контекст был инициализирован предыдущим вызовом процедуры InitializeDmaTransferContext. Этот контекст должен быть уникальным для всех запросов на выделение адаптера. Чтобы отменить ожидающий запрос на выделение, вызывающий объект должен указать контекст передачи DMA для запроса в подпрограмму CancelAdapterChannel.
[in] Mdl
Указатель на цепочку MDL, описывающую физический макет страницы для коллекции заблокированных буферов в виртуальной памяти. Список точечной и сборной для передачи DMA будет использовать область этой памяти, указанную параметрами смещения
[in] Offset
Начальная смещение для передачи DMA точечной и сборной данных. Этот параметр является смещением байтов с начала буфера в первом MDL в цепочке MDL. Если многомерные выражения в цепочке MDL указывают общее количество байтов буферного пространства, допустимые значения Offset находятся в диапазоне от 0 до N–1.
[in] Length
Размер передачи DMA в байтах. Если цепочка MDL указывает общее количество байтов буферного пространства, допустимые значения длина находятся в диапазоне от 1 до N–смещения.
[in] Flags
Флаги выделения канала адаптера. Поддерживается следующий флаг:
Флаг | Значение |
---|---|
DMA_SYNCHRONOUS_CALLBACK | Подпрограмма BuildScatterGatherListEx называется синхронно. Если этот флаг задан, и необходимые ресурсы DMA не сразу доступны, вызов завершается сбоем и возвращает STATUS_INSUFFICIENT_RESOURCES. |
Если установлен флаг DMA_SYNCHRONOUS_CALLBACK, параметр ExecutionRoutine необязателен и может быть NULL. Если этот флаг не задан, ExecutionRoutine должен быть допустимым, неуказателем NULL. Дополнительные сведения об этом флаге см. в разделе "Примечания".
[in, optional] ExecutionRoutine
Указатель на подпрограмму, предоставляемую драйвером, AdapterListControl, которая инициирует передачу DMA для драйвера. Диспетчер ввода-вывода вызывает подпрограмму AdapterListControl после выделения необходимых ресурсов для объекта адаптера. После возврата подпрограммы AdapterListControl диспетчер ввода-вывода автоматически освобождает объект адаптера и ресурсы, выделенные для этого объекта.
Если установлен флаг DMA_SYNCHRONOUS_CALLBACK, ExecutionRoutine является необязательным и может быть null. Если ExecutionRoutineNULL, вызывающий объект может использовать ресурсы, выделенные BuildScatterGatherListEx. Дополнительные сведения см. в разделе "Примечания".
[in, optional] Context
Определяемый драйвером контекст управления адаптером. Этот контекст передается в подпрограмму adapterListControl
[in] WriteToDevice
Направление передачи DMA. Задайте для этого параметра значение TRUE для операции записи, которая передает данные из памяти на устройство. Задайте для этого параметра значение FALSE для операции чтения, которая передает данные с устройства в память.
[in] ScatterGatherBuffer
Указатель на выделенный вызывающим буфером, в который подпрограмма записывает список точечной или сборной для передачи DMA. Этот список начинается с SCATTER_GATHER_LIST структуры, за которой следует массив SCATTER_GATHER_ELEMENT.
[in] ScatterGatherLength
Размер буфера в байтах, переданный в параметре ScatterGatherBuffer. Размер выделенного буфера должен быть достаточно большим, чтобы содержать список точечной и сборной, а также внутренние данные, которые операционная система хранит в этом буфере. Чтобы вычислить требуемый размер буфера, вызовите подпрограмму getDmaTransferInfo или CalculateScatterGatherList.
[in, optional] DmaCompletionRoutine
Не используется. Установите значение NULL.
[in, optional] CompletionContext
Не используется. Установите значение NULL.
[out, optional] ScatterGatherList
Указатель на переменную, в которую подпрограмма записывает указатель на список точечной или сборной для передачи DMA. Этот список начинается со структуры SCATTER_GATHER_LIST, содержащей указатель на массив SCATTER_GATHER_ELEMENT. Этот указатель выходных данных всегда соответствует значению параметра ScatterGatherBuffer.
Если установлен флаг
Возвращаемое значение
BuildScatterGatherListEx возвращает STATUS_SUCCESS, если вызов выполнен успешно. Возможные значения возвращаемых ошибок включают следующие коды состояния.
Возвращаемый код | Описание |
---|---|
STATUS_INVALID_PARAMETERS | Подпрограмма завершилась ошибкой из-за недопустимых значений параметров, передаваемых вызывающим абонентом. |
STATUS_BUFFER_TOO_SMALL | Буфер, предоставленный вызывающим объектом, в ScatterGatherBuffer слишком мал, чтобы содержать список точечной и сборной. |
STATUS_INSUFFICIENT_RESOURCES | Подпрограмма не удалось выделить ресурсы, необходимые для передачи DMA. |
Замечания
BuildScatterGatherListEx* не является системной подпрограммой, которая может вызываться непосредственно по имени. Эта подпрограмма может вызываться только указателем из адреса, возвращаемого в структуреDMA_OPERATIONS* . Драйверы получают адрес этой процедуры путем вызова IoGetDmaAdapter с версией членом параметра DeviceDescription значение DEVICE_DESCRIPTION_VERSION3. Если IoGetDmaAdapter возвращает NULL, подпрограмма недоступна на вашей платформе.
Используйте BuildScatterGatherListEx только для адаптеров главного шины. Не используйте эту подпрограмму для адаптера DMA системы.
BuildScatterGatherListEx аналоги чен подпрограмме GetScatterGatherListEx, за исключением того, что вызывающий объект должен выделить буфер для списка точечной или сборной.
Например, драйвер может предварительно выделить один или несколько буферов точечной или сборной во время инициализации устройства. Позже вызов BuildScatterGatherListEx, использующий такой буфер, может завершиться сбоем в условиях доступности низкой памяти, что может привести к сбою вызова GetScatterGatherListEx.
По умолчанию BuildScatterGatherListEx возвращается асинхронно, не ожидая завершения запрошенного выделения ресурсов. После этого вызывающий объект может отменить ожидающий запрос на выделение, вызвав подпрограмму CancelAdapterChannel.
Если вызывающий драйвер задает флаг DMA_SYNCHRONOUS_CALLBACK, подпрограмма buildScatterGatherListEx выполняется следующим образом:
Если запрошенные ресурсы не сразу доступны, BuildScatterGatherListEx не ожидает ресурсов, не создает список точечной и сборной и не вызывает подпрограмму AdapterListControl. Вместо этого BuildScatterGatherListEx завершается ошибкой и возвращает STATUS_INSUFFICIENT_RESOURCES.
Драйверу не требуется предоставлять подпрограмму AdapterListControl, если установлен флаг DMA_SYNCHRONOUS_CALLBACK.
Если драйвер предоставляет подпрограмму AdapterListControl, флаг DMA_SYNCHRONOUS_CALLBACK указывает, что эта подпрограмма должна вызываться в контексте вызывающего потока, прежде чем возвращать BuildScatterGatherListEx.
Если драйвер не предоставляет подпрограмму AdapterListControl, драйвер может использовать выделенные ресурсы и список точечной и сборной после возврата BuildScatterGatherListEx. В этом случае драйвер должен указать допустимый указатель, отличный отNULLScatterGatherList указателя. Кроме того, после завершения передачи DMA, инициированной драйвером, драйвер должен вызвать подпрограмму FreeAdapterObject, чтобы освободить ресурсы, которые BuildScatterGatherListEx, выделенные для объекта адаптера.
BuildScatterGatherListEx — расширенная версия подпрограммы BuildScatterGatherList. В следующем списке перечислены функции, доступные только в расширенной версии:
Особенность | Описание |
---|---|
Начальная смещение | Вызывающий драйвер может указать начальное смещение для передачи точечной или сборной DMA вместо запуска передачи с первого адреса буфера в начале цепочки MDL. |
Отмена запроса на выделение | Драйвер может вызвать CancelAdapterChannel отменить ожидающий запрос на выделение, когда адаптер DMA помещается в очередь, чтобы дождаться ресурсов DMA. |
Синхронный обратный вызов | Драйвер может задать флаг DMA_SYNCHRONOUS_CALLBACK, чтобы запросить вызов подпрограммы, предоставленной драйвером AdapterListControl в вызывающем потоке, прежде чем возвращать BuildScatterGatherListEx. |
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно начиная с Windows 8. |
целевая платформа | Настольный |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | DISPATCH_LEVEL |