install.ps1 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. $SolutionRoot = Split-Path -Parent $ScriptDir
  9. Write-Host '=== CommModifyKit 安装脚本 ===' -ForegroundColor Cyan
  10. Write-Host "脚本目录: $ScriptDir"
  11. Write-Host "项目根目录: $SolutionRoot"
  12. Write-Host ""
  13. # ============================================================================
  14. # 1. 查找构建产物
  15. # ============================================================================
  16. $DriverSysCandidates = @(
  17. Join-Path $SolutionRoot "build\Release\x64\CommModifyKit.sys"
  18. Join-Path $SolutionRoot "build\Debug\x64\CommModifyKit.sys"
  19. Join-Path $ScriptDir "CommModifyKit.sys"
  20. )
  21. $DriverInfCandidates = @(
  22. Join-Path $SolutionRoot "build\Release\x64\CommModifyKit.inf"
  23. Join-Path $SolutionRoot "build\Debug\x64\CommModifyKit.inf"
  24. Join-Path $ScriptDir "..\driver\CommModifyKit.inf"
  25. Join-Path $ScriptDir "CommModifyKit.inf"
  26. )
  27. $DllCandidates = @(
  28. Join-Path $SolutionRoot "build\Release\Win32\CommModifyKit.dll"
  29. Join-Path $SolutionRoot "build\Debug\Win32\CommModifyKit.dll"
  30. Join-Path $SolutionRoot "build\Release\x64\CommModifyKit.dll"
  31. Join-Path $SolutionRoot "build\Debug\x64\CommModifyKit.dll"
  32. )
  33. $DriverSys = $DriverSysCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
  34. $DriverInf = $DriverInfCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
  35. $DllPath = $DllCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
  36. if (-not $DriverSys) {
  37. Write-Error "未找到 CommModifyKit.sys,请先用 WDK + VS2019 编译 driver 项目"
  38. exit 1
  39. }
  40. if (-not $DriverInf) {
  41. Write-Error "未找到 CommModifyKit.inf"
  42. exit 1
  43. }
  44. Write-Host "驱动 .sys: $DriverSys" -ForegroundColor Green
  45. Write-Host "驱动 .inf: $DriverInf" -ForegroundColor Green
  46. if ($DllPath) {
  47. Write-Host "用户态 DLL: $DllPath" -ForegroundColor Green
  48. } else {
  49. Write-Warning "未找到 CommModifyKit.dll(可后续单独编译 dll 项目)"
  50. }
  51. Write-Host ""
  52. # ============================================================================
  53. # 2. 拷贝驱动文件到 System32\drivers
  54. # ============================================================================
  55. $TargetDriverDir = Join-Path $env:windir "System32\drivers"
  56. $TargetDriverSys = Join-Path $TargetDriverDir "CommModifyKit.sys"
  57. $TargetDriverInf = Join-Path $TargetDriverDir "CommModifyKit.inf"
  58. Write-Host "拷贝驱动文件到 $TargetDriverDir ..."
  59. Copy-Item -Force $DriverSys $TargetDriverSys
  60. Copy-Item -Force $DriverInf $TargetDriverInf
  61. Write-Host " 完成" -ForegroundColor Green
  62. # ============================================================================
  63. # 3. 创建并启动驱动服务
  64. # ============================================================================
  65. $ServiceName = 'CommModifyKit'
  66. $ExistingService = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
  67. if ($ExistingService) {
  68. Write-Host "服务 $ServiceName 已存在,状态: $($ExistingService.Status)"
  69. if ($ExistingService.Status -ne 'Running') {
  70. Write-Host "启动服务..."
  71. Start-Service -Name $ServiceName
  72. Write-Host " 完成" -ForegroundColor Green
  73. }
  74. } else {
  75. Write-Host "创建服务 $ServiceName ..."
  76. sc.exe create $ServiceName binPath= $TargetDriverSys type= kernel start= demand error= normal | Out-Null
  77. Write-Host " 完成" -ForegroundColor Green
  78. Write-Host "启动服务..."
  79. sc.exe start $ServiceName | Out-Null
  80. Write-Host " 完成" -ForegroundColor Green
  81. }
  82. # ============================================================================
  83. # 4. 拷贝 DLL 到 CommModifyService 输出目录(如果检测到)
  84. # ============================================================================
  85. if ($DllPath) {
  86. $ServiceExeCandidates = @(
  87. Join-Path $SolutionRoot "..\CommModifyService\x64\Release\CommModifyService.exe"
  88. Join-Path $SolutionRoot "..\CommModifyService\Win32\Release\CommModifyService.exe"
  89. Join-Path $SolutionRoot "..\CommModifyService\x64\Debug\CommModifyService.exe"
  90. Join-Path $SolutionRoot "..\CommModifyService\Win32\Debug\CommModifyService.exe"
  91. )
  92. $ServiceExe = $ServiceExeCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
  93. if ($ServiceExe) {
  94. $ServiceDir = Split-Path -Parent $ServiceExe
  95. $TargetDll = Join-Path $ServiceDir "CommModifyKit.dll"
  96. Write-Host "拷贝 DLL 到 $TargetDll ..."
  97. Copy-Item -Force $DllPath $TargetDll
  98. Write-Host " 完成" -ForegroundColor Green
  99. } else {
  100. Write-Warning "未检测到 CommModifyService.exe,请手动拷贝 CommModifyKit.dll 到其目录"
  101. }
  102. }
  103. # ============================================================================
  104. # 5. 启用测试签名(开发期需要)
  105. # ============================================================================
  106. $TestSigningEnabled = (bcdedit /enum | Select-String 'testsigning' -Quiet)
  107. if (-not $TestSigningEnabled) {
  108. Write-Host ""
  109. Write-Warning "检测到测试签名未启用,驱动可能无法加载"
  110. Write-Host "执行: bcdedit /set testsigning on" -ForegroundColor Yellow
  111. bcdedit /set testsigning on | Out-Null
  112. Write-Warning "测试签名已启用,需要重启计算机才能生效"
  113. } else {
  114. Write-Host "测试签名已启用" -ForegroundColor Green
  115. }
  116. Write-Host ""
  117. Write-Host '=== 安装完成 ===' -ForegroundColor Cyan
  118. Write-Host "请确认:"
  119. Write-Host " 1. 计算机已重启(启用测试签名后)"
  120. Write-Host " 2. CommModifyKit.dll 已拷贝到 CommModifyService.exe 所在目录"
  121. Write-Host " 3. config.json 中 'comm.use_dll' 设为 true"