WSARecvFrom hook: lpOverlapped nicht unique?!
-
Hi!
Ich versuche gerade, empfangene UDP Pakete eines Programms abzufangen, dessen Quellcode ich nicht habe. Es benutzt einen DirectPlay Server (dpnet.dll). Zu Beginn werden viele overlapped WSARecvFrom geposted, dann warten mehrere Workerthreads jeweils mit WaitForSingleObject und fragen dann mit WSAGetOverlappedResult den IO Status ab.
Um an die Daten zu kommen, wollte ich also bei jedem WSARecvFrom das lpOverlapped/lpBuffers Paar in einer Map speichern, dann bei erfolgreichen WSAGetOverlappedResult per lpOverlapped an den entsprechenden, nun gefüllten lpBuffers kommen.
Doch da gibt es ein Problem: Scheinbar ruft dpnet.dll mehrere WSARecvFrom mit der gleichen lpOverlapped-Adresse auf, und sogar dem gleichen hEvent.
Sieht dann etwa so aus:Socket / lpOverlapped / lpOverlapped->hEvent 940 / 0B56C0A0 / 000002F4 // gleiches hEvent 940 / 0B56C040 / 000002F4 // gleiches hEvent 940 / 0B56C160 / 000002F4 // ... 940 / 0B56C100 / 000002FC 940 / 0B56C220 / 000002FC 940 / 0B56C1C0 / 000002FC 940 / 0B56C280 / 00000304 940 / 0B56C2E0 / 00000304 940 / 0B56C340 / 00000304 940 / 0B56C3A0 / 0000030C 940 / 0B56C400 / 0000030C 940 / 0B56C460 / 0000030C 948 / 0B56C520 / 000002F4 948 / 0B56C580 / 000002F4 948 / 0B56C5E0 / 000002F4 948 / 0B56BFE0 / 000002FC 948 / 0B56C640 / 000002FC 948 / 0B56C6A0 / 000002FC 948 / 0B56C700 / 00000304 948 / 0B56C760 / 00000304 948 / 0B56C7C0 / 00000304 948 / 0B56C820 / 0000030C 948 / 0B56C880 / 0000030C 948 / 0B56C8E0 / 0000030C ... 1160 / 0B56E6E0 / 000002F4 // 0B56E6E0 / 000002F4 1160 / 0B56E500 / 000002F4 1160 / 0B56E800 / 000002F4 1160 / 0B56DF00 / 000002FC // 0B56DF00 / 000002FC 1160 / 0B56E7A0 / 000002FC 1160 / 0B56E5C0 / 000002FC 1160 / 0B56E560 / 00000304 1160 / 0B56E740 / 00000304 1160 / 0B56E620 / 00000304 1160 / 0B56E380 / 0000030C 1160 / 0B56E3E0 / 0000030C 1160 / 0B56E440 / 0000030C 1160 / 0B56E800 / 000002F4 1160 / 0B56E500 / 000002F4 1160 / 0B56E6E0 / 000002F4 // schon wieder 0B56E6E0 / 000002F4, bei gleichem Socket 1160 / 0B56E5C0 / 000002FC 1160 / 0B56E7A0 / 000002FC 1160 / 0B56DF00 / 000002FC 1160 / 0B56E680 / 00000304 1160 / 0B56E8C0 / 00000304 1160 / 0B56E920 / 00000304 1160 / 0B56E440 / 0000030C 1160 / 0B56E3E0 / 0000030C 1160 / 0B56E380 / 0000030C 1160 / 0B56E6E0 / 000002F4 1160 / 0B56E500 / 000002F4 1160 / 0B56E800 / 000002F4 1160 / 0B56DF00 / 000002FC // schon wieder 0B56DF00 / 000002FC, bei gleichem Socket 1160 / 0B56E7A0 / 000002FC 1160 / 0B56E5C0 / 000002FC 1160 / 0B56E620 / 00000304 1160 / 0B56E740 / 00000304 1160 / 0B56E560 / 00000304 1160 / 0B56E380 / 0000030C 1160 / 0B56E3E0 / 0000030C 1160 / 0B56E440 / 0000030C 1160 / 0B56E9E0 / 000002F4 1160 / 0B56EA40 / 000002F4 1160 / 0B56EAA0 / 000002F4 1160 / 0B56E5C0 / 000002FC 1160 / 0B56E7A0 / 000002FC 1160 / 0B56DF00 / 000002FC 1160 / 0B56E920 / 00000304 1160 / 0B56E8C0 / 00000304 1160 / 0B56E680 / 00000304 1160 / 0B56E440 / 0000030C 1160 / 0B56E3E0 / 0000030C 1160 / 0B56E380 / 0000030C
lpFlags ist immer 0, return immer -1 mit 997 (io pending). Während diesen Aufrufen wird WSAGetOverlappedResult noch gar nicht aufgerufen, somit sind es tatsächlich mehrere pending WSARecvFrom mit den gleichen lpOverlapped/hEvent Adressen.
Wie kann das sein? In der WSARecvFrom Doku steht, jeder Aufruf muss eine eigene Overlapped-Struktur übergeben ("If multiple I/O operations are simultaneously outstanding, each must reference a separate WSAOVERLAPPED structure.").
Ich habe nun Probleme, bei WSAGetOverlappedResult das lpOverlapped dem richtigen lpBuffers zuzuordnen, da es ja mehrere WSARecvFrom mit dem selben lpOverlapped gibt...