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...

    😕


Log in to reply