usb-server/internal/usbip/vhci_windows.go

80 lines
2.3 KiB
Go

//go:build windows
package usbip
import (
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
)
// FindUsbipExe locates the usbip.exe binary from usbip-win2.
// Checks PATH first, then the standard installation directory.
func FindUsbipExe() (string, error) {
// Check PATH
if path, err := exec.LookPath("usbip"); err == nil {
return path, nil
}
// Check standard installation path
standardPath := filepath.Join(os.Getenv("ProgramFiles"), "USBip", "usbip.exe")
if _, err := os.Stat(standardPath); err == nil {
return standardPath, nil
}
// Check x86 program files too
x86Path := filepath.Join(os.Getenv("ProgramFiles(x86)"), "USBip", "usbip.exe")
if _, err := os.Stat(x86Path); err == nil {
return x86Path, nil
}
return "", fmt.Errorf("usbip.exe nicht gefunden. Bitte usbip-win2 installieren: https://github.com/vadimgrn/usbip-win2/releases")
}
// IsVHCIAvailable checks if usbip-win2 is installed
func IsVHCIAvailable() bool {
_, err := FindUsbipExe()
return err == nil
}
// VHCIUnavailableError returns an error describing why VHCI is not available,
// or nil if usbip-win2 is installed and ready.
func VHCIUnavailableError() error {
if IsVHCIAvailable() {
return nil
}
return fmt.Errorf("usbip-win2 nicht installiert. Der Use-Modus benoetigt den usbip-win2 VHCI-Treiber. Download: https://github.com/vadimgrn/usbip-win2/releases")
}
// DetachDevice detaches a device from the VHCI driver using usbip.exe
func DetachDevice(port int) error {
usbipExe, err := FindUsbipExe()
if err != nil {
return err
}
cmd := exec.Command(usbipExe, "detach", "-p", fmt.Sprintf("%d", port))
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("usbip detach failed: %w (output: %s)", err, strings.TrimSpace(string(output)))
}
log.Printf("[vhci-win] detached port %d", port)
return nil
}
// FindFreePort is not used on Windows (usbip.exe selects the port automatically).
// Signature required for cross-platform compilation.
func FindFreePort(speed uint32) (int, error) {
return -1, fmt.Errorf("not used on Windows - usbip.exe selects port automatically")
}
// AttachDevice is not used on Windows (usbip.exe handles attachment).
// Signature required for cross-platform compilation.
func AttachDevice(port int, sockfd int, devID uint32, speed uint32) error {
return fmt.Errorf("not used on Windows - use createVHCIAttachment instead")
}