Files
Work/socket/HOOKER.CPP
2024-08-07 09:16:27 -04:00

79 lines
1.5 KiB
C++

#include <socket/hooker.hpp>
#include <common/winsock.hpp>
BlockHooker::BlockHooker(void)
: mIsHooked(FALSE)
{
ProcAddress<BlockHooker> procAddress;
mCodeGenerator.push(procAddress.getProcAddress(BlockHooker::hookProc));
mCodeGenerator.movECX(int(this));
mCodeGenerator.popEAX();
mCodeGenerator.callEAX();
mCodeGenerator.retn();
mCodeGenerator.execute();
}
BlockHooker::BlockHooker(const BlockHooker &someBlockHooker)
{ // private implementation
}
BlockHooker::~BlockHooker()
{
unhookBlock();
}
BlockHooker &BlockHooker::operator=(const BlockHooker &/*someBlockHooker*/)
{ // private implementation
return *this;
}
BOOL BlockHooker::operator==(const BlockHooker &/*someBlockHooker*/)const
{ // private implementation
return FALSE;
}
BOOL BlockHooker::hookProc(void)
{
if(mCallback.callback(CallbackData()))cancelBlockingCall();
return yield();
}
BOOL BlockHooker::yield(void)
{
BOOL haveMessage(FALSE);
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
haveMessage=TRUE;
}
return haveMessage;
}
BOOL BlockHooker::hookBlock(void)
{
if(mIsHooked)return FALSE;
mIsHooked=TRUE;
return (::WSASetBlockingHook((FARPROC)mCodeGenerator.base())?TRUE:FALSE);
}
BOOL BlockHooker::unhookBlock(void)
{
if(!mIsHooked)return FALSE;
mIsHooked=FALSE;
return ::WSAUnhookBlockingHook();
}
BOOL BlockHooker::isBlocking(void)
{
return ::WSAIsBlocking();
}
BOOL BlockHooker::cancelBlockingCall(void)
{
return ::WSACancelBlockingCall();
}