# install.ps1 - CommModifyKit 驱动 + CommModifyKit.dll 安装脚本 # 必须以管理员权限运行 # 用法:以管理员身份打开 PowerShell,执行 .\install.ps1 #Requires -Version 5.1 #Requires -RunAsAdministrator $ErrorActionPreference = 'Stop' $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path Write-Host '=== CommModifyKit 安装脚本 ===' -ForegroundColor Cyan Write-Host "脚本目录: $ScriptDir" Write-Host "" # ============================================================================ # 1. 查找构建产物 # 发布包场景:所有文件与脚本同目录 # 开发场景:脚本在 installer\ 子目录,需回退到上级 # ============================================================================ $DriverSysCandidates = @( Join-Path $ScriptDir "CommModifyKit.sys" Join-Path $ScriptDir "..\build\Release\x64\CommModifyKit.sys" Join-Path $ScriptDir "..\build\Debug\x64\CommModifyKit.sys" Join-Path $ScriptDir "..\driver\build\Release\x64\CommModifyKit.sys" Join-Path $ScriptDir "..\driver\build\Debug\x64\CommModifyKit.sys" ) $DriverInfCandidates = @( Join-Path $ScriptDir "CommModifyKit.inf" Join-Path $ScriptDir "..\driver\CommModifyKit.inf" Join-Path $ScriptDir "..\build\Release\x64\CommModifyKit.inf" Join-Path $ScriptDir "..\build\Debug\x64\CommModifyKit.inf" Join-Path $ScriptDir "..\driver\build\Release\x64\CommModifyKit.inf" Join-Path $ScriptDir "..\driver\build\Debug\x64\CommModifyKit.inf" ) $DllCandidates = @( Join-Path $ScriptDir "CommModifyKit.dll" Join-Path $ScriptDir "..\build\Release\Win32\CommModifyKit.dll" Join-Path $ScriptDir "..\build\Debug\Win32\CommModifyKit.dll" Join-Path $ScriptDir "..\build\Release\x64\CommModifyKit.dll" Join-Path $ScriptDir "..\build\Debug\x64\CommModifyKit.dll" ) $DriverSys = $DriverSysCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1 $DriverInf = $DriverInfCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1 $DllPath = $DllCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1 if (-not $DriverSys) { Write-Error "未找到 CommModifyKit.sys,请先用 WDK + VS2019 编译 driver 项目" exit 1 } if (-not $DriverInf) { Write-Error "未找到 CommModifyKit.inf" exit 1 } Write-Host "驱动 .sys: $DriverSys" -ForegroundColor Green Write-Host "驱动 .inf: $DriverInf" -ForegroundColor Green if ($DllPath) { Write-Host "用户态 DLL: $DllPath" -ForegroundColor Green } else { Write-Warning "未找到 CommModifyKit.dll(可后续单独编译 dll 项目)" } Write-Host "" # ============================================================================ # 2. 拷贝驱动文件到 System32\drivers # ============================================================================ $TargetDriverDir = Join-Path $env:windir "System32\drivers" $TargetDriverSys = Join-Path $TargetDriverDir "CommModifyKit.sys" $TargetDriverInf = Join-Path $TargetDriverDir "CommModifyKit.inf" Write-Host "拷贝驱动文件到 $TargetDriverDir ..." Copy-Item -Force $DriverSys $TargetDriverSys Copy-Item -Force $DriverInf $TargetDriverInf Write-Host " 完成" -ForegroundColor Green # ============================================================================ # 3. 创建并启动驱动服务 # ============================================================================ $ServiceName = 'CommModifyKit' $ExistingService = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue if ($ExistingService) { Write-Host "服务 $ServiceName 已存在,状态: $($ExistingService.Status)" if ($ExistingService.Status -ne 'Running') { Write-Host "启动服务..." Start-Service -Name $ServiceName Write-Host " 完成" -ForegroundColor Green } } else { Write-Host "创建服务 $ServiceName ..." sc.exe create $ServiceName binPath= $TargetDriverSys type= kernel start= demand error= normal | Out-Null Write-Host " 完成" -ForegroundColor Green Write-Host "启动服务..." sc.exe start $ServiceName | Out-Null Write-Host " 完成" -ForegroundColor Green } # ============================================================================ # 3.5 注册为 Ports 类 UpperFilters # ============================================================================ $PortsClassGuid = "{4D36E978-E325-11CE-BFC1-08002BE10318}" $ClassKey = "HKLM:\SYSTEM\CurrentControlSet\Control\Class\$PortsClassGuid" $currentFilters = @() $existingFilters = (Get-ItemProperty -Path $ClassKey -Name "UpperFilters" -ErrorAction SilentlyContinue) if ($existingFilters) { $currentFilters = @($existingFilters.UpperFilters) } if ($currentFilters -notcontains "CommModifyKit") { $newFilters = @($currentFilters) + "CommModifyKit" Set-ItemProperty -Path $ClassKey -Name "UpperFilters" -Value $newFilters -Type MultiString Write-Host "已将 CommModifyKit 添加到 Ports 类 UpperFilters" -ForegroundColor Green # 重新枚举设备使 UpperFilter 生效 pnputil /scan-devices | Out-Null Write-Host "已触发设备重新枚举" -ForegroundColor Green } else { Write-Host "CommModifyKit 已在 UpperFilters 中" -ForegroundColor Green } # ============================================================================ # 4. 拷贝 DLL 到 CommModifyService 输出目录(如果检测到) # ============================================================================ if ($DllPath) { $ServiceExeCandidates = @( Join-Path $ScriptDir "CommModifyService.exe" Join-Path $ScriptDir "..\CommModifyService\x64\Release\CommModifyService.exe" Join-Path $ScriptDir "..\CommModifyService\Win32\Release\CommModifyService.exe" Join-Path $ScriptDir "..\CommModifyService\x64\Debug\CommModifyService.exe" Join-Path $ScriptDir "..\CommModifyService\Win32\Debug\CommModifyService.exe" ) $ServiceExe = $ServiceExeCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1 if ($ServiceExe) { $ServiceDir = Split-Path -Parent $ServiceExe $TargetDll = Join-Path $ServiceDir "CommModifyKit.dll" if ((Resolve-Path $DllPath -ErrorAction SilentlyContinue).Path -eq (Resolve-Path $TargetDll -ErrorAction SilentlyContinue).Path) { Write-Host "DLL 已在目标目录,跳过拷贝" -ForegroundColor Green } else { Write-Host "拷贝 DLL 到 $TargetDll ..." Copy-Item -Force $DllPath $TargetDll Write-Host " 完成" -ForegroundColor Green } } else { Write-Warning "未检测到 CommModifyService.exe,请手动拷贝 CommModifyKit.dll 到其目录" } } # ============================================================================ # 5. 启用测试签名(开发期需要) # ============================================================================ $TestSigningEnabled = (bcdedit /enum | Select-String 'testsigning' -Quiet) if (-not $TestSigningEnabled) { Write-Host "" Write-Warning "检测到测试签名未启用,驱动可能无法加载" Write-Host "执行: bcdedit /set testsigning on" -ForegroundColor Yellow bcdedit /set testsigning on | Out-Null Write-Warning "测试签名已启用,需要重启计算机才能生效" } else { Write-Host "测试签名已启用" -ForegroundColor Green } Write-Host "" Write-Host '=== 安装完成 ===' -ForegroundColor Cyan Write-Host "请确认:" Write-Host " 1. 计算机已重启(启用测试签名后)" Write-Host " 2. CommModifyKit.dll 已拷贝到 CommModifyService.exe 所在目录" Write-Host " 3. config.json 中 'comm.use_dll' 设为 true"