RxCeSend-Funktion (rxce.h)
RxCeSend sendet eine Transportdienstdateneinheit (TSDU) entlang der angegebenen Verbindung in einer virtuellen Verbindung.
Syntax
NTSTATUS RxCeSend(
[in] IN PRXCE_VC pVc,
[in] IN ULONG SendOptions,
[in] IN PMDL pMdl,
[in] IN ULONG SendLength,
[in] IN PVOID pCompletionContext
);
Parameter
[in] pVc
Ein Zeiger auf die virtuelle Verbindung, über die die TSDU gesendet werden soll.
[in] SendOptions
Die gewünschten Optionen für die Übertragung der Daten bei diesem Sendevorgang durch den Transport. Beachten Sie, dass dies nur eine Anforderung ist, die an den Transport gesendet wird. Der Transport unterstützt möglicherweise nur eine begrenzte Anzahl der angegebenen Optionen und ignoriert optionen, die nicht unterstützt werden. Der SendOptions-Parameter besteht aus einer Reihe von Bits, die in rxce.h definiert sind. Der SendOptions-Parameter kann eine Kombination der folgenden Bits sein:
RXCE_SEND_EXPEDITED
Die angegebenen Daten sollten vor allen normalen Sendeanforderungen gesendet werden, die der Transport derzeit für die Übertragung auf dieser Endpunkt-zu-Endpunkt-Verbindung in der Warteschlange hält. Wenn der Transport keine beschleunigten Übertragungen unterstützt, kann er dieses Flag ignorieren. Beachten Sie, dass RXCE_SEND_EXPEDITED dem TDI-TDI_SEND_EXPEDITED-Flag entspricht.
RXCE_SEND_NO_RESPONSE_EXPECTED
Der Aufrufer gibt dem zugrunde liegenden Transport einen Hinweis, dass er keine Antwort auf diesen Senden von seinem Remoteknoten-Peer erwartet. Dieses Flag sollte das Piggybacking der TSDU-Bestätigung durch den Remoteknotentransport deaktivieren. Beachten Sie, dass RXCE_SEND_NO_RESPONSE_EXPECTED dem flag TDI_SEND_NO_RESPONSE_EXPECTED entspricht.
RXCE_SEND_NON_BLOCKING
Wenn der zugrunde liegende Transport derzeit keinen internen Pufferspeicherplatz für die angegebenen Daten zur Verfügung hat, sollte er einfach den IRP mit STATUS_DEVICE_NOT_READY abschließen. Wenn der Transport über einen verfügbaren Pufferspeicher verfügt, sollte er so viele Daten wie möglich aus dem vom Client bereitgestellten Puffer kopieren, den IoStatus.Information-Member auf die Anzahl der kopierten Bytes festlegen und die IRP mit STATUS_SUCCESS abschließen.
Dieses Flag ist für Transporte irrelevant, die keine internen Puffer senden. Beachten Sie, dass RXCE_SEND_NON_BLOCKING dem flag TDI_SEND_NON_BLOCKING entspricht.
RXCE_SEND_PARTIAL
Bedeutet, ob ein RX_MEM_DESC (MDL) vollständig gesendet werden soll oder wenn nur Teile davon gesendet werden müssen. Diese Option fordert an, dass der Transport dem Sendevorgang erlaubt, einen Teil der Daten zu übertragen, wenn der Transport und die MDL dieses Verhalten zulassen.
RXCE_SEND_SYNCHRONOUS
Bedeutet, wenn der Sendevorgang die Daten synchron übertragen soll. Wenn diese Option festgelegt ist, wird die Anforderung an den zugrunde liegenden Transport übermittelt, und das Steuerelement kehrt erst an den Aufrufer zurück, wenn die Anforderung abgeschlossen ist. Beachten Sie, dass der pCompletionContext-Parameter ignoriert wird, wenn dieses Bit festgelegt wird.
[in] pMdl
Ein Zeiger auf den zu sendenden Puffer.
[in] SendLength
Die Länge der zu sendenden Daten.
[in] pCompletionContext
Der Kontext, der während SendCompletion für asynchrone Vorgänge an den Aufrufer zurückgegeben wird. Nicht, dass dieser Parameter ignoriert wird, wenn der SendOptions-Parameter einen synchronen Sendevorgang anfordert.
Rückgabewert
RxCeSend gibt STATUS_SUCCESS bei Erfolg oder einen der folgenden Fehlercodes bei Einem Fehler zurück:
Rückgabecode | Beschreibung |
---|---|
|
Eine ungültige oder nicht verbundene virtuelle Verbindung oder Verbindung wurde angegeben. |
|
Bei der Zuordnung des nicht auslagerten Poolspeichers, der für diese Routine benötigt wird, ist ein Fehler aufgetreten. |
|
Im SendLength-Parameter wurde basierend auf den angegebenen SendOptions eine ungültige Länge übergeben. |
Hinweise
Die RxCeSend-Routine weist die IRP zu, erstellt die Sendeanforderung für den zugrunde liegenden Transporttreiber und sendet die Anforderung an TDI. Bei synchronen Sendevorgängen werden bei dieser Routine auch die freien IRP und ressourcen zugeordnet, wenn die Routine abgeschlossen ist.
Die asynchronen und synchronen Optionen, die im SendOptions-Parameter angegeben sind, der in RxCeSend verwendet wird, unterscheiden zwischen zwei Situationen. Im asynchronen Fall kehrt das Steuerelement an den Aufrufer zurück, nachdem die Anforderung erfolgreich an den zugrunde liegenden Transport übermittelt wurde. Die Ergebnisse für eine bestimmte Anforderung werden mithilfe der Rückrufroutine SendCompletion zurückversendet. Der pCompletionContext-Parameter in RxCeSend wird in der Rückrufroutine zurückgegeben, um den Aufrufer bei der Disambiguierung der Anforderungen zu unterstützen.
Im synchronen Fall wird die Anforderung an den zugrunde liegenden Transport übermittelt, und das Steuerelement wird erst an den Aufrufer zurückgegeben, wenn die Anforderung abgeschlossen ist. Beachten Sie, dass im synchronen Fall der pCompletionContext-Parameter ignoriert wird und die zurückgegebene status dem Abschluss status der Vorgänge entspricht.
Der Nutzen asynchroner und synchroner Optionen hängt vom zugrunde liegenden Transport ab. In einer virtuellen Leitungsumgebung (z. B. TCP) bedeutet eine synchrone Option, dass das Steuerelement erst zurückgegeben wird, wenn die Daten den Server erreichen. Andererseits gibt es bei datagramorientierten Transporten (z. B. UDP) nur sehr wenige Unterschiede zwischen den beiden Optionen.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Desktop |
Kopfzeile | rxce.h (include Rxce.h, Tdi.h) |
IRQL | <= APC_LEVEL |