mattercontrol/original/PrinterDriverInstaller/InfInstaller.cs

83 lines
No EOL
2.5 KiB
C#

using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
namespace MatterHackers.InfInstaller
{
public class InfInstallerApp
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
public InfInstallerApp()
{
#if DEBUG
//Debugger.Launch();
#endif
}
public void InstallInfDriverFile(string pathAndDriverToInstall)
{
Process driverInstallerProcess = new Process();
driverInstallerProcess.StartInfo.Arguments = string.Format("-a \"{0}\"", Path.GetFullPath(pathAndDriverToInstall));
driverInstallerProcess.StartInfo.CreateNoWindow = true;
driverInstallerProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
string pnpUtilFileName = "PnPUtil.exe";
string pnPUtilPathAndFileName = Path.Combine("C:/Windows/winsxs/amd64_microsoft-windows-pnputil_31bf3856ad364e35_6.1.7600.16385_none_5958b438d6388d15", pnpUtilFileName);
bool fileExists = File.Exists(pnPUtilPathAndFileName);
if (!fileExists)
{
// Disable redirection
IntPtr ptr = new IntPtr();
bool isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr);
if (isWow64FsRedirectionDisabled)
{
pnPUtilPathAndFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), pnpUtilFileName);
}
}
driverInstallerProcess.StartInfo.FileName = pnPUtilPathAndFileName;
driverInstallerProcess.StartInfo.Verb = "runas";
driverInstallerProcess.StartInfo.UseShellExecute = false;
driverInstallerProcess.Start();
driverInstallerProcess.WaitForExit();
if (!fileExists)
{
// Restore redirection
IntPtr ptr = new IntPtr();
Wow64RevertWow64FsRedirection(ptr);
}
}
[STAThread]
public static void Main(string[] args)
{
// this sets the global culture for the app and all new threads
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
// and make sure the app is set correctly
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
if (args.Length > 0 && File.Exists(args[0]))
{
InfInstallerApp driverInstaller = new InfInstallerApp();
driverInstaller.InstallInfDriverFile(args[0]);
}
}
}
}