diff --git a/src/Hub/Samples/DrivelutionSample.cs b/src/Hub/Samples/DrivelutionSample.cs deleted file mode 100644 index 4b9d749..0000000 --- a/src/Hub/Samples/DrivelutionSample.cs +++ /dev/null @@ -1,249 +0,0 @@ -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Security.Principal; -using GeneralUpdate.Drivelution; -using GeneralUpdate.Drivelution.Abstractions.Models; - -namespace Hub.Samples; - -public class DrivelutionSample : ISample -{ - public int Index => 8; - public string Name => "驱动更新 — 检测·验证·安装·卸载"; - public bool RequiresServer => false; - public string[] CleanPaths => new[] { Path.Combine(Path.GetTempPath(), "drivelution_demo") }; - - // P/Invoke to check actual install result - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - static extern bool InstallHinfSection(IntPtr hwnd, IntPtr hinst, string cmdline, int show); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - static extern bool SetupUninstallOEMInf(string infName, uint flags, IntPtr reserved); - - [DllImport("newdev.dll", SetLastError = true, CharSet = CharSet.Auto)] - static extern bool DiInstallDriver(IntPtr hwnd, string infPath, uint flags, out bool needReboot); - - [DllImport("newdev.dll", SetLastError = true, CharSet = CharSet.Auto)] - static extern bool DiUninstallDriver(IntPtr hwnd, string infPath, uint flags, out bool needReboot); - - const uint DIIRFLAG_FORCE_INF = 0x00000001; - - public async Task RunAsync(AppConfig config, CancellationToken ct) - { - if (!OperatingSystem.IsWindows()) - { - Console.WriteLine(" 此示例仅支持 Windows 平台"); - return; - } - - var isAdmin = new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); - - Console.WriteLine(); - Console.WriteLine("══ 步骤 1/5 — 平台检测 ══"); - var platform = GeneralDrivelution.GetPlatformInfo(); - Console.WriteLine($" OS: {platform.OperatingSystem} ({platform.Architecture})"); - Console.WriteLine($" 管理员: {(isAdmin ? "是 ✓" : "否 ✗")}"); - - // ── 2. 创建驱动包 ── - var demoDir = Path.Combine(Path.GetTempPath(), "drivelution_demo", Guid.NewGuid().ToString("N")[..8]); - var driverDir = Path.Combine(demoDir, "driver"); - Directory.CreateDirectory(driverDir); - - var infPath = Path.Combine(driverDir, "demo.inf"); - File.WriteAllText(infPath, """ -[Version] -Signature = "$Windows NT$" -Class = SoftwareDevice -ClassGuid = {62f9c741-b25b-46ef-b5cc-51f0ce52790b} -Provider = %Mfg% -DriverVer = 06/01/2024,1.0.0.0 - -[Manufacturer] -%Mfg% = Standard,NTamd64 - -[Standard.NTamd64] -%DeviceDesc% = DemoInstall, ROOT\DEMO0001 - -[DemoInstall] -AddReg = AddReg - -[DemoInstall.Services] -AddService = ,, - -[AddReg] -HKR,,DemoVersion,0x00000000,"1.0.0.0" - -[Strings] -Mfg = "GeneralUpdate Demo" -DeviceDesc = "GeneralUpdate Demo Device (Safe)" -"""); - - Console.WriteLine(); - Console.WriteLine("══ 步骤 2/5 — 驱动包 ══"); - Console.WriteLine($" 文件: demo.inf ({new FileInfo(infPath).Length} bytes)"); - Console.WriteLine($" 类型: SoftwareDevice (无需 .sys 内核驱动)"); - Console.WriteLine($" 设备: ROOT\\DEMO0001"); - - // ── 3. Drivelution API 验证 ── - Console.WriteLine(); - Console.WriteLine("══ 步骤 3/5 — Drivelution API 验证 ══"); - var driverInfo = new DriverInfo - { - Name = "DemoDriver", Version = "1.0.0", - FilePath = infPath, - TargetOS = platform.OperatingSystem, - Architecture = platform.Architecture - }; - var valid = await GeneralDrivelution.ValidateAsync(driverInfo, ct); - Console.WriteLine($" ValidateAsync: {(valid ? "通过 ✓" : "未通过 ✗")}"); - - // ── 4. 安装 ── - Console.WriteLine(); - Console.WriteLine("══ 步骤 4/5 — 安装驱动 ══"); - - if (!isAdmin) - { - Console.WriteLine(" ⚠ 需要管理员权限 → 右键终端 → 以管理员身份运行"); - SafeDelete(demoDir); - return; - } - - // 检查驱动签名策略 - var signingEnforced = CheckSigningEnforcement(); - Console.WriteLine($" 驱动签名强制: {(signingEnforced ? "是 (Secure Boot / Win11 默认)" : "否 (测试模式)")}"); - - // 备份 - var backupFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "driver_backups", "demo.inf.bak"); - Directory.CreateDirectory(Path.GetDirectoryName(backupFile)!); - File.Copy(infPath, backupFile, true); - Console.WriteLine($" 备份: ✓"); - - // 用 DiInstallDriver (newdev.dll) — Windows DIFx 框架 - // 即使未签名,也会尝试安装并返回准确结果 - Console.Write(" 安装 (DiInstallDriver)... "); - bool needReboot; - var installOk = DiInstallDriver(IntPtr.Zero, infPath, DIIRFLAG_FORCE_INF, out needReboot); - var err = installOk ? 0 : Marshal.GetLastWin32Error(); - - if (installOk) - { - Console.WriteLine("成功 ✓"); - } - else - { - Console.WriteLine("失败 ✗"); - Console.WriteLine($" 错误码: {err}"); - Console.WriteLine(GetSigningErrorMessage(err)); - } - - // ── 5. 验证 & 卸载 ── - Console.WriteLine(); - Console.WriteLine("══ 步骤 5/5 — 验证 & 卸载 ══"); - - // 检查是否真的装入了驱动存储 - var (enumOk, enumOut) = await RunPnPAsync("/enum-drivers", ct); - var inStore = enumOut.Contains("demo.inf"); - Console.WriteLine($" 驱动存储: {(inStore ? "已注册 ✓" : "未注册 (签名拦截)")}"); - - // 如果在存储中,卸载 - var uninstOk = false; - if (inStore) - { - Console.Write(" 卸载驱动... "); - uninstOk = SetupUninstallOEMInf("demo.inf", 1 /* SUOI_FORCEDELETE */, IntPtr.Zero); - Console.WriteLine(uninstOk ? "SetupUninstallOEMInf ✓" : "✗"); - - if (!uninstOk) - { - bool rb; - uninstOk = DiUninstallDriver(IntPtr.Zero, infPath, 0, out rb); - Console.WriteLine($" DiUninstallDriver: {(uninstOk ? "✓" : "✗")}"); - } - } - - // ── 总结 ── - Console.WriteLine(); - Console.WriteLine("═══════════════════════════════"); - Console.WriteLine(" 安装流程总结"); - Console.WriteLine("═══════════════════════════════"); - R("平台检测", true); - R("Drivelution 验证", valid); - R("备份文件", true); - R($"DiInstallDriver{(signingEnforced ? " (签名拦截)" : "")}", installOk); - R("驱动存储", inStore); - R("卸载", uninstOk || !inStore); - - if (installOk) - { - Console.WriteLine(); - Console.WriteLine(" ╔══════════════════════════╗"); - Console.WriteLine(" ║ ✓ 安装/卸载 成功 ║"); - Console.WriteLine(" ╚══════════════════════════╝"); - } - else if (signingEnforced) - { - Console.WriteLine(); - Console.WriteLine(" ┌─────────────────────────────────────┐"); - Console.WriteLine(" │ Windows 驱动签名强制已开启 │"); - Console.WriteLine(" │ │"); - Console.WriteLine(" │ Drivelution API 流程验证: ✓ │"); - Console.WriteLine(" │ 实际安装: ✗ (签名拦截) │"); - Console.WriteLine(" │ │"); - Console.WriteLine(" │ 要测试完整安装, 以管理员运行: │"); - Console.WriteLine(" │ bcdedit /set testsigning on │"); - Console.WriteLine(" │ 重启后即可安装未签名驱动 │"); - Console.WriteLine(" └─────────────────────────────────────┘"); - } - else - { - Console.WriteLine($" ⚠ 安装失败, 错误码: {err}"); - } - - SafeDelete(demoDir); - } - - static bool CheckSigningEnforcement() - { - try - { - var psi = new ProcessStartInfo("bcdedit.exe", "/enum") - { RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; - using var p = Process.Start(psi); - if (p == null) return true; // can't check, assume enforced - var output = p.StandardOutput.ReadToEnd(); - p.WaitForExit(); - // testsigning Yes → disabled enforcement - return !output.Contains("testsigning") || !output.Contains("Yes"); - } - catch { return true; } - } - - static string GetSigningErrorMessage(int err) - { - // Common driver install error codes - if (err == 5) return " → 拒绝访问 (需要管理员权限)"; - if (err == unchecked((int)0xE0000247)) return " → 驱动未签名, Windows 强制签名策略拦截"; - if (err == unchecked((int)0xE000022F)) return " → 第三方 INF 未包含数字签名"; - return $" → 错误码 {err}: 常见原因=驱动签名强制 (Win11 默认)"; - } - - static async Task<(bool ok, string output)> RunPnPAsync(string args, CancellationToken ct) - { - try - { - var psi = new ProcessStartInfo("pnputil.exe", args) - { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; - using var p = Process.Start(psi); - if (p == null) return (false, ""); - var o = await p.StandardOutput.ReadToEndAsync(ct); - var e = await p.StandardError.ReadToEndAsync(ct); - await p.WaitForExitAsync(ct); - var text = (o + e).Trim(); - return (p.ExitCode == 0, string.IsNullOrEmpty(text) ? "" : text.Split('\n').Last().Trim()); - } - catch { return (false, ""); } - } - - static void R(string label, bool ok) => Console.WriteLine($" {(ok ? "✓" : "✗")} {label}"); - static void SafeDelete(string p) { try { if (Directory.Exists(p)) Directory.Delete(p, true); } catch { } } -} diff --git a/src/Hub/Samples/ImDiskQuickInstallSample.cs b/src/Hub/Samples/ImDiskQuickInstallSample.cs new file mode 100644 index 0000000..78edc1d --- /dev/null +++ b/src/Hub/Samples/ImDiskQuickInstallSample.cs @@ -0,0 +1,178 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using GeneralUpdate.Drivelution; +using GeneralUpdate.Drivelution.Abstractions.Models; + +namespace Hub.Samples; + +/// +/// Scan the bundled ImDisk driver directory and install the driver. +/// +/// Drivelution APIs: GetDriversFromDirectoryAsync (scan), ValidateAsync (verify) +/// Native install: InstallHinfSection (setupapi.dll, same method ImDisk's own installer uses) +/// Verify: pnputil /enum-drivers +/// +public class ImDiskQuickInstallSample : ISample +{ + public int Index => 8; + public string Name => "Driver Update"; + public bool RequiresServer => false; + public string[] CleanPaths => Array.Empty(); + + // Driver files bundled at src/ImDiskDriver/ + // BaseDir = src/Hub/bin/Debug/net10.0/ -> ../../../../ImDiskDriver = src/ImDiskDriver/ + private static readonly string DriverDir = Path.GetFullPath( + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "..", "ImDiskDriver")); + + // ---- Native SetupAPI (bypasses PnPUtil signature restrictions) ---- + [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern bool InstallHinfSection(IntPtr hwnd, IntPtr hinst, string cmdline, int show); + + [DllImport("newdev.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern bool DiInstallDriver(IntPtr hwnd, string infPath, uint flags, out bool needReboot); + + const uint DIIRFLAG_FORCE_INF = 0x00000001; + + public async Task RunAsync(AppConfig config, CancellationToken ct) + { + GeneralTracer.SetTracingEnabled(false); + + // ---- 1. Platform ---- + Console.WriteLine(); + Console.WriteLine("---- Step 1/4: Platform ----"); + + if (!OperatingSystem.IsWindows()) + { + Console.WriteLine(" Windows only. Exiting."); + return; + } + + var platform = GeneralDrivelution.GetPlatformInfo(); + Console.WriteLine($" OS: {platform.OperatingSystem} ({platform.Architecture})"); + Console.WriteLine($" Version: {platform.SystemVersion}"); + Console.WriteLine(); + + // ---- 2. Scan (Drivelution API) ---- + Console.WriteLine("---- Step 2/4: Scan ----"); + Console.WriteLine($" Directory: {DriverDir}"); + + if (!Directory.Exists(DriverDir)) + { + Console.WriteLine($" ERROR: Directory not found: {DriverDir}"); + return; + } + + var drivers = await GeneralDrivelution.GetDriversFromDirectoryAsync( + DriverDir, searchPattern: null, cancellationToken: ct); + + Console.WriteLine($" Found: {drivers.Count} driver package(s)"); + + if (drivers.Count == 0) + { + Console.WriteLine(" No INF driver found. INF files in directory:"); + foreach (var f in Directory.GetFiles(DriverDir, "*.inf", SearchOption.TopDirectoryOnly)) + Console.WriteLine($" {f}"); + return; + } + + var driver = drivers[0]; + Console.WriteLine($" Name: {driver.Name}"); + Console.WriteLine($" Version: {driver.Version}"); + Console.WriteLine($" File: {driver.FilePath}"); + Console.WriteLine(); + + // ---- 3. Validate (Drivelution API) ---- + Console.WriteLine("---- Step 3/4: Validate ----"); + + var valid = await GeneralDrivelution.ValidateAsync(driver, ct); + Console.WriteLine($" Validate: {(valid ? "PASS" : "FAIL")}"); + Console.WriteLine(); + + // ---- 4. Install (cascade: DIFx -> SetupAPI -> PnPUtil) ---- + Console.WriteLine("---- Step 4/4: Install ----"); + + var infPath = driver.FilePath; + var installOk = false; + var method = ""; + + // Method A: DiInstallDriver (newdev.dll) + Console.WriteLine(" [1] DiInstallDriver (DIFx)..."); + installOk = DiInstallDriver(IntPtr.Zero, infPath, DIIRFLAG_FORCE_INF, out var needReboot); + var err1 = installOk ? 0 : Marshal.GetLastWin32Error(); + Console.WriteLine(installOk + ? $" => OK{(needReboot ? " (reboot required)" : "")}" + : $" => Failed (0x{err1:X8})"); + method = "DiInstallDriver (DIFx)"; + + // Method B: InstallHinfSection (setupapi.dll) — ImDisk's own installer uses this + if (!installOk) + { + Console.WriteLine(" [2] InstallHinfSection (SetupAPI)..."); + installOk = InstallHinfSection(IntPtr.Zero, IntPtr.Zero, $"DefaultInstall 132 {infPath}", 0); + var err2 = installOk ? 0 : Marshal.GetLastWin32Error(); + Console.WriteLine(installOk + ? " => OK" + : $" => Failed (0x{err2:X8})"); + method = "InstallHinfSection (SetupAPI)"; + } + + // Method C: PnPUtil (last resort) + if (!installOk) + { + Console.WriteLine(" [3] PnPUtil (last resort)..."); + var (pnpOk, pnpOut) = await RunAsync("pnputil.exe", + $"/add-driver \"{infPath}\" /install", ct); + installOk = pnpOk; + Console.WriteLine(installOk ? " => OK" : " => Failed"); + method = "PnPUtil"; + } + + // ---- Verify ---- + Console.WriteLine(); + var (_, enumOut) = await RunAsync("pnputil.exe", "/enum-drivers", ct); + var inStore = enumOut.Contains(Path.GetFileName(infPath)); + Console.WriteLine($" Driver store: {(inStore ? "REGISTERED" : "NOT FOUND")}"); + + // ---- Summary ---- + Console.WriteLine(); + Console.WriteLine("============================================"); + Console.WriteLine(" RESULT"); + Console.WriteLine("============================================"); + Console.WriteLine($" Install: {(installOk ? "SUCCESS" : "FAILED")}"); + Console.WriteLine($" Method: {method}"); + Console.WriteLine($" Driver: {driver.Name} v{driver.Version}"); + Console.WriteLine($" In store: {inStore}"); + + if (!installOk) + { + Console.WriteLine(); + Console.WriteLine(" All install methods failed — signature enforcement."); + Console.WriteLine(" In an ADMIN terminal, run:"); + Console.WriteLine(" bcdedit /set testsigning on"); + Console.WriteLine(" Then REBOOT and retry."); + } + + Console.WriteLine(); + } + + static async Task<(bool ok, string output)> RunAsync(string exe, string args, CancellationToken ct) + { + try + { + var psi = new ProcessStartInfo(exe, args) + { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + }; + using var p = Process.Start(psi); + if (p == null) return (false, ""); + var o = await p.StandardOutput.ReadToEndAsync(ct); + var e = await p.StandardError.ReadToEndAsync(ct); + await p.WaitForExitAsync(ct); + return (p.ExitCode == 0, (o + e).Trim()); + } + catch { return (false, ""); } + } +} diff --git a/src/ImDiskDriver/awealloc/amd64/awealloc.sys b/src/ImDiskDriver/awealloc/amd64/awealloc.sys new file mode 100644 index 0000000..82ee3fd Binary files /dev/null and b/src/ImDiskDriver/awealloc/amd64/awealloc.sys differ diff --git a/src/ImDiskDriver/awealloc/i386/awealloc.sys b/src/ImDiskDriver/awealloc/i386/awealloc.sys new file mode 100644 index 0000000..6310ebc Binary files /dev/null and b/src/ImDiskDriver/awealloc/i386/awealloc.sys differ diff --git a/src/ImDiskDriver/cli/amd64/imdisk.exe b/src/ImDiskDriver/cli/amd64/imdisk.exe new file mode 100644 index 0000000..2e4fa26 Binary files /dev/null and b/src/ImDiskDriver/cli/amd64/imdisk.exe differ diff --git a/src/ImDiskDriver/cli/i386/imdisk.exe b/src/ImDiskDriver/cli/i386/imdisk.exe new file mode 100644 index 0000000..22401da Binary files /dev/null and b/src/ImDiskDriver/cli/i386/imdisk.exe differ diff --git a/src/ImDiskDriver/cpl/amd64/imdisk.cpl b/src/ImDiskDriver/cpl/amd64/imdisk.cpl new file mode 100644 index 0000000..d3a9830 Binary files /dev/null and b/src/ImDiskDriver/cpl/amd64/imdisk.cpl differ diff --git a/src/ImDiskDriver/cpl/i386/imdisk.cpl b/src/ImDiskDriver/cpl/i386/imdisk.cpl new file mode 100644 index 0000000..e511933 Binary files /dev/null and b/src/ImDiskDriver/cpl/i386/imdisk.cpl differ diff --git a/src/ImDiskDriver/deviodrv/amd64/deviodrv.sys b/src/ImDiskDriver/deviodrv/amd64/deviodrv.sys new file mode 100644 index 0000000..0a97fec Binary files /dev/null and b/src/ImDiskDriver/deviodrv/amd64/deviodrv.sys differ diff --git a/src/ImDiskDriver/deviodrv/i386/deviodrv.sys b/src/ImDiskDriver/deviodrv/i386/deviodrv.sys new file mode 100644 index 0000000..42177ad Binary files /dev/null and b/src/ImDiskDriver/deviodrv/i386/deviodrv.sys differ diff --git a/src/ImDiskDriver/imdisk.inf b/src/ImDiskDriver/imdisk.inf new file mode 100644 index 0000000..83b6087 --- /dev/null +++ b/src/ImDiskDriver/imdisk.inf @@ -0,0 +1,302 @@ +[Version] +signature = "$Windows NT$" +Provider = "LTR Data" +DriverVer=11/11/2021,6.0.6001.18000 + + +[SourceDisksNames] +1 = "ImDisk Virtual Disk Driver Installation disk" + + +[SourceDisksFiles.x86] +deviodrv.sys = 1,deviodrv\i386 +awealloc.sys = 1,awealloc\i386 +imdisk.sys = 1,sys\i386 +imdsksvc.exe = 1,svc\i386 +imdisk.cpl = 1,cpl\i386 +imdisk.exe = 1,cli\i386 +imdisk.inf = 1 +imdisk.pnf = 1 +uninstall_imdisk.cmd = 1 + + +[SourceDisksFiles.ia64] +deviodrv.sys = 1,deviodrv\ia64 +awealloc.sys = 1,awealloc\ia64 +imdisk.sys = 1,sys\ia64 +imdsksvc.exe = 1,svc\ia64 +imdisk.cpl = 1,cpl\ia64 +imdisk.exe = 1,cli\ia64 +imdisk.inf = 1 +imdisk.pnf = 1 +uninstall_imdisk.cmd = 1 + + +[SourceDisksFiles.amd64] +deviodrv.sys = 1,deviodrv\amd64 +awealloc.sys = 1,awealloc\amd64 +imdisk.sys = 1,sys\amd64 +imdsksvc.exe = 1,svc\amd64 +imdisk.cpl = 1,cpl\amd64 +imdisk.exe = 1,cli\amd64 +imdisk.inf = 1 +imdisk.pnf = 1 +uninstall_imdisk.cmd = 1 + + +[SourceDisksFiles.arm] +deviodrv.sys = 1,deviodrv\arm +awealloc.sys = 1,awealloc\arm +imdisk.sys = 1,sys\arm +imdsksvc.exe = 1,svc\arm +imdisk.cpl = 1,cpl\arm +imdisk.exe = 1,cli\arm +imdisk.inf = 1 +imdisk.pnf = 1 +uninstall_imdisk.cmd = 1 + + +[SourceDisksFiles.arm64] +deviodrv.sys = 1,deviodrv\arm64 +awealloc.sys = 1,awealloc\arm64 +imdisk.sys = 1,sys\arm64 +imdsksvc.exe = 1,svc\arm64 +imdisk.cpl = 1,cpl\arm64 +imdisk.exe = 1,cli\arm64 +imdisk.inf = 1 +imdisk.pnf = 1 +uninstall_imdisk.cmd = 1 + + +[DestinationDirs] +ImDiskExeFiles = 11 +ImDiskExe32Files = 16425 +ImDiskSysFiles = 12 +ImDiskInfFiles = 17 +ImDiskPnfFiles = 17 + + +[DefaultInstall.ntx86] +CopyFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskInfFiles +AddReg = ImDiskAddReg +DelReg = ImDiskDelOldReg + + +[DefaultUninstall.ntx86] +DelFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskInfFiles, ImDiskPnfFiles +DelReg = ImDiskDelReg + + +[DefaultInstall.ntarm] +CopyFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskInfFiles +AddReg = ImDiskAddReg +DelReg = ImDiskDelOldReg + + +[DefaultUninstall.ntarm] +DelFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskInfFiles, ImDiskPnfFiles +DelReg = ImDiskDelReg + + +[DefaultInstall.ntamd64] +CopyFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskExe32Files, ImDiskInfFiles +AddReg = ImDiskAddReg +DelReg = ImDiskDelOldReg + + +[DefaultUninstall.ntamd64] +DelFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskExe32Files, ImDiskInfFiles, ImDiskPnfFiles +DelReg = ImDiskDelReg + + +[DefaultInstall.ntarm64] +CopyFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskExe32Files, ImDiskInfFiles +AddReg = ImDiskAddReg +DelReg = ImDiskDelOldReg + + +[DefaultUninstall.ntarm64] +DelFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskExe32Files, ImDiskInfFiles, ImDiskPnfFiles +DelReg = ImDiskDelReg + + +[DefaultInstall.ntia64] +CopyFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskExe32Files, ImDiskInfFiles +AddReg = ImDiskAddReg +DelReg = ImDiskDelOldReg + + +[DefaultUninstall.ntia64] +DelFiles = ImDiskSysFiles, ImDiskExeFiles, ImDiskExe32Files, ImDiskInfFiles, ImDiskPnfFiles +DelReg = ImDiskDelReg + + +[DefaultInstall.ntx86.Services] +AddService = DevIoDrv, , DevIoDrv +AddService = AWEAlloc, , AWEAllocDrv +AddService = ImDisk, , ImDskDrv +AddService = ImDskSvc, , ImDskSvc + + +[DefaultUninstall.ntx86.Services] +DelService = DevIoDrv +DelService = AWEAlloc +DelService = ImDisk +DelService = ImDskSvc + + +[DefaultInstall.ntarm.Services] +AddService = DevIoDrv, , DevIoDrv +AddService = AWEAlloc, , AWEAllocDrv +AddService = ImDisk, , ImDskDrv +AddService = ImDskSvc, , ImDskSvc + + +[DefaultUninstall.ntarm.Services] +DelService = DevIoDrv +DelService = AWEAlloc +DelService = ImDisk +DelService = ImDskSvc + + +[DefaultInstall.ntamd64.Services] +AddService = DevIoDrv, , DevIoDrv +AddService = AWEAlloc, , AWEAllocDrv +AddService = ImDisk, , ImDskDrv +AddService = ImDskSvc, , ImDskSvc + + +[DefaultUninstall.ntamd64.Services] +DelService = DevIoDrv +DelService = AWEAlloc +DelService = ImDisk +DelService = ImDskSvc + + +[DefaultInstall.ntarm64.Services] +AddService = DevIoDrv, , DevIoDrv +AddService = AWEAlloc, , AWEAllocDrv +AddService = ImDisk, , ImDskDrv +AddService = ImDskSvc, , ImDskSvc + + +[DefaultUninstall.ntarm64.Services] +DelService = DevIoDrv +DelService = AWEAlloc +DelService = ImDisk +DelService = ImDskSvc + + +[DefaultInstall.ntia64.Services] +AddService = DevIoDrv, , DevIoDrv +AddService = AWEAlloc, , AWEAllocDrv +AddService = ImDisk, , ImDskDrv +AddService = ImDskSvc, , ImDskSvc + + +[DefaultUninstall.ntia64.Services] +DelService = DevIoDrv +DelService = AWEAlloc +DelService = ImDisk +DelService = ImDskSvc + + +[ImDiskExeFiles] +imdisk.exe +imdisk.cpl +imdsksvc.exe +uninstall_imdisk.cmd + + +[ImDiskExe32Files] +imdisk.exe,cli\i386\imdisk.exe +imdisk.cpl,cpl\i386\imdisk.cpl + + +[ImDiskSysFiles] +deviodrv.sys +awealloc.sys +imdisk.sys + + +[ImDiskInfFiles] +imdisk.inf + + +[ImDiskPnfFiles] +imdisk.pnf + + +[ImDiskAddReg] +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "DisplayName", 0, "ImDisk Virtual Disk Driver" +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "Publisher", 0, "LTR Data" +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "HelpLink", 0, "http://ltr-data.se/opencode.html" +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "DisplayVersion", 0, "*" +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "UninstallString", 0x00020000, """%%SystemRoot%%\system32\cmd.exe"" /c ""%%SystemRoot%%\system32\uninstall_imdisk.cmd""" +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "DisplayIcon", 0, "%11%\imdisk.cpl" +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "EstimatedSize", 65537, 320 +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "NoRepair", 65537, 1 +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "NoModify", 65537, 1 +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk", "Size", 0, "" + +HKCR, "*\shell\ImDiskMountFile", , 0, "Mount as ImDisk Virtual Disk" +HKCR, "*\shell\ImDiskMountFile\command", , 0, "rundll32.exe imdisk.cpl,RunDLL_MountFile %%L" + +HKCR, "Drive\shell\ImDiskUnmount", , 0, "Unmount ImDisk Virtual Disk" +HKCR, "Drive\shell\ImDiskUnmount\command", , 0, "rundll32.exe imdisk.cpl,RunDLL_RemoveDevice %%L" + +HKCR, "Drive\shell\ImDiskSaveImage", , 0, "Save disk contents as image file" +HKCR, "Drive\shell\ImDiskSaveImage\command", , 0, "rundll32.exe imdisk.cpl,RunDLL_SaveImageFile %%L" + + +[ImDiskDelOldReg] +HKCR, "*\shell\ImDiskMountFileWriteable" + + +[ImDiskDelReg] +HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ImDisk" + +HKCR, "*\shell\ImDiskMountFile" + +HKCR, "*\shell\ImDiskMountFileWriteable" + +HKCR, "Drive\shell\ImDiskUnmount" + +HKCR, "Drive\shell\ImDiskSaveImage" + + +[ImDskDrv] +DisplayName = "ImDisk Virtual Disk Driver" +Description = "Disk emulation driver" +ServiceType = 1 +StartType = 2 +ErrorControl = 0 +ServiceBinary = %12%\imdisk.sys + + +[AWEAllocDrv] +DisplayName = "AWE Memory Allocation Driver" +Description = "Driver for physical memory allocation through AWE" +ServiceType = 1 +StartType = 2 +ErrorControl = 0 +ServiceBinary = %12%\awealloc.sys + + +[DevIoDrv] +DisplayName = "DevIO Client Driver" +Description = "Client driver for ImDisk devio proxy mode" +ServiceType = 1 +StartType = 2 +ErrorControl = 0 +ServiceBinary = %12%\deviodrv.sys + + +[ImDskSvc] +DisplayName = "ImDisk Virtual Disk Driver Helper" +Description = "Helper service for ImDisk Virtual Disk Driver." +ServiceType = 16 +StartType = 2 +ErrorControl = 0 +ServiceBinary = %11%\imdsksvc.exe + diff --git a/src/ImDiskDriver/install.cmd b/src/ImDiskDriver/install.cmd new file mode 100644 index 0000000..7b560c3 --- /dev/null +++ b/src/ImDiskDriver/install.cmd @@ -0,0 +1,87 @@ +@echo off + +setlocal + +pushd "%~dp0" + +title ImDisk Virtual Disk Driver setup + +echo ImDisk Virtual Disk Driver setup +echo. + +set IMDISK_TOTAL_DEVICES=0 +set IMDISK_VALID_DEVICES=0 +set IMDISK_PENDING_REMOVAL_DEVICES=0 + +if exist "%SystemRoot%\system32\imdisk.exe" ( + for /f %%a in ('imdisk -l -n ^| find /v /i ^"No^"') do call :addline "%%a" +) + +if %IMDISK_VALID_DEVICES% GTR 0 ( + echo Number of existing ImDisk virtual disks: %IMDISK_VALID_DEVICES% + echo. + if "%IMDISK_SILENT_SETUP%" == "1" ( + echo Please dismount all existing ImDisk virtual disks before upgrade! + echo. + ) else ( + .\msgboxw.exe "Please dismount all existing ImDisk virtual disks before upgrade!" 16 "ImDisk Virtual Disk Driver setup" + start "" "%SystemRoot%\system32\control.exe" "%SystemRoot%\system32\imdisk.cpl" + ) + popd + endlocal + goto :eof +) + +echo Number of existing ImDisk virtual disks: %IMDISK_TOTAL_DEVICES% +echo. +if %IMDISK_TOTAL_DEVICES% == 0 ( + "%SystemRoot%\system32\net.exe" stop imdsksvc + "%SystemRoot%\system32\net.exe" stop awealloc + "%SystemRoot%\system32\net.exe" stop imdisk + if exist "%SystemRoot%\system32\taskkill.exe" "%SystemRoot%\system32\taskkill.exe" /F /IM imdsksvc.exe +) + +"%SystemRoot%\system32\rundll32.exe" setupapi.dll,InstallHinfSection DefaultInstall 132 .\imdisk.inf + +if errorlevel 1 ( + if not "%IMDISK_SILENT_SETUP%" == "1" .\msgboxw.exe "Setup failed. Please try to reboot the computer and then try to run the setup package again." 16 "ImDisk Virtual Disk Driver setup" + popd + endlocal + goto :eof +) + +set IMDISK_START_FAILED=1 +if %IMDISK_TOTAL_DEVICES% == 0 ( + set IMDISK_START_FAILED=0 + net start imdsksvc || set IMDISK_START_FAILED=1 + net start awealloc || set IMDISK_START_FAILED=1 + net start imdisk || set IMDISK_START_FAILED=1 +) + +if not "%IMDISK_SILENT_SETUP%" == "1" ( + if %IMDISK_START_FAILED% == 0 ( + .\msgboxw.exe "Setup finished successfully. Open ImDisk Virtual Disk Driver applet in Control Panel or use imdisk command line to manage your virtual disks!" 0 "ImDisk Virtual Disk Driver setup" + ) else ( + .\msgboxw.exe "Setup finished, but drivers or services could not start. Please try to reboot the computer and then try to run the setup package again." 16 "ImDisk Virtual Disk Driver setup" + ) +) + +popd + +endlocal + +goto :eof + +:addline + +"%SystemRoot%\system32\imdisk.exe" -l -u %~1 > nul 2>&1 + +if errorlevel 1 ( + set /a IMDISK_PENDING_REMOVAL_DEVICES=%IMDISK_PENDING_REMOVAL_DEVICES% + 1 > nul +) else ( + set /a IMDISK_VALID_DEVICES=%IMDISK_VALID_DEVICES% + 1 > nul +) + +set /a IMDISK_TOTAL_DEVICES=%IMDISK_TOTAL_DEVICES% + 1 > nul + +goto :eof diff --git a/src/ImDiskDriver/msgboxw.exe b/src/ImDiskDriver/msgboxw.exe new file mode 100644 index 0000000..d990148 Binary files /dev/null and b/src/ImDiskDriver/msgboxw.exe differ diff --git a/src/ImDiskDriver/runwaitw.exe b/src/ImDiskDriver/runwaitw.exe new file mode 100644 index 0000000..30a94a2 Binary files /dev/null and b/src/ImDiskDriver/runwaitw.exe differ diff --git a/src/ImDiskDriver/svc/amd64/imdsksvc.exe b/src/ImDiskDriver/svc/amd64/imdsksvc.exe new file mode 100644 index 0000000..17bd081 Binary files /dev/null and b/src/ImDiskDriver/svc/amd64/imdsksvc.exe differ diff --git a/src/ImDiskDriver/svc/i386/imdsksvc.exe b/src/ImDiskDriver/svc/i386/imdsksvc.exe new file mode 100644 index 0000000..8f52aab Binary files /dev/null and b/src/ImDiskDriver/svc/i386/imdsksvc.exe differ diff --git a/src/ImDiskDriver/sys/amd64/imdisk.sys b/src/ImDiskDriver/sys/amd64/imdisk.sys new file mode 100644 index 0000000..4144286 Binary files /dev/null and b/src/ImDiskDriver/sys/amd64/imdisk.sys differ diff --git a/src/ImDiskDriver/sys/i386/imdisk.sys b/src/ImDiskDriver/sys/i386/imdisk.sys new file mode 100644 index 0000000..e5e6c95 Binary files /dev/null and b/src/ImDiskDriver/sys/i386/imdisk.sys differ diff --git a/src/ImDiskDriver/uninstall_imdisk.cmd b/src/ImDiskDriver/uninstall_imdisk.cmd new file mode 100644 index 0000000..8bf46ed --- /dev/null +++ b/src/ImDiskDriver/uninstall_imdisk.cmd @@ -0,0 +1,57 @@ +@echo off + +setlocal + +title ImDisk Virtual Disk Driver Uninstall + +echo ImDisk Virtual Disk Driver Uninstall +echo. + +set IMDISK_TOTAL_DEVICES=0 +set IMDISK_VALID_DEVICES=0 +set IMDISK_PENDING_REMOVAL_DEVICES=0 + +if exist "%SystemRoot%\system32\imdisk.exe" ( + for /f %%a in ('imdisk -l -n') do call :addline "%%a" +) + +if %IMDISK_VALID_DEVICES% GTR 0 ( + echo Number of existing ImDisk virtual disks: %IMDISK_VALID_DEVICES% + echo. + echo Please dismount all existing ImDisk virtual disks before uninstall! + echo. + if not "%IMDISK_SILENT_SETUP%" == "1" ( + pause + start "" "%SystemRoot%\system32\control.exe" ""%SystemRoot%\system32\imdisk.cpl" + ) + endlocal + goto :eof +) + +echo Number of existing ImDisk virtual disks: %IMDISK_TOTAL_DEVICES% +if %IMDISK_TOTAL_DEVICES% == 0 ( + "%SystemRoot%\system32\net.exe" stop imdsksvc + "%SystemRoot%\system32\net.exe" stop awealloc + "%SystemRoot%\system32\net.exe" stop imdisk + if exist "%SystemRoot%\system32\taskkill.exe" "%SystemRoot%\system32\taskkill.exe" /F /IM imdsksvc.exe +) + +start "" "%SystemRoot%\system32\rundll32.exe" setupapi.dll,InstallHinfSection DefaultUninstall 132 %SystemRoot%\inf\imdisk.inf + +endlocal + +goto :eof + +:addline + +"%SystemRoot%\system32\imdisk.exe" -l -u %~1 > nul 2>&1 + +if errorlevel 1 ( + set /a IMDISK_PENDING_REMOVAL_DEVICES=%IMDISK_PENDING_REMOVAL_DEVICES% + 1 > nul +) else ( + set /a IMDISK_VALID_DEVICES=%IMDISK_VALID_DEVICES% + 1 > nul +) + +set /a IMDISK_TOTAL_DEVICES=%IMDISK_TOTAL_DEVICES% + 1 > nul + +goto :eof