Функция RxCeSend (rxce.h)
RxCeSend отправляет единицу данных службы транспорта (TSDU) по указанному подключению на виртуальном канале.
Синтаксис
NTSTATUS RxCeSend(
[in] IN PRXCE_VC pVc,
[in] IN ULONG SendOptions,
[in] IN PMDL pMdl,
[in] IN ULONG SendLength,
[in] IN PVOID pCompletionContext
);
Параметры
[in] pVc
Указатель на виртуальный канал, по которому должен отправляться TSDU.
[in] SendOptions
Требуемые параметры передачи данных об этой операции отправки транспортом. Обратите внимание, что это только запрос, отправленный транспорту. Транспорт может поддерживать только ограниченное количество указанных параметров и игнорировать параметры, которые не поддерживаются. Параметр SendOptions состоит из набора битов, определенных в rxce.h. Параметр SendOptions может быть сочетанием следующих битов:
RXCE_SEND_EXPEDITED
Указанные данные следует отправлять перед любыми обычными запросами отправки, которые транспорт в настоящее время содержит очередь для передачи в этом подключении конечной точки к конечной точке. Если транспорт не поддерживает ускоренную передачу, он может игнорировать этот флаг. Обратите внимание, что RXCE_SEND_EXPEDITED эквивалентен флагу TDI TDI_SEND_EXPEDITED.
RXCE_SEND_NO_RESPONSE_EXPECTED
Вызывающий объект дает указание базовому транспорту, который он не ожидает ответа на эту отправку от его однорангового узла удаленного узла. Этот флаг должен отключить piggybacking подтверждения TSDU транспортом удаленного узла. Обратите внимание, что RXCE_SEND_NO_RESPONSE_EXPECTED эквивалентен флагу TDI_SEND_NO_RESPONSE_EXPECTED.
RXCE_SEND_NON_BLOCKING
Если базовый транспорт в настоящее время не имеет внутреннего буферного пространства для заданных данных, он должен просто завершить IRP с STATUS_DEVICE_NOT_READY. Если транспорт имеет доступное буферное пространство, он должен копировать столько данных, сколько он может из буфера, предоставленного клиентом, задайте элементу IoStatus.Information число скопированных байтов и завершить IRP с помощью STATUS_SUCCESS.
Этот флаг не имеет значения для транспорта, который не отправляется внутри буфера. Обратите внимание, что RXCE_SEND_NON_BLOCKING эквивалентен флагу TDI_SEND_NON_BLOCKING.
RXCE_SEND_PARTIAL
Указывает, следует ли отправлять RX_MEM_DESC(MDL) в полном объеме или если нужно отправить только части. Этот параметр запрашивает, что транспорт позволяет операции отправки передавать часть данных, если транспорт и MDL позволяют этому поведению.
RXCE_SEND_SYNCHRONOUS
Указывает, будет ли операция отправки передавать данные синхронно. Если этот параметр задан, запрос отправляется в базовый транспорт и элемент управления не возвращается вызывающему объекту до тех пор, пока запрос не завершится. Обратите внимание, что параметр pCompletionContext игнорируется при установке этого бита.
[in] pMdl
Указатель на отправленный буфер.
[in] SendLength
Длина отправленных данных.
[in] pCompletionContext
Контекст, переданный вызывающей стороне во время SendCompletion для асинхронных операций. Не то, что этот параметр игнорируется, если параметр SendOptions запрашивает синхронную операцию отправки.
Возвращаемое значение
RxCeSend возвращает STATUS_SUCCESS при успешном выполнении или одном из следующих кодов ошибок при сбое:
Возвращаемый код | Описание |
---|---|
|
Указан недопустимый или отключенный виртуальный канал или подключение |
|
Сбой выделения памяти непагрегированного пула, необходимой для этой подпрограммы. |
|
Недопустимая длина была передана в параметре SendLength на основе указанного SendOptions. |
Замечания
Подпрограмма RxCeSend выделяет IRP, создает запрос на отправку базового транспортного драйвера и отправляет запрос в TDI. В случае синхронных операций отправки эта подпрограмма также будет свободно выделять IRP и ресурсы, выделенные при завершении подпрограммы.
Асинхронные и синхронные параметры, указанные в параметре SendOptions, используемом в RxCeSend различать две ситуации. В асинхронном случае элемент управления возвращается вызывающему объекту после успешного отправки запроса в базовый транспорт. Результаты любого заданного запроса передаются обратно с помощью подпрограммы обратного вызова SendCompletion. Параметр pCompletionContext в RxCeSend передается обратно в подпрограмму обратного вызова, чтобы помочь вызывающей стороне в диамбигации запросов.
В синхронном случае запрос отправляется в базовый транспорт, и элемент управления не возвращается вызывающей объекту до завершения запроса. Обратите внимание, что в синхронном случае параметр pCompletionContext игнорируется, а состояние, возвращаемое в соответствии с состоянием завершения операций.
Преимущество асинхронных и синхронных параметров зависит от базового транспорта. Например, в среде виртуального канала (TCP) синхронный параметр подразумевает, что элемент управления не возвращается до тех пор, пока данные не достигают сервера. С другой стороны, для транспорта, ориентированного на диаграмму данных (UDP, например), существует очень мало различий между двумя вариантами.
Требования
Требование | Ценность |
---|---|
целевая платформа | Настольный |
заголовка | rxce.h (include Rxce.h, Tdi.h) |
IRQL | <= APC_LEVEL |