fix: use Kneron official driver installer instead of pnputil

pnputil rejects unsigned INF files ("does not contain digital signature
information"). Replace with installer_x64.exe (libwdi-based) from
Kneron SDK, which handles driver signing automatically with a
self-signed certificate.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jim800121chen 2026-03-09 22:38:27 +08:00
parent 22d6076568
commit 2ab910d5ca
5 changed files with 42 additions and 31 deletions

View File

@ -118,7 +118,8 @@ jobs:
$kpWheel = Get-ChildItem "local_service_win" -Filter "KneronPLUS*.whl" -ErrorAction SilentlyContinue | Select-Object -First 1
if ($kpWheel) { Copy-Item $kpWheel.FullName "$base\installer\payload\scripts\" }
New-Item -ItemType Directory -Force -Path "$base\installer\payload\drivers\amd64"
Copy-Item "$base\server\scripts\drivers\kneron_winusb.inf" "$base\installer\payload\drivers\"
Copy-Item "local_service_win\LocalAPI\win_driver\installer_x64.exe" "$base\installer\payload\drivers\"
Copy-Item "local_service_win\LocalAPI\win_driver\kneron_kl520.inf" "$base\installer\payload\drivers\"
Copy-Item "local_service_win\LocalAPI\win_driver\amd64\WdfCoInstaller01011.dll" "$base\installer\payload\drivers\amd64\"
Copy-Item "local_service_win\LocalAPI\win_driver\amd64\winusbcoinstaller2.dll" "$base\installer\payload\drivers\amd64\"

View File

@ -118,7 +118,8 @@ jobs:
$kpWheel = Get-ChildItem "local_service_win" -Filter "KneronPLUS*.whl" -ErrorAction SilentlyContinue | Select-Object -First 1
if ($kpWheel) { Copy-Item $kpWheel.FullName "$base\installer\payload\scripts\" }
New-Item -ItemType Directory -Force -Path "$base\installer\payload\drivers\amd64"
Copy-Item "$base\server\scripts\drivers\kneron_winusb.inf" "$base\installer\payload\drivers\"
Copy-Item "local_service_win\LocalAPI\win_driver\installer_x64.exe" "$base\installer\payload\drivers\"
Copy-Item "local_service_win\LocalAPI\win_driver\kneron_kl520.inf" "$base\installer\payload\drivers\"
Copy-Item "local_service_win\LocalAPI\win_driver\amd64\WdfCoInstaller01011.dll" "$base\installer\payload\drivers\amd64\"
Copy-Item "local_service_win\LocalAPI\win_driver\amd64\winusbcoinstaller2.dll" "$base\installer\payload\drivers\amd64\"

View File

@ -137,8 +137,9 @@ installer-payload: build-server-tray ## Stage payload files for GUI installer
fi
@# Copy WinUSB driver files (for Windows installer)
@mkdir -p installer/payload/drivers/amd64
cp server/scripts/drivers/kneron_winusb.inf installer/payload/drivers/
@if [ -d "../local_service_win/LocalAPI/win_driver/amd64" ]; then \
@if [ -d "../local_service_win/LocalAPI/win_driver" ]; then \
cp ../local_service_win/LocalAPI/win_driver/installer_x64.exe installer/payload/drivers/; \
cp ../local_service_win/LocalAPI/win_driver/kneron_kl520.inf installer/payload/drivers/; \
cp ../local_service_win/LocalAPI/win_driver/amd64/WdfCoInstaller01011.dll installer/payload/drivers/amd64/; \
cp ../local_service_win/LocalAPI/win_driver/amd64/winusbcoinstaller2.dll installer/payload/drivers/amd64/; \
echo " WinUSB driver files bundled."; \

View File

@ -86,35 +86,42 @@ func installLibusb(installDir string) error {
return nil
}
// installWinUSBDriver extracts the WinUSB driver package from the payload
// and installs it via pnputil so libusb can access Kneron USB devices.
// installWinUSBDriver extracts the Kneron driver installer from the payload
// and runs it to install the WinUSB driver for Kneron USB devices.
// The installer_x64.exe is a libwdi-based tool that handles driver signing
// automatically (self-signed certificate), which pnputil cannot do with
// unsigned INF files.
func installWinUSBDriver(installDir string) {
driverDir := filepath.Join(installDir, "drivers")
os.MkdirAll(filepath.Join(driverDir, "amd64"), 0755)
os.MkdirAll(driverDir, 0755)
// Extract driver files from embedded payload
// Extract the Kneron driver installer from payload
installerPath := filepath.Join(driverDir, "installer_x64.exe")
data, err := payloadFS.ReadFile("payload/drivers/installer_x64.exe")
if err != nil {
return // not bundled, skip
}
if err := os.WriteFile(installerPath, data, 0755); err != nil {
return
}
// Also extract the INF + co-installer files (installer_x64.exe needs them in the same directory)
driverFiles := map[string]string{
"payload/drivers/kneron_winusb.inf": filepath.Join(driverDir, "kneron_winusb.inf"),
"payload/drivers/amd64/WdfCoInstaller01011.dll": filepath.Join(driverDir, "amd64", "WdfCoInstaller01011.dll"),
"payload/drivers/amd64/winusbcoinstaller2.dll": filepath.Join(driverDir, "amd64", "winusbcoinstaller2.dll"),
"payload/drivers/kneron_kl520.inf": filepath.Join(driverDir, "kneron_kl520.inf"),
"payload/drivers/amd64/WdfCoInstaller01011.dll": filepath.Join(driverDir, "amd64", "WdfCoInstaller01011.dll"),
"payload/drivers/amd64/winusbcoinstaller2.dll": filepath.Join(driverDir, "amd64", "winusbcoinstaller2.dll"),
}
os.MkdirAll(filepath.Join(driverDir, "amd64"), 0755)
for src, dst := range driverFiles {
data, err := payloadFS.ReadFile(src)
if err != nil {
return // driver files not bundled, skip silently
}
if err := os.WriteFile(dst, data, 0644); err != nil {
return
if d, e := payloadFS.ReadFile(src); e == nil {
os.WriteFile(dst, d, 0644)
}
}
infPath := filepath.Join(driverDir, "kneron_winusb.inf")
// Use pnputil to add driver to the driver store and install on matching devices.
// This requires admin privileges; pnputil will trigger a UAC prompt if needed.
cmd := exec.Command("pnputil", "/add-driver", infPath, "/install")
cmd.CombinedOutput() // best effort — non-fatal if it fails
// Run the Kneron driver installer (libwdi-based, handles signing automatically)
cmd := exec.Command(installerPath)
cmd.Dir = driverDir
cmd.CombinedOutput() // best effort — non-fatal, may trigger UAC prompt
}
func checkLibusbInstalled() bool {

View File

@ -94,16 +94,17 @@ if ($kpWheel) {
Write-Host " KneronPLUS wheel not found, skipping." -ForegroundColor Yellow
}
# Copy WinUSB driver files
# Copy WinUSB driver files (Kneron official installer + INF + co-installers)
New-Item -ItemType Directory -Force -Path installer\payload\drivers\amd64 | Out-Null
Copy-Item server\scripts\drivers\kneron_winusb.inf installer\payload\drivers\
$winDriverDir = Join-Path $repoRoot "local_service_win\LocalAPI\win_driver\amd64"
if (Test-Path $winDriverDir) {
Copy-Item (Join-Path $winDriverDir "WdfCoInstaller01011.dll") installer\payload\drivers\amd64\
Copy-Item (Join-Path $winDriverDir "winusbcoinstaller2.dll") installer\payload\drivers\amd64\
$winDriverBase = Join-Path $repoRoot "local_service_win\LocalAPI\win_driver"
if (Test-Path $winDriverBase) {
Copy-Item (Join-Path $winDriverBase "installer_x64.exe") installer\payload\drivers\
Copy-Item (Join-Path $winDriverBase "kneron_kl520.inf") installer\payload\drivers\
Copy-Item (Join-Path $winDriverBase "amd64\WdfCoInstaller01011.dll") installer\payload\drivers\amd64\
Copy-Item (Join-Path $winDriverBase "amd64\winusbcoinstaller2.dll") installer\payload\drivers\amd64\
Write-Host " WinUSB driver files bundled." -ForegroundColor Green
} else {
Write-Host " WinUSB co-installer DLLs not found, skipping." -ForegroundColor Yellow
Write-Host " WinUSB driver files not found, skipping." -ForegroundColor Yellow
}
$fileCount = (Get-ChildItem -Recurse installer\payload -File).Count