Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: WSARecv Hook: Paket blockieren

  Alt 1. Sep 2009, 11:27
Das wirst du so nicht in den Griff bekommen. Wie gesagt arbeiten die Sockets in deiner Anwendung overlapped. In deiner Callback musst du zuerst die ungehookte Originalfunktion WSARecv aufrufen, damit überhaupt Daten in den Buffer eingelesen werden, die du auf "böse" prüfen kannst.

Das eigentliche Problem ist hier, dass der WSARecv Aufruf bereits eine Callback Routine aufruft, in der die Daten dem Programm zur Verfügung gestellt und weiterverarbeitet werden.

Ein Lösungsansatz, den wir ja schon, wenn auch nicht ganz zufriedenstellend, probiert haben, wäre es die Callback Funktion temporär umzubiegen. Dann könntest du die Daten im Paket ohne Weiteres modifizieren oder das Paket komplett blocken. Je nachdem musst du die Callback Funktion dann am Ende der Hook Callback von Hand neu aufrufen.

Zitat:
lpNumberOfBytesRecvd [out]
A pointer to the number, in bytes, of data received by this call if the receive operation completes immediately. If the lpOverlapped parameter is non-NULL, this parameter is optional and can be set to NULL.

lpFlags [in, out]
A pointer to flags used to modify the behavior of the WSARecv function call. For more information, see the Remarks section.

lpOverlapped [in]
A pointer to a WSAOVERLAPPED structure (ignored for nonoverlapped sockets).

lpCompletionRoutine [in]
A pointer to the completion routine called when the receive operation has been completed (ignored for nonoverlapped sockets).
Fangen wir an: lpNumberOfBytesRecvd war bei dir immer 0, da overlapped Sockets verwendet werden. lpCompletionRoutine ist (leider) ebenfalls nil. Laut MSDN bedeutet dies:

Zitat:
hEvent
If an overlapped I/O operation is issued without an I/O completion routine (the operation's lpCompletionRoutine parameter is set to null), then this parameter should either contain a valid handle to a WSAEVENT object or be null. If the lpCompletionRoutine parameter of the call is non-null then applications are free to use this parameter as necessary.
(Auszug aus der WSAOVERLAPPED STRUCT Beschreibung)

Meine Vermutung war es, dass ein Thread darauf wartet, dass das Event aktiviert wird und dann eine Art Datenverarbeitungsroutine aufruft. Deshalb setzten wir hEvent auf ein von uns erstelltes, irrelevantes Eventhandle befor die Original WSARecv Funktion aufgerufen wird.
Am Ende der Hook Callback Funktion wurde SetEvent() auf das Original Eventhandle angewendet. Es war mehr eine Vermutung, dass es so funktionieren könnte, die gehookte Anwendung allerdings beendete sich unmittelbar mit einem "Critical Error".
  Mit Zitat antworten Zitat