00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "stdafx.h"
00037 #include "SpoofBase.h"
00038
00039 #include "ErrorHandlerMacros.h"
00040 #include "OSManager.h"
00041 #include "GenericCriticalSection.h"
00042 #include "GenericEvent.h"
00043 #include "ManagedThread.h"
00044 #include "LibConfig.h"
00045
00046 #include <memory>
00047
00048 #ifdef _MEMORY_DEBUG
00049 #define new DEBUG_NEW
00050 #define malloc DEBUG_MALLOC
00051 static char THIS_FILE[] = __FILE__;
00052 #endif
00053
00054 KOMODIA_NAMESPACE_START
00055
00056
00057 BOOL CSpoofBase::m_bMultiThreaded=FALSE;
00058
00059
00060 BOOL CSpoofBase::m_bInitialized=FALSE;
00061
00062
00063 int CSpoofBase::m_ulNumberOfThreads=0;
00064
00065
00066 CGenericCriticalSection* CSpoofBase::m_pCSection=NULL;
00067
00068
00069 CSpoofBase* CSpoofBase::m_pShutdownClass=NULL;
00070
00071
00072 CManagedThread* CSpoofBase::m_pThread=NULL;
00073
00074
00075 #define THREAD_TIMEOUT 10000
00076
00077 #define CSpoofBase_Class "CSpoofBase"
00078
00079 CSpoofBase::CSpoofBase() : CErrorHandler()
00080 {
00081 try
00082 {
00083
00084 SetName(CSpoofBase_Class);
00085 }
00086 ERROR_HANDLER("CSpoofBase")
00087 }
00088
00089 CSpoofBase::CSpoofBase(const CSpoofBase& rBase) : CErrorHandler(rBase)
00090 {
00091 try
00092 {
00093
00094 SetName(CSpoofBase_Class);
00095 }
00096 ERROR_HANDLER("CSpoofBase")
00097 }
00098
00099 CSpoofBase::~CSpoofBase()
00100 {
00101 }
00102
00103 void CSpoofBase::SetLastError(const std::string& rMethod) const
00104 {
00105 try
00106 {
00107 #ifdef WIN32
00108
00109 m_iLastError=WSAGetLastError();
00110 #else
00111 m_iLastError=errno();
00112 #endif
00113
00114
00115 if (m_iLastError)
00116 ReportError(rMethod,
00117 m_iLastError);
00118 }
00119 ERROR_HANDLER("SetLastError")
00120 }
00121
00122 void CSpoofBase::SetLastError(const std::string& rMethod,
00123 int iErrorCode)const
00124 {
00125 try
00126 {
00127
00128 m_iLastError=iErrorCode;
00129
00130
00131 if (m_iLastError)
00132 ReportError(rMethod,
00133 m_iLastError);
00134 }
00135 ERROR_HANDLER("SetLastError")
00136 }
00137
00138 int CSpoofBase::GetLastError()const
00139 {
00140 return m_iLastError;
00141 }
00142
00143 DWORD CSpoofBase::InitProc(CGenericEvent* pExitEvent,
00144 LPVOID lpData)
00145 {
00146 try
00147 {
00148
00149 std::auto_ptr<ThreadData> pThreadData((ThreadData*)lpData);
00150
00151
00152 BOOL bResult;
00153 bResult=InitializeSockets(pThreadData->bMultiThreaded,
00154 pThreadData->ulNumberOfThreads);
00155
00156
00157 pThreadData->pEvent->Set();
00158
00159
00160 if (bResult)
00161 {
00162
00163 MSG msg;
00164
00165
00166 memset(&msg,
00167 0,
00168 sizeof(msg));
00169
00170
00171 BOOL bRun;
00172 bRun=TRUE;
00173
00174
00175 while (bRun &&
00176 pExitEvent->Wait(0))
00177 {
00178 while ((bRun=pExitEvent->Wait(0)) &&
00179 PeekMessage(&msg,
00180 NULL,
00181 0,
00182 0,
00183 PM_REMOVE))
00184 {
00185 TranslateMessage(&msg);
00186 DispatchMessage(&msg);
00187 }
00188
00189
00190 if (bRun)
00191
00192 bRun=pExitEvent->Wait(1);
00193 }
00194 }
00195
00196
00197 return TRUE;
00198 }
00199 ERROR_HANDLER_STATIC_RETURN(CSpoofBase_Class,"InitProc",FALSE)
00200 }
00201
00202 BOOL CSpoofBase::InitializeSocketsNoMap(BOOL bMultiThreaded,
00203 unsigned long ulNumberOfThreads)
00204 {
00205
00206 if (m_bInitialized)
00207 {
00208
00209 ReportStaticError(CSpoofBase_Class,"InitializeSocketsNoMap","Already initialized!");
00210
00211
00212 return TRUE;
00213 }
00214
00215
00216 if (ulNumberOfThreads>CLibConfig::GetInstance().GetMaxThreads())
00217 {
00218
00219 ReportStaticError(CSpoofBase_Class,"InitializeSocketsNoMap","Too many threads!");
00220
00221
00222 return FALSE;
00223 }
00224
00225
00226 if (bMultiThreaded &&
00227 !ulNumberOfThreads)
00228 {
00229
00230 ReportStaticError(CSpoofBase_Class,"InitializeSocketsNoMap","Didn't receive any threads!");
00231
00232
00233 return FALSE;
00234 }
00235
00236 try
00237 {
00238
00239 ThreadData* pThreadData;
00240 pThreadData=new ThreadData;
00241
00242
00243 pThreadData->pEvent=COSManager::CreateEvent();
00244 pThreadData->bMultiThreaded=bMultiThreaded;
00245 pThreadData->ulNumberOfThreads=ulNumberOfThreads;
00246
00247
00248 m_pThread=new CManagedThread(InitProc);
00249 m_pThread->Start((LPVOID)pThreadData);
00250
00251
00252 if (pThreadData->pEvent->Wait(THREAD_TIMEOUT))
00253 {
00254
00255 ReportStaticError(CSpoofBase_Class,"InitializeSocketsNoMap","Timeout waiting for thread");
00256
00257
00258 delete m_pThread;
00259 m_pThread=NULL;
00260
00261
00262 return FALSE;
00263 }
00264
00265
00266 if (!IsInitialized())
00267 {
00268
00269 delete m_pThread;
00270 m_pThread=NULL;
00271 }
00272
00273
00274 return IsInitialized();
00275 }
00276 ERROR_HANDLER_STATIC_RETURN(CSpoofBase_Class,"InitializeSocketsNoMap",FALSE)
00277 }
00278
00279 BOOL CSpoofBase::InitializeSockets(BOOL bMultiThreaded,
00280 unsigned long ulNumberOfThreads)
00281 {
00282
00283 if (m_bInitialized)
00284 {
00285
00286 ReportStaticError(CSpoofBase_Class,"InitializeSockets","Already initialized!");
00287
00288
00289 return TRUE;
00290 }
00291
00292
00293 if (ulNumberOfThreads>CLibConfig::GetInstance().GetMaxThreads())
00294 {
00295
00296 ReportStaticError(CSpoofBase_Class,"InitializeSockets","Too many threads!");
00297
00298
00299 return FALSE;
00300 }
00301
00302
00303 if (bMultiThreaded &&
00304 !ulNumberOfThreads)
00305 {
00306
00307 ReportStaticError(CSpoofBase_Class,"InitializeSockets","Didn't receive any threads!");
00308
00309
00310 return FALSE;
00311 }
00312
00313 try
00314 {
00315
00316 WORD wVersionRequested;
00317 wVersionRequested=MAKEWORD(2,2);
00318
00319
00320 WSADATA wsaData;
00321 int iErr;
00322 iErr=WSAStartup(wVersionRequested,
00323 &wsaData);
00324
00325
00326 if (iErr!=0)
00327
00328
00329 return FALSE;
00330
00331
00332
00333
00334
00335
00336
00337 if (LOBYTE(wsaData.wVersion)!=2 ||
00338 HIBYTE(wsaData.wVersion)!=2)
00339 {
00340
00341
00342 WSACleanup();
00343
00344
00345 return FALSE;
00346 }
00347
00348
00349 m_bMultiThreaded=bMultiThreaded;
00350 m_ulNumberOfThreads=ulNumberOfThreads;
00351
00352
00353 m_pCSection=COSManager::CreateCriticalSection();
00354
00355
00356 m_bInitialized=TRUE;
00357
00358 return TRUE;
00359 }
00360 ERROR_HANDLER_STATIC_RETURN(CSpoofBase_Class,"InitializeSockets",FALSE)
00361 }
00362
00363 BOOL CSpoofBase::ShutdownSockets()
00364 {
00365
00366 if (!m_bInitialized)
00367 return TRUE;
00368
00369 try
00370 {
00371
00372 if (m_pThread)
00373 {
00374
00375 delete m_pThread;
00376 m_pThread=NULL;
00377 }
00378
00379
00380 delete m_pCSection;
00381 m_pCSection=NULL;
00382
00383
00384 if (m_pShutdownClass)
00385 {
00386 m_pShutdownClass->NotifyShutdown();
00387 delete m_pShutdownClass;
00388 }
00389
00390 if (WSACleanup()==GetErrorCode())
00391 return FALSE;
00392
00393
00394 m_bInitialized=FALSE;
00395
00396
00397 return TRUE;
00398 }
00399 ERROR_HANDLER_STATIC_RETURN(CSpoofBase_Class,"ShutdownSockets",FALSE)
00400 }
00401
00402 void CSpoofBase::NotifyShutdown()
00403 {
00404 }
00405
00406 void CSpoofBase::RegisterShutdown(CSpoofBase* pBase)
00407 {
00408 try
00409 {
00410
00411 if (m_pShutdownClass)
00412 delete m_pShutdownClass;
00413
00414
00415 m_pShutdownClass=pBase;
00416 }
00417 ERROR_HANDLER("RegisterShutdown")
00418 }
00419
00420 std::string CSpoofBase::LongToStdString(unsigned long ulAddr)
00421 {
00422 try
00423 {
00424
00425 in_addr addr;
00426
00427
00428 addr.S_un.S_addr=ulAddr;
00429
00430
00431 CCriticalAutoRelease aRelease(m_pCSection);
00432
00433
00434 return inet_ntoa(addr);
00435 }
00436 ERROR_HANDLER_STATIC_RETURN(CSpoofBase_Class,"LongToStdString","0.0.0.0")
00437 }
00438
00439 char FAR * CSpoofBase::LongToString(unsigned long ulAddr)
00440 {
00441 try
00442 {
00443
00444 in_addr addr;
00445
00446
00447 addr.S_un.S_addr=ulAddr;
00448
00449
00450 CCriticalAutoRelease aRelease(m_pCSection);
00451
00452
00453 return inet_ntoa(addr);
00454 }
00455 ERROR_HANDLER_STATIC_RETURN(CSpoofBase_Class,"LongToString",NULL)
00456 }
00457
00458 BOOL CSpoofBase::IsMultiThreaded()
00459 {
00460 return m_bMultiThreaded;
00461 }
00462
00463 unsigned long CSpoofBase::GetNumberOfThreads()
00464 {
00465 return m_ulNumberOfThreads;
00466 }
00467
00468 BOOL CSpoofBase::IsInitialized()
00469 {
00470 return m_bInitialized;
00471 }
00472
00473 unsigned long CSpoofBase::StringToLong(const std::string& rAddress)
00474 {
00475 return inet_addr(rAddress.c_str());
00476 }
00477
00478 int CSpoofBase::GetSystemLastError() const
00479 {
00480 return WSAGetLastError();
00481 }
00482
00483 CGenericCriticalSection* CSpoofBase::GetGlobalCriticalSection()
00484 {
00485 return m_pCSection;
00486 }
00487
00488 int CSpoofBase::GetErrorCode()
00489 {
00490 return SOCKET_ERROR;
00491 }
00492
00493 KOMODIA_NAMESPACE_END