#include #include BlockHooker::BlockHooker(void) : mIsHooked(FALSE) { ProcAddress 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(); }