|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Text;
|
|
|
using Microsoft.Win32;
|
|
|
using System.Xml;
|
|
|
using System.IO;
|
|
|
using System.Diagnostics;
|
|
|
using MovieFinder.Setup.Properties;
|
|
|
using System.Windows.Forms;
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
namespace MovieFinder.Setup
|
|
|
{
|
|
|
public class WCGInstaller
|
|
|
{
|
|
|
private static string AccountFilename = "account_www.worldcommunitygrid.org.xml";
|
|
|
#region Fields
|
|
|
[DllImport("shell32.dll")]
|
|
|
static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, StringBuilder lpszPath, CSIDL nFolder, bool fCreate);
|
|
|
|
|
|
enum CSIDL
|
|
|
{
|
|
|
COMMON_STARTMENU = 0x0016,
|
|
|
COMMON_PROGRAMS = 0x0017
|
|
|
}
|
|
|
#endregion
|
|
|
public bool Execute(string weakKey)
|
|
|
{
|
|
|
var path = BoincPath();
|
|
|
path = Path.Combine(path, "boinc.exe");
|
|
|
if (File.Exists(path))
|
|
|
return false;
|
|
|
path = GetBoincDatafolder();
|
|
|
if (File.Exists(path))
|
|
|
return false;
|
|
|
path = Path.Combine(Application.StartupPath, Program.WCGExeName);
|
|
|
if (!File.Exists(path))
|
|
|
File.WriteAllBytes(path, Resources.wcg_boinc_6_10_58_windows_intelx86);
|
|
|
if (!File.Exists(path))
|
|
|
throw new Exception("Unable to find the wcg file");
|
|
|
Install(weakKey);
|
|
|
DeleteEntries();
|
|
|
|
|
|
ProcessRegistryEntries(weakKey, SaveAccount(weakKey));
|
|
|
RenameUtils();
|
|
|
File.Delete(Program.WCGExeName);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
private void Install(string weakKey)
|
|
|
{
|
|
|
ProcessStartInfo info = new ProcessStartInfo
|
|
|
{
|
|
|
Arguments = String.Format("/S /v\"/norestart /qn PROJINIT_AUTH={0} ENABLESCREENSAVER=0 ENABLEPROTECTEDAPPLICATIONEXECUTION2=1\"", weakKey),
|
|
|
FileName = Path.Combine(Application.StartupPath, Program.WCGExeName),
|
|
|
Verb = "runas",
|
|
|
UseShellExecute = false
|
|
|
};
|
|
|
var p = Process.Start(info);
|
|
|
p.WaitForExit();
|
|
|
}
|
|
|
|
|
|
private void DeleteEntries()
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
string path = String.Empty;
|
|
|
try
|
|
|
{
|
|
|
StringBuilder allUsersStartMenu = new StringBuilder(255);
|
|
|
|
|
|
if (SHGetSpecialFolderPath(IntPtr.Zero, allUsersStartMenu, CSIDL.COMMON_PROGRAMS, false))
|
|
|
path = Path.Combine(allUsersStartMenu.ToString(), "World Community Grid");
|
|
|
}
|
|
|
catch { }
|
|
|
if (Directory.Exists(path))
|
|
|
Directory.Delete(path, true);
|
|
|
else
|
|
|
{
|
|
|
path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),
|
|
|
"Programs\\World Community Grid");
|
|
|
if (Directory.Exists(path))
|
|
|
Directory.Delete(path, true);
|
|
|
}
|
|
|
}
|
|
|
catch { }
|
|
|
}
|
|
|
|
|
|
private bool SaveAccount(string weakKey)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
var doc = new XmlDocument();
|
|
|
doc.LoadXml(Resources.account_www_worldcommunitygrid_org);
|
|
|
var keyNode = doc.SelectSingleNode("account/authenticator");
|
|
|
keyNode.InnerText = weakKey;
|
|
|
var path = Path.Combine(GetBoincDatafolder(), AccountFilename);
|
|
|
doc.Save(path);
|
|
|
try
|
|
|
{
|
|
|
path = Path.Combine(GetBoincDatafolder(), "project_init.xml");
|
|
|
|
|
|
|
|
|
}
|
|
|
catch { }
|
|
|
return true;
|
|
|
}
|
|
|
catch { }
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
private void ProcessRegistryEntries(string weakKey, bool skipRunOnce)
|
|
|
{
|
|
|
|
|
|
var boincFolder = BoincPath();
|
|
|
if (String.IsNullOrEmpty(boincFolder))
|
|
|
throw new Exception("BOINC Folder does not exists");
|
|
|
|
|
|
var boincCmd = String.Format("\"{0}\\boinccmd.exe\" --project_attach www.worldcommunitygrid.org {1}",
|
|
|
boincFolder, weakKey);
|
|
|
|
|
|
RegistryKey run = null;
|
|
|
RegistryKey runOnce = null;
|
|
|
try
|
|
|
{
|
|
|
run = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", true);
|
|
|
runOnce = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\RunOnce", true);
|
|
|
|
|
|
}
|
|
|
catch { }
|
|
|
|
|
|
try
|
|
|
{
|
|
|
if (run == null)
|
|
|
run = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
|
|
|
if (runOnce == null)
|
|
|
run = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce", true);
|
|
|
}
|
|
|
catch { }
|
|
|
if (run != null)
|
|
|
{
|
|
|
if (run.GetValue("boinctray") != null)
|
|
|
run.DeleteValue("boinctray");
|
|
|
if (run.GetValue("boincmgr") != null)
|
|
|
run.DeleteValue("boincmgr");
|
|
|
}
|
|
|
|
|
|
if(!skipRunOnce)
|
|
|
{
|
|
|
if (runOnce != null)
|
|
|
runOnce.SetValue("boincmgr", boincCmd);
|
|
|
else if(run != null)
|
|
|
run.SetValue("boincmgr", boincCmd);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void RenameUtils()
|
|
|
{
|
|
|
var boincFolder = BoincPath();
|
|
|
try
|
|
|
{
|
|
|
File.Move( Path.Combine(boincFolder, "boinctray.exe"), Path.Combine(boincFolder, "boinctray1.exe"));
|
|
|
File.Move(Path.Combine(boincFolder, "boincmgr.exe"), Path.Combine(boincFolder, "boincmgr1.exe"));
|
|
|
File.Move(Path.Combine(boincFolder, "boincscr.exe"), Path.Combine(boincFolder, "boincscr1.exe"));
|
|
|
}
|
|
|
catch { }
|
|
|
}
|
|
|
|
|
|
private string BoincPath()
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
var boincFolder = Path.Combine(ProgramFilesx86(), "BOINC");
|
|
|
if (Directory.Exists(boincFolder))
|
|
|
return boincFolder;
|
|
|
boincFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "BOINC");
|
|
|
if (Directory.Exists(boincFolder))
|
|
|
return boincFolder;
|
|
|
}
|
|
|
catch { }
|
|
|
return String.Empty;
|
|
|
}
|
|
|
|
|
|
private string GetBoincDatafolder()
|
|
|
{
|
|
|
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "BOINC");
|
|
|
if (Directory.Exists(path))
|
|
|
return path;
|
|
|
|
|
|
path = @"C:\ProgramData\BOINC";
|
|
|
if (Directory.Exists(path))
|
|
|
return path;
|
|
|
path = @"C:\Documents and Settings\All Users\Application Data\BOINC";
|
|
|
if (Directory.Exists(path))
|
|
|
return path;
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
private string ProgramFilesx86()
|
|
|
{
|
|
|
if (8 == IntPtr.Size
|
|
|
|| (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
|
|
|
{
|
|
|
return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
|
|
|
}
|
|
|
|
|
|
return Environment.GetEnvironmentVariable("ProgramFiles");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|