From 8f739138170c6db1081fd10fd6ecbb9bb7c0455f Mon Sep 17 00:00:00 2001 From: Stu Leak Date: Sun, 28 Dec 2025 19:32:15 -0500 Subject: [PATCH] fix(windows): Hide command windows in hardware detection and fix GPU detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issues Fixed: 1. Command Prompts During Benchmark - Jake reported 4 command prompt windows appearing when opening benchmark - Windows showing: C:\ffmpeg\bin\ffmpeg.exe for each hardware check 2. Wrong GPU Detection - Jake's AMD R7 900 XTX not detected - System incorrectly showing "13.50.53.699 Virtual Desktop" as GPU - Showing "Monitor" instead of actual graphics card Root Causes: 1. sysinfo package missing ApplyNoWindow() on Windows detection commands - detectCPUWindows: wmic cpu query - detectGPUWindows: nvidia-smi + wmic VideoController queries - detectRAMWindows: wmic computersystem query - These 3-4 calls showed command windows 2. GPU Detection Not Filtering Virtual Adapters - wmic returns ALL video controllers (physical + virtual) - Code was picking first entry which was virtual adapter - No filtering for "Virtual Desktop", remote desktop adapters, etc. Solutions: 1. Applied utils.ApplyNoWindow() to all Windows detection commands - Hides wmic, nvidia-smi command windows - Consistent with benchmark.go and platform.go patterns - No-op on Linux/macOS (cross-platform safe) 2. Enhanced GPU Detection with Virtual Adapter Filtering - Iterate through ALL video controllers from wmic - Filter out virtual/software adapters: * Virtual Desktop adapters * Microsoft Basic Display Adapter * Remote desktop (VNC, Parsec, TeamViewer) - Return first physical GPU (AMD/NVIDIA/Intel) - Debug logging shows skipped virtual adapters Implementation: - Import internal/utils in sysinfo package - ApplyNoWindow() on 4 Windows commands: * wmic cpu get name,maxclockspeed * nvidia-smi --query-gpu=name,driver_version * wmic path win32_VideoController get name,driverversion * wmic computersystem get totalphysicalmemory - Enhanced GPU parser with virtual adapter blacklist - Debug logging for skipped/detected GPUs Impact: - No command windows during benchmark initialization (discreet operation) - Correct physical GPU detection on systems with virtual adapters - Should properly detect Jake's AMD R7 900 XTX Files Changed: - internal/sysinfo/sysinfo.go: ApplyNoWindow + GPU filtering Reported-by: Jake (4 command prompts, wrong GPU detection) Tested-on: Linux (build successful, no regressions) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- internal/sysinfo/sysinfo.go | 48 +++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/internal/sysinfo/sysinfo.go b/internal/sysinfo/sysinfo.go index a6e31ab..df5eeb3 100644 --- a/internal/sysinfo/sysinfo.go +++ b/internal/sysinfo/sysinfo.go @@ -9,6 +9,7 @@ import ( "strings" "git.leaktechnologies.dev/stu/VideoTools/internal/logging" + "git.leaktechnologies.dev/stu/VideoTools/internal/utils" ) // HardwareInfo contains system hardware information @@ -103,6 +104,7 @@ func detectCPULinux() (model, mhz string) { func detectCPUWindows() (model, mhz string) { // Use wmic to get CPU info cmd := exec.Command("wmic", "cpu", "get", "name,maxclockspeed") + utils.ApplyNoWindow(cmd) // Hide command window on Windows output, err := cmd.Output() if err != nil { logging.Debug(logging.CatSystem, "failed to run wmic cpu: %v", err) @@ -208,6 +210,7 @@ func detectGPULinux() (model, driver string) { func detectGPUWindows() (model, driver string) { // Use nvidia-smi if available (NVIDIA GPUs) cmd := exec.Command("nvidia-smi", "--query-gpu=name,driver_version", "--format=csv,noheader") + utils.ApplyNoWindow(cmd) // Hide command window on Windows output, err := cmd.Output() if err == nil { parts := strings.Split(strings.TrimSpace(string(output)), ",") @@ -220,21 +223,41 @@ func detectGPUWindows() (model, driver string) { // Try wmic for generic GPU info cmd = exec.Command("wmic", "path", "win32_VideoController", "get", "name,driverversion") + utils.ApplyNoWindow(cmd) // Hide command window on Windows output, err = cmd.Output() if err == nil { lines := strings.Split(string(output), "\n") - if len(lines) >= 2 { - // Skip header, get first GPU - line := strings.TrimSpace(lines[1]) - if line != "" { - // Parse: Name DriverVersion - re := regexp.MustCompile(`^(.+?)\s+(\S+)$`) - matches := re.FindStringSubmatch(line) - if len(matches) == 3 { - model = strings.TrimSpace(matches[1]) - driver = strings.TrimSpace(matches[2]) - return model, driver - } + // Iterate through all video controllers, skip virtual/non-physical adapters + for i, line := range lines { + if i == 0 { // Skip header + continue + } + line = strings.TrimSpace(line) + if line == "" { + continue + } + + // Filter out virtual/software adapters + lineLower := strings.ToLower(line) + if strings.Contains(lineLower, "virtual") || + strings.Contains(lineLower, "microsoft basic") || + strings.Contains(lineLower, "remote") || + strings.Contains(lineLower, "vnc") || + strings.Contains(lineLower, "parsec") || + strings.Contains(lineLower, "teamviewer") { + logging.Debug(logging.CatSystem, "skipping virtual GPU: %s", line) + continue + } + + // Parse: Name DriverVersion + // Use flexible regex to handle varying whitespace + re := regexp.MustCompile(`^(.+?)\s+(\S+)$`) + matches := re.FindStringSubmatch(line) + if len(matches) == 3 { + model = strings.TrimSpace(matches[1]) + driver = strings.TrimSpace(matches[2]) + logging.Debug(logging.CatSystem, "detected physical GPU: %s (driver: %s)", model, driver) + return model, driver } } } @@ -316,6 +339,7 @@ func detectRAMLinux() (readable string, mb uint64) { func detectRAMWindows() (readable string, mb uint64) { cmd := exec.Command("wmic", "computersystem", "get", "totalphysicalmemory") + utils.ApplyNoWindow(cmd) // Hide command window on Windows output, err := cmd.Output() if err != nil { logging.Debug(logging.CatSystem, "failed to run wmic computersystem: %v", err)