|
|
1.1 root 1: using System;
2: using System.Diagnostics;
3: using System.Windows.Forms;
4: using System.IO;
5: using System.Runtime.InteropServices;
6:
7: namespace CleanFlashUninstaller {
8: static class Program {
9: [Flags]
10: internal enum MoveFileFlags {
11: None = 0,
12: ReplaceExisting = 1,
13: CopyAllowed = 2,
14: DelayUntilReboot = 4,
15: WriteThrough = 8,
16: CreateHardlink = 16,
17: FailIfNotTrackable = 32,
18: }
19:
20: [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
21: static extern bool MoveFileEx(
22: string lpExistingFileName,
23: string lpNewFileName,
24: MoveFileFlags dwFlags);
25:
26: static bool DeleteOnReboot(string filename) {
27: return MoveFileEx(filename, null, MoveFileFlags.DelayUntilReboot);
28: }
29:
30: static string TrimPath(string path) {
31: return path.TrimEnd(new[] { '/', '\\' });
32: }
33:
34: static bool EnsureRunInTemp() {
35: string tempFolder = TrimPath(Path.GetTempPath());
36: string currentPath = Application.ExecutablePath;
37: string currentFolder = TrimPath(Path.GetDirectoryName(currentPath));
38:
39: if (currentFolder.Equals(tempFolder, StringComparison.OrdinalIgnoreCase)) {
40: // Already running in the temp directory.
41: return true;
42: }
43:
44: string currentExeName = Path.GetFileName(currentPath);
45: string newPath = Path.Combine(tempFolder, currentExeName);
46:
47: if (File.Exists(newPath)) {
48: try {
49: // Attempt to delete the old version of the uninstaller.
50: File.Delete(newPath);
51: } catch {
52: // Uninstaller is already running.
53: Application.Exit();
54: return false;
55: }
56: }
57:
58: // Copy the new file and mark it as delete-on-reboot
59: File.Copy(currentPath, newPath);
60: DeleteOnReboot(newPath);
61:
62: // Start the new process and end the old one
63: Process.Start(newPath);
64: Application.Exit();
65: return false;
66: }
67:
68: /// <summary>
69: /// The main entry point for the application.
70: /// </summary>
71: [STAThread]
72: static void Main() {
73: if (!EnsureRunInTemp()) {
74: return;
75: }
76:
77: Application.EnableVisualStyles();
78: Application.SetCompatibleTextRenderingDefault(false);
79: Application.Run(new UninstallForm());
80: }
81: }
82: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.