Ler em inglês

Compartilhar via


Função RxCeSend (rxce.h)

RxCeSend envia uma TSDU (unidade de dados do serviço de transporte) ao longo da conexão especificada em um circuito virtual.

Sintaxe

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

Um ponteiro para o circuito virtual ao longo do qual o TSDU deve ser enviado.

[in] SendOptions

As opções desejadas para transmitir os dados nessa operação de envio pelo transporte. Observe que essa é apenas uma solicitação enviada para o transporte. O transporte só pode dar suporte a um número limitado das opções especificadas e ignorar opções sem suporte. O parâmetro SendOptions consiste em um conjunto de bits definido em rxce.h. O parâmetro SendOptions pode ser uma combinação dos seguintes bits:

RXCE_SEND_EXPEDITED

Os dados determinados devem ser enviados antes de qualquer solicitação de envio normal que o transporte esteja mantendo na fila para transmissão nessa conexão ponto a ponto de extremidade. Se o transporte não der suporte a transferências aceleradas, ele poderá ignorar esse sinalizador. Observe que RXCE_SEND_EXPEDITED é equivalente ao sinalizador de TDI_SEND_EXPEDITED TDI.

RXCE_SEND_NO_RESPONSE_EXPECTED

O chamador está dando uma dica ao transporte subjacente de que não espera uma resposta a esse envio de seu par de nós remotos. Esse sinalizador deve desabilitar o piggybacking da confirmação de TSDU pelo transporte de nó remoto. Observe que RXCE_SEND_NO_RESPONSE_EXPECTED é equivalente ao sinalizador TDI_SEND_NO_RESPONSE_EXPECTED.

RXCE_SEND_NON_BLOCKING

Se o transporte subjacente atualmente não tiver espaço de buffer interno disponível para os dados fornecidos, ele deverá apenas concluir o IRP com STATUS_DEVICE_NOT_READY. Se o transporte tiver algum espaço em buffer disponível, ele deverá copiar o máximo de dados possível do buffer fornecido pelo cliente, definir o membro IoStatus.Information com o número de bytes copiados e concluir o IRP com STATUS_SUCCESS.

Esse sinalizador é irrelevante para transportes que não armazenam em buffer enviados internamente. Observe que RXCE_SEND_NON_BLOCKING é equivalente ao sinalizador TDI_SEND_NON_BLOCKING.

RXCE_SEND_PARTIAL

Significa se um RX_MEM_DESC (MDL) deve ser enviado em sua totalidade ou se apenas partes dele precisam ser enviadas. Essa opção solicita que o transporte permita que a operação de envio transmita parte dos dados se o transporte e o MDL permitirem esse comportamento.

RXCE_SEND_SYNCHRONOUS

Significa se a operação de envio deve transmitir os dados de forma síncrona. Quando essa opção é definida, a solicitação é enviada para o transporte subjacente e o controle não retorna ao chamador até que a solicitação seja concluída. Observe que o parâmetro pCompletionContext é ignorado quando esse bit é definido.

[in] pMdl

Um ponteiro para o buffer a ser enviado.

[in] SendLength

O comprimento dos dados a serem enviados.

[in] pCompletionContext

O contexto passado de volta para o chamador durante SendCompletion para operações assíncronas. Não que esse parâmetro seja ignorado se o parâmetro SendOptions solicitar uma operação de envio síncrona.

Retornar valor

RxCeSend retorna STATUS_SUCCESS com êxito ou um dos seguintes códigos de erro em caso de falha:

Código de retorno Descrição
STATUS_CONNECTION_DISCONNECTED
Um circuito virtual ou conexão inválido ou desconectado foi especificado
STATUS_INSUFFICIENT_RESOURCES
Falha na alocação de memória de pool nãopagado necessária para essa rotina.
STATUS_INVALID_PARAMETER
Um comprimento inválido foi passado no parâmetro SendLength com base no SendOptions especificado.

Comentários

A rotina RxCeSend alocará o IRP, criará a solicitação de envio para o driver de transporte subjacente e enviará a solicitação à TDI. No caso de operações de envio síncronas, essa rotina também será o IRP gratuito e os recursos alocados quando a rotina for concluída.

As opções assíncronas e síncronas indicadas no parâmetro SendOptions usado em RxCeSend distinguem entre duas situações. No caso assíncrono, o controle retorna ao chamador depois que a solicitação é enviada com êxito ao transporte subjacente. Os resultados de qualquer solicitação específica são comunicados novamente usando a rotina de retorno de chamada SendCompletion . O parâmetro pCompletionContext em RxCeSend é passado de volta na rotina de retorno de chamada para ajudar o chamador a desambiguar as solicitações.

No caso síncrono, a solicitação é enviada para o transporte subjacente e o controle não retorna ao chamador até que a solicitação seja concluída. Observe que, no caso síncrono, o parâmetro pCompletionContext é ignorado e o status retornado corresponde ao status de conclusão das operações.

O benefício das opções assíncronas e síncronas depende do transporte subjacente. Em um ambiente de circuito virtual (TCP, por exemplo), uma opção síncrona implica que o controle não retorna até que os dados cheguem ao servidor. Por outro lado, para transportes orientados a datagrama (UDP, por exemplo), há muito pouca diferença entre as duas opções.

Requisitos

Requisito Valor
Plataforma de Destino Área de Trabalho
Cabeçalho rxce.h (include Rxce.h, Tdi.h)
IRQL <= APC_LEVEL

Confira também

MDL

RxCeSendDatagram