ScpControl/Driver/DriverInstaller.cs (124 lines of code) (raw):

using System; using System.IO; using System.Linq; using System.Reflection; using log4net; using ScpControl.Bluetooth; using ScpControl.Database; using ScpControl.ScpCore; using ScpControl.Usb.Ds3; using ScpControl.Usb.Ds4; namespace ScpControl.Driver { /// <summary> /// Automated Windows driver (un)installer utility class. /// </summary> public static class DriverInstaller { #region Private static fields private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly string DriverDirectory = Path.Combine(GlobalConfiguration.AppDirectory, "Driver"); #endregion public static WdiErrorCode InstallBluetoothHost(WdiDeviceInfo usbDevice, IntPtr hWnd = default(IntPtr)) { usbDevice.InfFile = string.Format("BluetoothHost_{0:X4}_{1:X4}.inf", usbDevice.VendorId, usbDevice.ProductId); usbDevice.DeviceType = WdiUsbDeviceType.BluetoothHost; var result = WdiWrapper.InstallWinUsbDriver(usbDevice, BthDongle.DeviceClassGuid, DriverDirectory, usbDevice.InfFile, hWnd); if (result != WdiErrorCode.WDI_SUCCESS) { Log.ErrorFormat("Installing Bluetooth Host ({0}) failed: {1}", usbDevice.DeviceId, result); return result; } using (var db = new ScpDb()) { db.Engine.PutDbEntity(ScpDb.TableDevices, usbDevice.DeviceId, usbDevice); } return result; } public static uint UninstallBluetoothDongles(ref bool rebootRequired) { uint uninstalled = 0; if (!Directory.Exists(DriverDirectory)) return uninstalled; foreach ( var file in Directory.GetFiles(DriverDirectory) .Where( f => Path.GetFileName(f).StartsWith("BthDongle_") && Path.GetExtension(f).ToLower().Equals(".inf"))) { Difx.Instance.Uninstall(file, DifxFlags.DRIVER_PACKAGE_DELETE_FILES, out rebootRequired); uninstalled++; } return uninstalled; } public static WdiErrorCode InstallDualShock3Controller(WdiDeviceInfo usbDevice, IntPtr hWnd = default(IntPtr)) { usbDevice.InfFile = string.Format("Ds3Controller_{0:X4}_{1:X4}.inf", usbDevice.VendorId, usbDevice.ProductId); usbDevice.DeviceType = WdiUsbDeviceType.DualShock3; var result = WdiWrapper.InstallWinUsbDriver(usbDevice, UsbDs3.DeviceClassGuid, DriverDirectory, usbDevice.InfFile, hWnd); if (result != WdiErrorCode.WDI_SUCCESS) { Log.ErrorFormat("Installing DualShock 3 Controller ({0}) failed: {1}", usbDevice.DeviceId, result); return result; } using (var db = new ScpDb()) { db.Engine.PutDbEntity(ScpDb.TableDevices, usbDevice.DeviceId, usbDevice); } return result; } public static uint UninstallDualShock3Controllers(ref bool rebootRequired) { uint uninstalled = 0; if (!Directory.Exists(DriverDirectory)) return uninstalled; foreach ( var file in Directory.GetFiles(DriverDirectory) .Where( f => Path.GetFileName(f).StartsWith("Ds3Controller_") && Path.GetExtension(f).ToLower().Equals(".inf"))) { Difx.Instance.Uninstall(file, DifxFlags.DRIVER_PACKAGE_DELETE_FILES, out rebootRequired); uninstalled++; } return uninstalled; } public static WdiErrorCode InstallDualShock4Controller(WdiDeviceInfo usbDevice, IntPtr hWnd = default(IntPtr)) { usbDevice.InfFile = string.Format("Ds4Controller_{0:X4}_{1:X4}.inf", usbDevice.VendorId, usbDevice.ProductId); usbDevice.DeviceType = WdiUsbDeviceType.DualShock4; var result = WdiWrapper.InstallWinUsbDriver(usbDevice, UsbDs4.DeviceClassGuid, DriverDirectory, usbDevice.InfFile, hWnd); if (result != WdiErrorCode.WDI_SUCCESS) { Log.ErrorFormat("Installing DualShock 4 Controller ({0}) failed: {1}", usbDevice.DeviceId, result); return result; } using (var db = new ScpDb()) { db.Engine.PutDbEntity(ScpDb.TableDevices, usbDevice.DeviceId, usbDevice); } return result; } public static uint UninstallDualShock4Controllers(ref bool rebootRequired) { uint uninstalled = 0; if (!Directory.Exists(DriverDirectory)) return uninstalled; foreach ( var file in Directory.GetFiles(DriverDirectory) .Where( f => Path.GetFileName(f).StartsWith("Ds4Controller_") && Path.GetExtension(f).ToLower().Equals(".inf"))) { Difx.Instance.Uninstall(file, DifxFlags.DRIVER_PACKAGE_DELETE_FILES, out rebootRequired); uninstalled++; } return uninstalled; } } }