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();
|