| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- # 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"
|