public EntryPoint( RemoteHooking.IContext context, string channelName, OverlayConfig config) { // Get reference to IPC to host application // Note: any methods called or events triggered against _interface will execute in the host process. _interface = RemoteHooking.IpcConnectClient <OverlayInterface>(channelName); // We try to ping immediately, if it fails then injection fails _interface.Ping(); #region Allow client event handlers (bi-directional IPC) // Attempt to create a IpcServerChannel so that any event handlers on the client will function correctly IDictionary properties = new Hashtable(); properties["name"] = channelName; properties["portName"] = channelName + Guid.NewGuid().ToString("N"); // random portName so no conflict with existing channels of channelName var binaryProv = new BinaryServerFormatterSinkProvider(); binaryProv.TypeFilterLevel = TypeFilterLevel.Full; var clientServerChannel = new IpcServerChannel(properties, binaryProv); ChannelServices.RegisterChannel(clientServerChannel, false); #endregion }
/// <summary> /// Begin a background thread to check periodically that the host process is still accessible on its IPC channel /// </summary> private void StartCheckHostIsAliveThread() { _checkAlive = new Task(() => { try { while (Interlocked.Read(ref _stopCheckAlive) == 0) { Thread.Sleep(1000); // .NET Remoting exceptions will throw RemotingException _interface.Ping(); } } catch // We will assume that any exception means that the hooks need to be removed. { // Signal the Run method so that it can exit _runWait.Set(); } }); _checkAlive.Start(); }