From: <ma...@us...> - 2003-05-20 04:51:14
|
Update of /cvsroot/decaldev/source/DenAgent In directory sc8-pr-cvs1:/tmp/cvs-serv17489 Modified Files: TrayWnd.cpp Log Message: Check for lobby's semaphore before injecting into lobby Index: TrayWnd.cpp =================================================================== RCS file: /cvsroot/decaldev/source/DenAgent/TrayWnd.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** TrayWnd.cpp 20 May 2003 02:50:39 -0000 1.7 --- TrayWnd.cpp 20 May 2003 04:51:10 -0000 1.8 *************** *** 24,29 **** // This is for our windows enumeration process - std::list< HWND > injectList; - bool g_bFirstEnum; BOOL CALLBACK EnumerationCallbackProc( HWND, LPARAM ); --- 24,27 ---- *************** *** 168,201 **** void CTrayWnd::OnTimer (UINT_PTR nIDEvent) { ! g_bFirstEnum = true; ! injectList.clear(); ! ::EnumWindows( EnumerationCallbackProc, (LPARAM) _T("ZoneLobbyWindow") ); } BOOL CALLBACK EnumerationCallbackProc( HWND hwnd, LPARAM lParam ) { - static HWND shFirst = NULL; - - if( g_bFirstEnum ) // first call - { - shFirst = hwnd; - g_bFirstEnum = false; - } - - else - { - // if this isn't the first call and the passed hwnd is the first HWND we got, exit enumeration - if( shFirst == hwnd ) - return FALSE; - - // check if we've already injected - for( std::list<HWND>::iterator i = injectList.begin(); i != injectList.end(); i++ ) - { - // yes, continue enumeration - if( *i == hwnd ) - return TRUE; - } - } - TCHAR szClassName[64]; memset( szClassName, 0, sizeof( szClassName ) / sizeof( szClassName[0] ) ); --- 166,174 ---- void CTrayWnd::OnTimer (UINT_PTR nIDEvent) { ! ::EnumWindows( EnumerationCallbackProc, (LPARAM) NULL ); } BOOL CALLBACK EnumerationCallbackProc( HWND hwnd, LPARAM lParam ) { TCHAR szClassName[64]; memset( szClassName, 0, sizeof( szClassName ) / sizeof( szClassName[0] ) ); *************** *** 203,207 **** --- 176,182 ---- if( _tcsicmp( _T( "ZoneLobbyWindow" ), szClassName ) != 0 ) + { return TRUE; + } if( hwnd != NULL ) *************** *** 212,215 **** --- 187,208 ---- if( dwProcessId != 0 ) { + TCHAR tszBuffer [256]; + + ::_stprintf (tszBuffer, _T("__LOBBYHOOK_%d"), dwProcessId); + HANDLE hLobbySemaphore = ::CreateSemaphore (NULL, 0, 1, tszBuffer); + + DWORD dwLastError = ::GetLastError (); + + if (hLobbySemaphore) + { + ::CloseHandle (hLobbySemaphore); + + if (dwLastError == ERROR_ALREADY_EXISTS) + { + // The lobbyhook has already been injected, we know because it created the semaphore. + return TRUE; + } + } + CRegKey key; *************** *** 245,251 **** HMODULE hLib = (HMODULE) ForceLibraryNow( dwProcessId, szDllPath ); ! if( hLib != NULL ) ! injectList.push_back( hwnd ); ! else { DWORD dwError = GetLastError(); --- 238,242 ---- HMODULE hLib = (HMODULE) ForceLibraryNow( dwProcessId, szDllPath ); ! if( hLib == NULL ) { DWORD dwError = GetLastError(); |