You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Rewrote Test-NetworkSpeed as curl.exe (primary) -> BITS -> IWR cascade
for native TLS 1.3 support; resolves systematic failures under Mullvad/VPN
- Replaced retired speed.hetzner.de with speedtest.tele2.net/10MB.zip
- Added PNWC ASCII startup banner with Clear-Host and version/contact header
- Added Invoke-GPUToolDownload function for MSI Afterburner and FurMark
- Batch: GPU Tools Manager Option 5 triggers automated tool downloads;
moved all download logic to PS1 to fix delayed-expansion parser errors
- Fixed WHEA false positive: Level 4 informational events now excluded
- Fixed disk performance regex: split multiline .* into two separate matches
- Fixed battery false positive on desktops: narrowed match to Battery colon space
- Fixed Wi-Fi NIC false positive: added Wi-Fi/Wireless/WLAN to exclusion list
- Fixed SMART: added Unhealthy to HealthStatus pattern
- Fixed Windows Update: consolidated duplicate check blocks; added 1-5 branch
- Updated README and CHANGELOG for v2.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-**PNWC Startup Banner**: Branded ASCII art header (`###### ## ## ## ## ######`) painted on launch with `Clear-Host` first to eliminate PowerShell startup noise. Shows version, contact, capability summary, timestamp, computer name, and drive. Pure 7-bit ASCII — no UTF-8 box characters that mangle on cp1252 console hosts.
29
+
-**`Invoke-GPUToolDownload` function**: New PS1 function handles automated download of MSI Afterburner and FurMark via curl.exe → BITS → IWR cascade with minimum file-size validation. Accepts `-DownloadGPUTool` and `-DownloadDir` script parameters so the batch launcher can invoke it cleanly via `-File` mode.
30
+
-**Batch: GPU Tools Manager Option 5 — Download GPU Tools Automatically**: Auto-downloads MSI Afterburner (MSI CDN) and FurMark (Geeks3D) directly to the `Tools\` folder without opening a browser. Old Option 5 (Return) moved to Option 6.
31
+
32
+
### 🔧 Fixed
33
+
-**Network Speed Test — full engine rewrite**: Replaced single-method `Invoke-WebRequest` approach with a three-method cascade: **curl.exe** (primary, WinHTTP/Schannel, native TLS 1.3) → **BITS** (fallback, also WinHTTP) → **Invoke-WebRequest** (last resort with TLS workarounds). Resolves systematic handshake failures on Cloudflare and OVH under Mullvad VPN and similar environments where `.NET ServicePointManager` bypass fires too late in the TLS stack.
34
+
-**Network Speed Test — dead URL**: Replaced `speed.hetzner.de` (hostname retired, DNS failure on all systems) with `speedtest.tele2.net/10MB.zip` in the HTTP fallback slot.
35
+
-**Network Speed Test — TLS negotiation**: Enabled TLS 1.2/1.3 additively before each IWR attempt with per-protocol fallback, restored afterward. Prevents silent failures on PowerShell 5.1 systems that default to TLS 1.0/1.1.
36
+
-**Network Speed Test — PowerShell 7+ cert bypass**: Added `-SkipCertificateCheck` for PowerShell 7+ where `Invoke-WebRequest` uses `HttpClient` and ignores `ServicePointManager` callbacks.
37
+
-**Network Speed Test — status reporting**: Reset `$status` to `SUCCESS` on a successful download so an earlier `Get-NetAdapter` failure no longer mislabels a working speed test as `FAILED`.
38
+
-**Batch Launcher — GPU download parser errors**: `setlocal enabledelayedexpansion` caused `!` characters in inline PowerShell strings (e.g. `heat!`) to be consumed by cmd.exe before PowerShell received the script, producing `Missing closing '}'`, `The Try statement is missing its Catch or Finally block`, and `Unexpected token ')'`. Fixed by moving all download logic into `Invoke-GPUToolDownload` in the PS1; batch now calls `-File "%SCRIPT_PS1%" -DownloadGPUTool "..." -DownloadDir "..."`.
39
+
-**WHEA false positive**: Level 4 informational events from `Microsoft-Windows-WHEA-Logger` — including "WHEA has started" (Event ID 1) which fires on every Windows boot — triggered "Hardware errors detected" on all healthy systems. Added `Where-Object { $_.Level -le 3 }` to restrict to Warning/Error/Critical only.
40
+
-**Disk performance — silent regex failure**: `"Write: ([\d\.]+) MB/s.*Read: ([\d\.]+) MB/s"` used `.*` which cannot cross newlines in PowerShell `-match`. Write and Read speeds are stored on separate output lines, so the regex never matched on any system and disk performance recommendations never fired. Split into two independent `if (-match)` blocks.
41
+
-**Battery false positive on desktops**: `$powerInfo.Output -match "Battery"` matched the string `"No battery (desktop)"` emitted by desktop systems. Changed to `"Battery: "` (colon + space) which only matches actual battery data lines.
42
+
-**Wi-Fi NIC false positive**: 802.11n adapters at 100 Mbps incorrectly triggered "Physical network adapter running at 10/100 Mbps — Upgrade to Gigabit Ethernet." Added `Wi-Fi|Wireless|WLAN` to the adapter line exclusion pattern.
43
+
-**SMART detection — missing status**: `"Unhealthy"``HealthStatus` from `Get-PhysicalDisk` was absent from the recommendations pattern match. Added alongside `Warning|Caution|Failed|Degraded`.
44
+
-**Windows Update — duplicate recommendations**: Two separate check blocks both fired `"ACTION: N Windows update(s)"` for any `pendingCount > 0`. Removed the early duplicate block; all Windows Update recommendations consolidated into a single block.
45
+
-**Windows Update — 1–5 pending gap**: Removing the early duplicate left systems with 1–5 pending updates producing no recommendation. Added `elseif ($pendingCount -gt 0)` branch to the consolidated block covering the full range: `>20` WARNING, `>5` INFO, `>0` ACTION, `0` GOOD.
46
+
-**GPU VRAM detection — REG_BINARY crash**: `Get-AccurateVRAM` silently fell back to the WMI 4 GB cap when `HardwareInformation.qwMemorySize` was stored as `REG_BINARY` (byte array) instead of `REG_QWORD`. Direct `[int64]` cast threw and was swallowed by bare `catch {}`. Now detects the registry type and converts via `[System.BitConverter]::ToInt64()`.
47
+
-**GPU memory — dangling cross-reference**: On multi-GPU systems without available performance counters, per-adapter entries pointed to a "GPU-Memory-Total" aggregate section that was never written (its guard required both `$gpuCount -gt 1` AND `$countersAvailable`). Cross-reference now only appears when the aggregate section will actually be present.
48
+
-**Disk performance — exception not recorded**: A disk test exception (`%TEMP%` write denied, out of disk space, etc.) printed a console warning but wrote nothing to `$TestResults`, making the failure invisible in the report and excluded from pass/fail counts. Catch block now records `Status="FAILED"`.
49
+
-**OS Health — DISM error coverage restored**: A prior false-positive fix removed `"error"` from the recommendations regex, inadvertently dropping `"DISM encountered an error"`. Restored via `"DISM encountered|could not perform the requested operation"`.
50
+
-**OS Health — false-positive guard**: Added `"No integrity violations"` to the `-notmatch` exclusion list to prevent false corruption warning from DISM `/CheckHealth` output on clean systems.
51
+
-**OS Health — non-English Windows**: DISM and SFC output is localized; English phrase matching silently produced false-healthy results on non-English corrupt systems. DISM exit code (0 = clean, 11 = repairable, other = error) now captured and embedded as a language-neutral signal.
52
+
-**Windows Update — search failure unhandled**: A running-but-broken WU service caused the COM search call to throw, writing "Search failed: ..." to output but triggering no recommendation. A WARNING recommendation is now emitted when search failure is detected.
53
+
-**NVIDIA SMI — exit code ignored**: Both `nvidia-smi` invocations stored `Status="SUCCESS"` unconditionally. GPU driver errors (driver not loaded, device unavailable) were silently recorded as passing. Exit code is now checked and mapped correctly.
54
+
55
+
### 📈 Changed
56
+
- GPU Tools Manager sub-menu renumbered: old Option 5 (Return to Main Menu) is now Option 6; new Option 5 is Download GPU Tools Automatically.
57
+
- Startup banner replaces simple 4-line version header; `Clear-Host` precedes the banner to eliminate PowerShell startup noise.
58
+
59
+
---
60
+
61
+
## [2.5] - 2026-05-01
62
+
63
+
### 🚀 Added
64
+
-**TLS 1.3 Support**: Rewrote download engine to support modern TLS 1.3/1.2 protocols via bitwise OR mask, preventing "Connection Closed" errors on Microsoft CDNs.
65
+
-**Enhanced GPU Reporting**: Implemented registry-level VRAM detection to bypass the 4GB WMI truncation bug; now accurately reports high-end cards (e.g., RTX 5070 12GB).
66
+
-**Multi-GPU Intelligence**: Added system-wide GPU memory aggregation for machines with both iGPU and discrete graphics.
67
+
-**Expanded NIC Filtering**: Added ZeroTier, AnyConnect, GlobalProtect, Fortinet, and more to the virtual adapter exclusion list.
68
+
69
+
### 🔧 Fixed
70
+
-**Launcher Awareness**: Fixed a critical bug where the script failed to detect the .bat launcher on PowerShell 5.1.
71
+
-**Network Speed Logic**: Switched Mbps calculations to base-10 to match ISP reporting and added a 1MB sanity floor to prevent false "slow internet" warnings from error pages.
72
+
-**Storage Diagnostics**: Rewrote disk performance tests to use `WriteThrough` flags, ensuring real disk throughput is measured rather than system cache.
73
+
-**Recommendation Engine**: Refined regex logic to eliminate false positives for "System Corruption" and "Windows Update Stopped" (now checks StartType).
74
+
-**Security**: Implemented `try/finally` blocks to ensure system SSL certificate callbacks are always restored to default state after testing.
75
+
76
+
### 📈 Changed
77
+
- Updated Sysinternals Suite size estimate to ~170MB.
78
+
- Increased download timeout to 180s to accommodate larger payloads on slower links.
79
+
- "EXCELLENT" status now only triggers if zero warnings/critical issues are found by the engine.
80
+
81
+
---
82
+
83
+
## [2.4.0] - 2026-04-23
84
+
85
+
### Fixed
86
+
87
+
**Network — Latency Test**
88
+
-`$targetPort` was never defined, causing `Test-NetConnection` to receive `Port=0` and throw a
89
+
validation error on every run — latency test now correctly runs as ICMP-only with no port argument
90
+
-`Test-NetConnection -InformationLevel Detailed` removed; it requires a valid port and is
91
+
unnecessary for basic ping latency measurement
92
+
-`PsPing` was called with `IP:Port` format instead of bare IP for ICMP mode
93
+
-`PsPing` result regex was too strict — minor whitespace variations in output caused results to be
94
+
silently dropped; regex now uses flexible `\s*` matching
95
+
- Added debug output line showing raw PsPing tail when parsing still fails, making future
96
+
diagnosis possible without re-running the test
97
+
98
+
**Network — Speed Test**
99
+
- Single hardcoded Hetzner HTTPS URL failed under VPN/proxy TLS interception (Mullvad, Tailscale,
100
+
corporate proxies) with no fallback — replaced with a 3-URL chain: Cloudflare, Hetzner HTTP, OVH
101
+
- Added per-attempt SSL certificate validation bypass to handle MITM interception; bypass is
102
+
scoped to the request and restored immediately after each attempt regardless of success or failure
103
+
- Added minimum file size check (1000 bytes) to prevent a firewall error page from being recorded
0 commit comments