80 lines
2.3 KiB
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")
|
|
}
|