Función RxCeSend (rxce.h)
RxCeSend envía una unidad de datos de servicio de transporte (TSDU) a lo largo de la conexión especificada en un circuito virtual.
Sintaxis
NTSTATUS RxCeSend(
[in] IN PRXCE_VC pVc,
[in] IN ULONG SendOptions,
[in] IN PMDL pMdl,
[in] IN ULONG SendLength,
[in] IN PVOID pCompletionContext
);
Parámetros
[in] pVc
Puntero al circuito virtual a lo largo del cual se va a enviar el TSDU.
[in] SendOptions
Las opciones deseadas para transmitir los datos en esta operación de envío mediante el transporte. Tenga en cuenta que solo se trata de una solicitud enviada al transporte. El transporte solo puede admitir un número limitado de las opciones especificadas y omitir las opciones no admitidas. El parámetro SendOptions consta de un conjunto de bits definidos en rxce.h. El parámetro SendOptions puede ser una combinación de los bits siguientes:
RXCE_SEND_EXPEDITED
Los datos especificados se deben enviar antes de cualquier solicitud de envío normal que el transporte esté en cola para la transmisión en esta conexión de punto de conexión a punto de conexión. Si el transporte no admite transferencias aceleradas, puede omitir esta marca. Tenga en cuenta que RXCE_SEND_EXPEDITED equivale a la marca de TDI_SEND_EXPEDITED TDI.
RXCE_SEND_NO_RESPONSE_EXPECTED
El autor de la llamada proporciona una sugerencia al transporte subyacente que no espera una respuesta a este envío desde su nodo remoto del mismo nivel. Esta marca debe deshabilitar el piggybacking de la confirmación de TSDU mediante el transporte de nodo remoto. Tenga en cuenta que RXCE_SEND_NO_RESPONSE_EXPECTED es equivalente a la marca TDI_SEND_NO_RESPONSE_EXPECTED.
RXCE_SEND_NON_BLOCKING
Si el transporte subyacente actualmente no tiene ningún espacio de búfer interno disponible para los datos especificados, solo debe completar el IRP con STATUS_DEVICE_NOT_READY. Si el transporte tiene algún espacio de búfer disponible, debe copiar tantos datos como pueda desde el búfer proporcionado por el cliente, establezca el miembro IoStatus.Information en el número de bytes que copió y complete el IRP con STATUS_SUCCESS.
Esta marca es irrelevante para los transportes que no envían el búfer internamente. Tenga en cuenta que RXCE_SEND_NON_BLOCKING es equivalente a la marca TDI_SEND_NON_BLOCKING.
RXCE_SEND_PARTIAL
Indica si se va a enviar una RX_MEM_DESC(MDL) en su totalidad, o si solo es necesario enviar partes de ella. Esta opción solicita que el transporte permita que la operación de envío transmita parte de los datos si el transporte y MDL permiten este comportamiento.
RXCE_SEND_SYNCHRONOUS
Indica si la operación de envío es transmitir los datos de forma sincrónica. Cuando se establece esta opción, la solicitud se envía al transporte subyacente y el control no vuelve al autor de la llamada hasta que se completa la solicitud. Tenga en cuenta que el parámetro pCompletionContext se omite cuando se establece este bit.
[in] pMdl
Puntero al búfer que se va a enviar.
[in] SendLength
Longitud de los datos que se van a enviar.
[in] pCompletionContext
Contexto pasado al autor de la llamada durante SendCompletion para operaciones asincrónicas. No es que este parámetro se omita si el parámetro SendOptions solicita una operación de envío sincrónica.
Valor devuelto
RxCeSend devuelve STATUS_SUCCESS si se ha realizado correctamente o uno de los siguientes códigos de error en caso de error:
Código devuelto | Descripción |
---|---|
|
Se especificó un circuito virtual o una conexión no válidos o desconectados. |
|
Error en la asignación de memoria de grupo no paginada necesaria para esta rutina. |
|
Se pasó una longitud no válida en el parámetro SendLength según el parámetro SendOptions especificado. |
Comentarios
La rutina RxCeSend asignará el IRP, compilará la solicitud de envío para el controlador de transporte subyacente y enviará la solicitud a TDI. En el caso de operaciones de envío sincrónicas, esta rutina también será el IRP gratuito y los recursos asignados cuando se complete la rutina.
Las opciones asincrónicas y sincrónicas indicadas en el parámetro SendOptions usado en RxCeSend distinguen entre dos situaciones. En el caso asincrónico, el control vuelve al autor de la llamada una vez que la solicitud se ha enviado correctamente al transporte subyacente. Los resultados de cualquier solicitud determinada se comunican con la rutina de devolución de llamada SendCompletion . El parámetro pCompletionContext de RxCeSend se pasa de nuevo en la rutina de devolución de llamada para ayudar al autor de la llamada a eliminar la ambigüedad de las solicitudes.
En el caso sincrónico, la solicitud se envía al transporte subyacente y el control no vuelve al autor de la llamada hasta que se completa la solicitud. Tenga en cuenta que, en el caso sincrónico, se omite el parámetro pCompletionContext y el estado devuelto corresponde al estado de finalización de las operaciones.
La ventaja de las opciones asincrónicas y sincrónicas depende del transporte subyacente. En un entorno de circuito virtual (TCP, por ejemplo), una opción sincrónica implica que el control no devuelve hasta que los datos llegan al servidor. Por otro lado, para los transportes orientados al datagrama (UDP, por ejemplo), hay muy poca diferencia entre las dos opciones.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Escritorio |
Encabezado | rxce.h (include Rxce.h, Tdi.h) |
IRQL | <= APC_LEVEL |