我正在做一个涉及 hooking 的项目WSARecv
。我知道如何挂钩这个函数,我的意思是它就像挂钩另一个函数一样。无论如何,困难的部分是何时WSARecv
用于执行重叠操作。这个想法是,当应用程序接收到数据以拦截它并可以修改它时,我正在为此使用管道。本机 DLL 将所有数据通过隧道传输到托管“服务器”。这会处理输入等并将其返回到本机 DLL。这适用WSASend
于send
和recv
。然而,困难的部分是应用程序使用重叠套接字时。
所以我需要先接收到的数据才能处理它,这是困难的部分。我该怎么做这样的事情?我想到了这一点,但它们似乎都一团糟:
使用WSARecv
WSAOverlapped 调用时:创建一个新线程,使用WaitForSingleObject
并传递hEvent
WSAOverlapped 结构。当事件发出信号时,将数据处理到托管服务器并将数据传递给程序。
使用完成WSARecv
例程调用时:创建一个新线程,将对原始函数的调用修改lpOperationCompleted
为一个新函数。用于SleepEx
将线程置于警报状态。当 OperationCompleted 被调用时,处理数据并将数据传回程序。
我可以发布我的代码,但我没有写,因为这似乎是一个糟糕的解决方案。所以没有真正的意义。
我想不出更好的解决方案,这似乎很可怕,因为当应用程序调用WSARecv
很多时(例如,使用重叠套接字来处理大量客户端的大型服务器)它会为每个调用创建一个新线程,这似乎是个坏主意。
那么我该怎么做呢?