Skip to content

Commit 695111c

Browse files
authored
Fix fulltrust process sometimes exiting on start (#9580)
1 parent 2582051 commit 695111c

File tree

2 files changed

+9
-51
lines changed

2 files changed

+9
-51
lines changed

src/Files.FullTrust/Program.cs

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -231,46 +231,27 @@ private static bool HandleCommandLineArgs()
231231
{
232232
localSettings.Values.Remove("Arguments");
233233

234-
if (arguments == "StartUwp")
234+
if (arguments == "TerminateUwp")
235235
{
236-
var folder = localSettings.Values.Get("Folder", "");
237-
localSettings.Values.Remove("Folder");
238-
239-
using Process process = new Process();
240-
process.StartInfo.UseShellExecute = true;
241-
process.StartInfo.FileName = "files.exe";
242-
process.StartInfo.Arguments = folder;
243-
process.Start();
244-
245-
TerminateProcess((int)localSettings.Values["pid"]);
246-
return true;
247-
}
248-
else if (arguments == "TerminateUwp")
249-
{
250-
TerminateProcess((int)localSettings.Values["pid"]);
251-
return true;
236+
// Return false and don't exit if PID process is not running
237+
// Argument may refer to unrelated session (#9580)
238+
return TerminateProcess((int)localSettings.Values["pid"]);
252239
}
253240
else if (arguments == "ShellCommand")
254241
{
255-
TerminateProcess((int)localSettings.Values["pid"]);
256-
257242
Win32API.OpenFolderInExistingShellWindow((string)localSettings.Values["ShellCommand"]);
258243

259-
return true;
244+
return TerminateProcess((int)localSettings.Values["pid"]);
260245
}
261246
}
262247

263248
return false;
264249
}
265250

266-
private static void TerminateProcess(int processId)
251+
private static bool TerminateProcess(int processId)
267252
{
268253
// Kill the process. This is a BRUTAL WAY to kill a process.
269-
#if DEBUG
270-
// In debug mode this kills this process too??
271-
#else
272-
SafetyExtensions.IgnoreExceptions(() => Process.GetProcessById(processId).Kill(), Program.Logger);
273-
#endif
254+
return SafetyExtensions.IgnoreExceptions(() => Process.GetProcessById(processId).Kill());
274255
}
275256
}
276257
}

src/Files.Uwp/Program.cs

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ private static async Task Main()
2727
if (AppInstance.RecommendedInstance != null)
2828
{
2929
AppInstance.RecommendedInstance.RedirectActivationTo();
30-
await TerminateUwpAppInstance(proc.Id);
3130
return;
3231
}
3332
else if (activatedArgs is LaunchActivatedEventArgs)
@@ -49,7 +48,6 @@ private static async Task Main()
4948
var plInstance = AppInstance.GetInstances().First(x => x.Key.Equals(PrelaunchInstanceKey));
5049
ApplicationData.Current.LocalSettings.Values["WAS_PRELAUNCH_INSTANCE_ACTIVATED"] = true;
5150
plInstance.RedirectActivationTo();
52-
await TerminateUwpAppInstance(proc.Id);
5351
return;
5452
}
5553
else
@@ -59,7 +57,6 @@ private static async Task Main()
5957
if (!instance.IsCurrentInstance && !string.IsNullOrWhiteSpace(launchArgs.Arguments))
6058
{
6159
instance.RedirectActivationTo();
62-
await TerminateUwpAppInstance(proc.Id);
6360
return;
6461
}
6562
}
@@ -75,7 +72,6 @@ private static async Task Main()
7572
if (!instance.IsCurrentInstance)
7673
{
7774
instance.RedirectActivationTo();
78-
await TerminateUwpAppInstance(proc.Id);
7975
return;
8076
}
8177
}
@@ -87,7 +83,6 @@ private static async Task Main()
8783
if (!instance.IsCurrentInstance)
8884
{
8985
instance.RedirectActivationTo();
90-
await TerminateUwpAppInstance(proc.Id);
9186
return;
9287
}
9388
}
@@ -127,6 +122,8 @@ private static async Task Main()
127122
if (!instance.IsCurrentInstance)
128123
{
129124
instance.RedirectActivationTo();
125+
// Terminate "zombie" Files process which remains in suspended state
126+
// after redirection when launched by command line
130127
await TerminateUwpAppInstance(proc.Id);
131128
return;
132129
}
@@ -146,26 +143,6 @@ public static async Task OpenShellCommandInExplorerAsync(string shellCommand, in
146143
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
147144
}
148145

149-
public static async Task SpawnUnelevatedUwpAppInstance(int pid)
150-
{
151-
IActivatedEventArgs activatedArgs = AppInstance.GetActivatedEventArgs();
152-
if (activatedArgs is CommandLineActivatedEventArgs cmdLineArgs)
153-
{
154-
var parsedCommands = CommandLineParser.ParseUntrustedCommands(cmdLineArgs.Operation.Arguments);
155-
switch (parsedCommands.FirstOrDefault()?.Type)
156-
{
157-
case ParsedCommandType.ExplorerShellCommand:
158-
case ParsedCommandType.OpenDirectory:
159-
case ParsedCommandType.OpenPath:
160-
ApplicationData.Current.LocalSettings.Values["Folder"] = parsedCommands[0].Payload;
161-
break;
162-
}
163-
}
164-
ApplicationData.Current.LocalSettings.Values["Arguments"] = "StartUwp";
165-
ApplicationData.Current.LocalSettings.Values["pid"] = pid;
166-
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
167-
}
168-
169146
public static async Task TerminateUwpAppInstance(int pid)
170147
{
171148
ApplicationData.Current.LocalSettings.Values["Arguments"] = "TerminateUwp";

0 commit comments

Comments
 (0)