public static void TrackDevices(Router router) { // Find AppDeployCmd.exe var programFilesX86 = Environment.GetEnvironmentVariable(Environment.Is64BitOperatingSystem ? "COMMONPROGRAMFILES(X86)" : "COMMONPROGRAMFILES"); var ipOverUsbEnum = Path.Combine(programFilesX86, @"Microsoft Shared\Phone Tools\CoreCon\11.0\Bin\IpOverUsbEnum.exe"); if (!File.Exists(ipOverUsbEnum)) { return; } var portRegex = new Regex(string.Format(@"{0} (\d+) ->", IpOverUsbParadoxName)); var currentWinPhoneDevices = new Dictionary <int, ConnectedDevice>(); bool checkIfPortMappingIsSetup = false; while (true) { ProcessOutputs devicesOutputs; try { devicesOutputs = ShellHelper.RunProcessAndGetOutput(ipOverUsbEnum, ""); } catch (Exception) { continue; } if (devicesOutputs.ExitCode != 0) { continue; } var newWinPhoneDevices = new Dictionary <int, string>(); // First time a device is detected, we check port mapping is properly setup in registry var isThereAnyDevices = devicesOutputs.OutputLines.Any(x => x == "Partner:"); if (isThereAnyDevices && !checkIfPortMappingIsSetup) { using (var ipOverUsb = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\IpOverUsb")) { if (ipOverUsb != null) { using (var ipOverUsbParadox = ipOverUsb.OpenSubKey(IpOverUsbParadoxName)) { if (ipOverUsbParadox == null) { RegisterWindowsPhonePortMapping(); } } } } checkIfPortMappingIsSetup = true; } // Match forwarded ports foreach (var outputLine in devicesOutputs.OutputLines) { int port; var match = portRegex.Match(outputLine); if (match.Success && Int32.TryParse(match.Groups[1].Value, out port)) { newWinPhoneDevices.Add(port, "Device"); } } DeviceHelper.UpdateDevices(Log, newWinPhoneDevices, currentWinPhoneDevices, (connectedDevice) => { // Launch a client thread that will automatically tries to connect to this port var localPort = (int)connectedDevice.Key; Log.Info("Device connected: {0}; mapped port {1}", connectedDevice.Name, localPort); Task.Run(() => DeviceHelper.LaunchPersistentClient(connectedDevice, router, "localhost", localPort)); }); Thread.Sleep(1000); // Detect new devices every 1000 msec } }