install.ps1 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. # install.ps1 - CommModifyKit 驱动 + CommModifyKit.dll 安装脚本
  2. # 必须以管理员权限运行
  3. # 用法:以管理员身份打开 PowerShell,执行 .\install.ps1
  4. #Requires -Version 5.1
  5. #Requires -RunAsAdministrator
  6. $ErrorActionPreference = 'Stop'
  7. $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
  8. Write-Host '=== CommModifyKit 安装脚本 ===' -ForegroundColor Cyan
  9. Write-Host "脚本目录: $ScriptDir"
  10. Write-Host ""
  11. # ============================================================================
  12. # 1. 查找构建产物
  13. # 发布包场景:所有文件与脚本同目录
  14. # 开发场景:脚本在 installer\ 子目录,需回退到上级
  15. # ============================================================================
  16. $DriverSysCandidates = @(
  17. Join-Path $ScriptDir "CommModifyKit.sys"
  18. Join-Path $ScriptDir "..\build\Release\x64\CommModifyKit.sys"
  19. Join-Path $ScriptDir "..\build\Debug\x64\CommModifyKit.sys"
  20. Join-Path $ScriptDir "..\driver\build\Release\x64\CommModifyKit.sys"
  21. Join-Path $ScriptDir "..\driver\build\Debug\x64\CommModifyKit.sys"
  22. )
  23. $DriverInfCandidates = @(
  24. Join-Path $ScriptDir "CommModifyKit.inf"
  25. Join-Path $ScriptDir "..\driver\CommModifyKit.inf"
  26. Join-Path $ScriptDir "..\build\Release\x64\CommModifyKit.inf"
  27. Join-Path $ScriptDir "..\build\Debug\x64\CommModifyKit.inf"
  28. Join-Path $ScriptDir "..\driver\build\Release\x64\CommModifyKit.inf"
  29. Join-Path $ScriptDir "..\driver\build\Debug\x64\CommModifyKit.inf"
  30. )
  31. $DllCandidates = @(
  32. Join-Path $ScriptDir "CommModifyKit.dll"
  33. Join-Path $ScriptDir "..\build\Release\Win32\CommModifyKit.dll"
  34. Join-Path $ScriptDir "..\build\Debug\Win32\CommModifyKit.dll"
  35. Join-Path $ScriptDir "..\build\Release\x64\CommModifyKit.dll"
  36. Join-Path $ScriptDir "..\build\Debug\x64\CommModifyKit.dll"
  37. )
  38. $DriverSys = $DriverSysCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
  39. $DriverInf = $DriverInfCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
  40. $DllPath = $DllCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
  41. if (-not $DriverSys) {
  42. Write-Error "未找到 CommModifyKit.sys,请先用 WDK + VS2019 编译 driver 项目"
  43. exit 1
  44. }
  45. if (-not $DriverInf) {
  46. Write-Error "未找到 CommModifyKit.inf"
  47. exit 1
  48. }
  49. Write-Host "驱动 .sys: $DriverSys" -ForegroundColor Green
  50. Write-Host "驱动 .inf: $DriverInf" -ForegroundColor Green
  51. if ($DllPath) {
  52. Write-Host "用户态 DLL: $DllPath" -ForegroundColor Green
  53. } else {
  54. Write-Warning "未找到 CommModifyKit.dll(可后续单独编译 dll 项目)"
  55. }
  56. Write-Host ""
  57. # ============================================================================
  58. # 2. 拷贝驱动文件到 System32\drivers
  59. # ============================================================================
  60. $TargetDriverDir = Join-Path $env:windir "System32\drivers"
  61. $TargetDriverSys = Join-Path $TargetDriverDir "CommModifyKit.sys"
  62. $TargetDriverInf = Join-Path $TargetDriverDir "CommModifyKit.inf"
  63. Write-Host "拷贝驱动文件到 $TargetDriverDir ..."
  64. Copy-Item -Force $DriverSys $TargetDriverSys
  65. Copy-Item -Force $DriverInf $TargetDriverInf
  66. Write-Host " 完成" -ForegroundColor Green
  67. # ============================================================================
  68. # 3. 创建并启动驱动服务
  69. # ============================================================================
  70. $ServiceName = 'CommModifyKit'
  71. $ExistingService = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
  72. if ($ExistingService) {
  73. Write-Host "服务 $ServiceName 已存在,状态: $($ExistingService.Status)"
  74. if ($ExistingService.Status -ne 'Running') {
  75. Write-Host "启动服务..."
  76. Start-Service -Name $ServiceName
  77. Write-Host " 完成" -ForegroundColor Green
  78. }
  79. } else {
  80. Write-Host "创建服务 $ServiceName ..."
  81. sc.exe create $ServiceName binPath= $TargetDriverSys type= kernel start= demand error= normal | Out-Null
  82. Write-Host " 完成" -ForegroundColor Green
  83. Write-Host "启动服务..."
  84. sc.exe start $ServiceName | Out-Null
  85. Write-Host " 完成" -ForegroundColor Green
  86. }
  87. # ============================================================================
  88. # 3.5 注册为 Ports 类 UpperFilters
  89. # ============================================================================
  90. $PortsClassGuid = "{4D36E978-E325-11CE-BFC1-08002BE10318}"
  91. $ClassKey = "HKLM:\SYSTEM\CurrentControlSet\Control\Class\$PortsClassGuid"
  92. $currentFilters = @()
  93. $existingFilters = (Get-ItemProperty -Path $ClassKey -Name "UpperFilters" -ErrorAction SilentlyContinue)
  94. if ($existingFilters) {
  95. $currentFilters = @($existingFilters.UpperFilters)
  96. }
  97. if ($currentFilters -notcontains "CommModifyKit") {
  98. $newFilters = @($currentFilters) + "CommModifyKit"
  99. Set-ItemProperty -Path $ClassKey -Name "UpperFilters" -Value $newFilters -Type MultiString
  100. Write-Host "已将 CommModifyKit 添加到 Ports 类 UpperFilters" -ForegroundColor Green
  101. # 重新枚举设备使 UpperFilter 生效
  102. pnputil /scan-devices | Out-Null
  103. Write-Host "已触发设备重新枚举" -ForegroundColor Green
  104. } else {
  105. Write-Host "CommModifyKit 已在 UpperFilters 中" -ForegroundColor Green
  106. }
  107. # ============================================================================
  108. # 4. 拷贝 DLL 到 CommModifyService 输出目录(如果检测到)
  109. # ============================================================================
  110. if ($DllPath) {
  111. $ServiceExeCandidates = @(
  112. Join-Path $ScriptDir "CommModifyService.exe"
  113. Join-Path $ScriptDir "..\CommModifyService\x64\Release\CommModifyService.exe"
  114. Join-Path $ScriptDir "..\CommModifyService\Win32\Release\CommModifyService.exe"
  115. Join-Path $ScriptDir "..\CommModifyService\x64\Debug\CommModifyService.exe"
  116. Join-Path $ScriptDir "..\CommModifyService\Win32\Debug\CommModifyService.exe"
  117. )
  118. $ServiceExe = $ServiceExeCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
  119. if ($ServiceExe) {
  120. $ServiceDir = Split-Path -Parent $ServiceExe
  121. $TargetDll = Join-Path $ServiceDir "CommModifyKit.dll"
  122. if ((Resolve-Path $DllPath -ErrorAction SilentlyContinue).Path -eq (Resolve-Path $TargetDll -ErrorAction SilentlyContinue).Path) {
  123. Write-Host "DLL 已在目标目录,跳过拷贝" -ForegroundColor Green
  124. } else {
  125. Write-Host "拷贝 DLL 到 $TargetDll ..."
  126. Copy-Item -Force $DllPath $TargetDll
  127. Write-Host " 完成" -ForegroundColor Green
  128. }
  129. } else {
  130. Write-Warning "未检测到 CommModifyService.exe,请手动拷贝 CommModifyKit.dll 到其目录"
  131. }
  132. }
  133. # ============================================================================
  134. # 5. 启用测试签名(开发期需要)
  135. # ============================================================================
  136. $TestSigningEnabled = (bcdedit /enum | Select-String 'testsigning' -Quiet)
  137. if (-not $TestSigningEnabled) {
  138. Write-Host ""
  139. Write-Warning "检测到测试签名未启用,驱动可能无法加载"
  140. Write-Host "执行: bcdedit /set testsigning on" -ForegroundColor Yellow
  141. bcdedit /set testsigning on | Out-Null
  142. Write-Warning "测试签名已启用,需要重启计算机才能生效"
  143. } else {
  144. Write-Host "测试签名已启用" -ForegroundColor Green
  145. }
  146. Write-Host ""
  147. Write-Host '=== 安装完成 ===' -ForegroundColor Cyan
  148. Write-Host "请确认:"
  149. Write-Host " 1. 计算机已重启(启用测试签名后)"
  150. Write-Host " 2. CommModifyKit.dll 已拷贝到 CommModifyService.exe 所在目录"
  151. Write-Host " 3. config.json 中 'comm.use_dll' 设为 true"