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:
parent
22d6076568
commit
2ab910d5ca
@ -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\"
|
||||
|
||||
|
||||
3
.github/workflows/build-installer.yaml
vendored
3
.github/workflows/build-installer.yaml
vendored
@ -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\"
|
||||
|
||||
|
||||
@ -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."; \
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user