fixed handling of calling init() when a previous process did not
call cleanup(). if that process still appears to exist then the init() fails. otherwise some cleanup is performed and the init() proceeds. a synergy server started while another is running will now exit immediately without interfering the original server.
This commit is contained in:
		
							parent
							
								
									635c3d1c62
								
							
						
					
					
						commit
						cf71aec730
					
				|  | @ -33,7 +33,7 @@ typedef struct tagMOUSEHOOKSTRUCTWin2000 { | |||
| // all data in this shared section *must* be initialized
 | ||||
| 
 | ||||
| static HINSTANCE		g_hinstance       = NULL; | ||||
| static DWORD			g_process         = NULL; | ||||
| static DWORD			g_processID       = 0; | ||||
| static EWheelSupport	g_wheelSupport    = kWheelNone; | ||||
| static UINT				g_wmMouseWheel    = 0; | ||||
| static DWORD			g_threadID        = 0; | ||||
|  | @ -438,17 +438,19 @@ BOOL WINAPI | |||
| DllMain(HINSTANCE instance, DWORD reason, LPVOID) | ||||
| { | ||||
| 	if (reason == DLL_PROCESS_ATTACH) { | ||||
| 		if (g_hinstance == NULL) { | ||||
| 		DisableThreadLibraryCalls(instance); | ||||
| 		if (g_processID == 0) { | ||||
| 			g_hinstance = instance; | ||||
| 			g_process   = GetCurrentProcessId(); | ||||
| 			g_processID = GetCurrentProcessId(); | ||||
| 		} | ||||
| 	} | ||||
| 	else if (reason == DLL_PROCESS_DETACH) { | ||||
| 		if (g_process == GetCurrentProcessId()) { | ||||
| 		if (g_processID == GetCurrentProcessId()) { | ||||
| 			if (g_keyboard != NULL || g_mouse != NULL || g_cbt != NULL) { | ||||
| 				uninstall(); | ||||
| 			} | ||||
| 			g_process = NULL; | ||||
| 			g_processID = 0; | ||||
| 			g_hinstance = NULL; | ||||
| 		} | ||||
| 	} | ||||
| 	return TRUE; | ||||
|  | @ -461,13 +463,34 @@ init(DWORD threadID) | |||
| { | ||||
| 	assert(g_hinstance != NULL); | ||||
| 
 | ||||
| 	// see if already initialized.  if it is we'll shut down and
 | ||||
| 	// reinitialize.  this allows the hook DLL to be reclaimed by
 | ||||
| 	// a new synergyd if the previous one died unexpectedly.
 | ||||
| 	if (g_threadID != 0) { | ||||
| 		uninstallScreenSaver(); | ||||
| 		uninstall(); | ||||
| 		cleanup(); | ||||
| 	// try to open process that last called init() to see if it's
 | ||||
| 	// still running or if it died without cleaning up.
 | ||||
| 	if (g_processID != 0 && g_processID != GetCurrentProcessId()) { | ||||
| 		HANDLE process = OpenProcess(STANDARD_RIGHTS_REQUIRED, | ||||
| 								FALSE, g_processID); | ||||
| 		if (process != NULL) { | ||||
| 			// old process (probably) still exists so refuse to
 | ||||
| 			// reinitialize this DLL (and thus steal it from the
 | ||||
| 			// old process).
 | ||||
| 			CloseHandle(process); | ||||
| 			return 0; | ||||
| 		} | ||||
| 
 | ||||
| 		// clean up after old process.  the system should've already
 | ||||
| 		// removed the hooks so we just need to reset our state.
 | ||||
| 		g_hinstance       = GetModuleHandle("synrgyhk"); | ||||
| 		g_processID       = GetCurrentProcessId(); | ||||
| 		g_wheelSupport    = kWheelNone; | ||||
| 		g_threadID        = 0; | ||||
| 		g_keyboard        = NULL; | ||||
| 		g_mouse           = NULL; | ||||
| 		g_cbt             = NULL; | ||||
| 		g_getMessage      = NULL; | ||||
| 		g_keyHookThread   = NULL; | ||||
| 		g_keyHookThreadID = 0; | ||||
| 		g_keyHookEvent    = NULL; | ||||
| 		g_keyboardLL      = NULL; | ||||
| 		g_screenSaver     = false; | ||||
| 	} | ||||
| 
 | ||||
| 	// save thread id.  we'll post messages to this thread's
 | ||||
|  | @ -493,7 +516,9 @@ cleanup(void) | |||
| { | ||||
| 	assert(g_hinstance != NULL); | ||||
| 
 | ||||
| 	if (g_processID == GetCurrentProcessId()) { | ||||
| 		g_threadID = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	return 1; | ||||
| } | ||||
|  |  | |||
|  | @ -398,7 +398,9 @@ CMSWindowsPrimaryScreen::onPreOpen() | |||
| 
 | ||||
| 	// initialize hook library
 | ||||
| 	m_threadID = GetCurrentThreadId(); | ||||
| 	m_init(m_threadID); | ||||
| 	if (m_init(m_threadID) == 0) { | ||||
| 		throw XScreenOpenFailure(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue