From a4d920b7fbdbbed4885240cd8c79b3bb0fb44fad Mon Sep 17 00:00:00 2001 From: JusterZhu Date: Wed, 3 Jun 2026 14:37:51 +0800 Subject: [PATCH] feat(Samples): replace DrivelutionSample with directory-scan quick-install sample - Add ImDiskQuickInstallSample: scans bundle driver directory and installs via cascading methods (DiInstallDriver -> InstallHinfSection -> PnPUtil) - Bundle ImDisk driver files at src/ImDiskDriver/ for offline install demo - Remove old DrivelutionSample (replaced by the new sample at Index 8) - Drivelution APIs used: GetDriversFromDirectoryAsync, ValidateAsync Co-Authored-By: Claude Opus 4.8 --- src/Hub/Samples/DrivelutionSample.cs | 249 --------------- src/Hub/Samples/ImDiskQuickInstallSample.cs | 178 +++++++++++ src/ImDiskDriver/awealloc/amd64/awealloc.sys | Bin 0 -> 36304 bytes src/ImDiskDriver/awealloc/i386/awealloc.sys | Bin 0 -> 32720 bytes src/ImDiskDriver/cli/amd64/imdisk.exe | Bin 0 -> 66048 bytes src/ImDiskDriver/cli/i386/imdisk.exe | Bin 0 -> 66048 bytes src/ImDiskDriver/cpl/amd64/imdisk.cpl | Bin 0 -> 140296 bytes src/ImDiskDriver/cpl/i386/imdisk.cpl | Bin 0 -> 128016 bytes src/ImDiskDriver/deviodrv/amd64/deviodrv.sys | Bin 0 -> 38376 bytes src/ImDiskDriver/deviodrv/i386/deviodrv.sys | Bin 0 -> 34152 bytes src/ImDiskDriver/imdisk.inf | 302 +++++++++++++++++++ src/ImDiskDriver/install.cmd | 87 ++++++ src/ImDiskDriver/msgboxw.exe | Bin 0 -> 10856 bytes src/ImDiskDriver/runwaitw.exe | Bin 0 -> 16360 bytes src/ImDiskDriver/svc/amd64/imdsksvc.exe | Bin 0 -> 34320 bytes src/ImDiskDriver/svc/i386/imdsksvc.exe | Bin 0 -> 32776 bytes src/ImDiskDriver/sys/amd64/imdisk.sys | Bin 0 -> 63976 bytes src/ImDiskDriver/sys/i386/imdisk.sys | Bin 0 -> 55640 bytes src/ImDiskDriver/uninstall_imdisk.cmd | 57 ++++ 19 files changed, 624 insertions(+), 249 deletions(-) delete mode 100644 src/Hub/Samples/DrivelutionSample.cs create mode 100644 src/Hub/Samples/ImDiskQuickInstallSample.cs create mode 100644 src/ImDiskDriver/awealloc/amd64/awealloc.sys create mode 100644 src/ImDiskDriver/awealloc/i386/awealloc.sys create mode 100644 src/ImDiskDriver/cli/amd64/imdisk.exe create mode 100644 src/ImDiskDriver/cli/i386/imdisk.exe create mode 100644 src/ImDiskDriver/cpl/amd64/imdisk.cpl create mode 100644 src/ImDiskDriver/cpl/i386/imdisk.cpl create mode 100644 src/ImDiskDriver/deviodrv/amd64/deviodrv.sys create mode 100644 src/ImDiskDriver/deviodrv/i386/deviodrv.sys create mode 100644 src/ImDiskDriver/imdisk.inf create mode 100644 src/ImDiskDriver/install.cmd create mode 100644 src/ImDiskDriver/msgboxw.exe create mode 100644 src/ImDiskDriver/runwaitw.exe create mode 100644 src/ImDiskDriver/svc/amd64/imdsksvc.exe create mode 100644 src/ImDiskDriver/svc/i386/imdsksvc.exe create mode 100644 src/ImDiskDriver/sys/amd64/imdisk.sys create mode 100644 src/ImDiskDriver/sys/i386/imdisk.sys create mode 100644 src/ImDiskDriver/uninstall_imdisk.cmd 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 0000000000000000000000000000000000000000..82ee3fd1be515fc72e6ac8f1187cbc7338c81891 GIT binary patch literal 36304 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