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
调用方向基础传输提供一个提示,指示它不希望从其远程节点对等节点对此发送做出响应。 此标志应禁用远程节点传输对 TSDU 确认的托管。 请注意,RXCE_SEND_NO_RESPONSE_EXPECTED等效于 TDI_SEND_NO_RESPONSE_EXPECTED 标志。
RXCE_SEND_NON_BLOCKING
如果基础传输当前没有可用于给定数据的内部缓冲区空间,则它应仅使用STATUS_DEVICE_NOT_READY完成 IRP。 如果传输具有一些可用缓冲区空间,则它应尽可能多地从客户端提供的缓冲区复制数据,将 IoStatus.Information 成员设置为它复制的字节数,并使用STATUS_SUCCESS完成 IRP。
此标志与不在内部发送缓冲区的传输无关。 请注意,RXCE_SEND_NON_BLOCKING等效于 TDI_SEND_NON_BLOCKING 标志。
RXCE_SEND_PARTIAL
表示是否要完整发送RX_MEM_DESC (MDL) ,或者仅发送部分 MDL。 此选项请求传输允许发送操作传输部分数据(如果传输和 MDL 允许此行为)。
RXCE_SEND_SYNCHRONOUS
表示发送操作是否要同步传输数据。 设置此选项后,请求将提交到基础传输,在请求完成之前,控件不会返回到调用方。 请注意,设置此位时,将忽略 pCompletionContext 参数。
[in] pMdl
指向要发送的缓冲区的指针。
[in] SendLength
要发送的数据的长度。
[in] pCompletionContext
在 SendCompletion 期间传递回调用方进行异步操作的上下文。 不是说,如果 SendOptions 参数请求同步发送操作,则忽略此参数。
返回值
RxCeSend 在成功时返回STATUS_SUCCESS或失败时返回以下错误代码之一:
返回代码 | 说明 |
---|---|
|
指定了无效或断开连接的虚拟线路或连接 |
|
此例程所需的非分页池内存分配失败。 |
|
基于指定的 SendOptions 在 SendLength 参数中传递了无效的长度。 |
注解
RxCeSend 例程将分配 IRP,生成基础传输驱动程序的发送请求,并将请求提交到 TDI。 对于同步发送操作,此例程还将在例程完成时分配的可用 IRP 和资源。
RxCeSend 中使用的 SendOptions 参数中指示的异步和同步选项区分两种情况。 在异步情况下,将请求成功提交到基础传输后,控制将返回到调用方。 任何给定请求的结果都使用 SendCompletion 回调例程传回。 RxCeSend 中的 pCompletionContext 参数在回调例程中传递回,以帮助调用方消除请求的歧义。
在同步情况下,请求提交到基础传输,并且控件不会返回到调用方,直到请求完成。 请注意,在同步情况下,将忽略 pCompletionContext 参数,并且返回的状态对应于操作的完成状态。
异步和同步选项的优点取决于基础传输。 在 (TCP 的虚拟线路环境中(例如,) ),同步选项意味着控件在数据到达服务器之前不会返回。 另一方面,对于面向数据报的传输 (UDP,例如) ,这两个选项之间差别很小。
要求
要求 | 值 |
---|---|
目标平台 | 桌面 |
标头 | rxce.h (包括 Rxce.h、Tdi.h) |
IRQL | <= APC_LEVEL |