Skip to content

Commit bc150f6

Browse files
authored
Revise README for version 2.6 updates
Updated version number to 2.6 and revised features, bug fixes, and technical changes. Improved network speed test engine and added new GPU tool download functionality.
1 parent 54c639b commit bc150f6

1 file changed

Lines changed: 73 additions & 50 deletions

File tree

README.md

Lines changed: 73 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Portable Sysinternals Windows System Testing Utility
1+
# Portable Sysinternals Winodws System Testing Utility
22

33
<p align="center">
44
<img src="assets/systemtester.png" alt="Thumb-drive friendly, no-install Windows hardware health check toolkit powered by Sysinternals and PowerShell." width="600"/>
@@ -21,49 +21,55 @@ A zero-dependency **PowerShell solution** that runs a comprehensive, curated set
2121
* Quickly identifying performance bottlenecks.
2222
---
2323

24-
## What's New in v2.5
24+
## What's New in v2.6
2525

26-
v2.5 focuses on fixing real-world network testing failures observed in the field, particularly on systems running VPN software (Mullvad, Tailscale, WireGuard) and environments with virtual adapters (VMware, Hyper-V). It also resolves a latency test crash that affected every system, and fixes report encoding that caused garbled output in Notepad and legacy viewers.
26+
v2.6 is a quality and reliability release. The network speed test engine has been fully rewritten around `curl.exe` to resolve systematic TLS failures on modern endpoints. GPU tool downloads now work reliably via a new PowerShell function that fixes a batch-file parser bug triggered by Windows delayed variable expansion. A PNWC branded startup banner has been added. Thirteen bugs have been corrected, including six recommendation engine false positives and three tool output cleaner failures discovered during live test validation.
27+
28+
### New Features
29+
30+
- **PNWC Startup Banner**: Branded ASCII art header with version, contact info, and system context painted on launch; uses `Clear-Host` first to eliminate PowerShell startup noise; pure 7-bit ASCII (no UTF-8 box characters that mangle on older console hosts)
31+
- **GPU Tool Auto-Download**: New `Invoke-GPUToolDownload` PS1 function handles MSI Afterburner and FurMark with a curl.exe → BITS → IWR cascade; batch launcher GPU Tools Manager now includes **Option 5** to trigger downloads directly without opening a browser
2732

2833
### Bug Fixes
2934

3035
| # | Area | Issue | Impact |
3136
|---|------|--------|--------|
32-
| 1 | Network Latency | `$targetPort` was never defined: `Test-NetConnection` received `Port=0` and threw a validation error on every run | **Critical**: latency test always failed |
33-
| 2 | Network Latency | `PsPing` output regex was too strict: minor whitespace variations caused "Unable to parse" on valid results | Medium: latency stats silently dropped |
34-
| 3 | Network Speed | Single hardcoded Hetzner HTTPS URL failed under VPN/proxy TLS interception (e.g. Mullvad) | High: speed test failed on VPN-connected machines |
35-
| 4 | Network Speed | No fallback if the download URL failed | Medium: single point of failure |
36-
| 5 | Recommendations | VMware VMnet and VPN virtual adapters (Mullvad, Tailscale) were flagged as "slow physical NICs" at 100 Mbps | Low: false positive recommendation |
37-
| 6 | Reports | Report files written as UTF-8 with Unicode bullets (``) and arrows (`->`) rendered as mojibake (`• â†'`) in Notepad and legacy viewers | Medium: garbled report output |
38-
| 7 | Reports | Box-drawing characters (`└─`) in the menu display caused non-ASCII bytes in the script itself | Low: cosmetic |
39-
| 8 | Batch Launcher | `VERIFY` section exit-code branching silently swallowed function output | Low: misleading success messages |
40-
| 9 | Batch Launcher | Sysinternals download had no SSL bypass: same VPN TLS issue as PS1 | High: download failed on VPN machines |
37+
| 1 | Network Speed | All 3 test URLs failing: Cloudflare and OVH with TLS handshake errors; Hetzner hostname (`speed.hetzner.de`) retired — DNS resolution failed on all systems | **Critical**: speed test always failed |
38+
| 2 | Network Speed | `.NET ServicePointManager` SSL bypass cannot resolve TLS 1.3 handshake failures — the bypass callback fires too late in the stack | High: fundamental architectural limit of the previous approach |
39+
| 3 | Batch Launcher | `setlocal enabledelayedexpansion` consumed `!` characters in inline PowerShell strings before PowerShell received them, generating `Missing closing '}'` and missing Catch/Finally block parse errors | **Critical**: GPU tool downloads always failed |
40+
| 4 | WHEA Events | Level 4 informational events (including "WHEA-Logger started" fired on every Windows boot) triggered "Hardware errors detected" recommendation | High: false positive on every healthy system after a reboot |
41+
| 5 | Disk Performance | Multiline regex (`.*`) cannot cross newlines in PowerShell — Write/Read speeds stored on separate output lines were never matched | High: disk performance recommendations never fired on any system |
42+
| 6 | Recommendations | Battery check matched the string `"No battery (desktop)"` on desktop systems | Medium: phantom laptop battery alert on desktops |
43+
| 7 | Recommendations | 802.11n Wi-Fi adapters at 100 Mbps triggered "Upgrade to Gigabit Ethernet" recommendation | Medium: false positive on all wireless-connected clients |
44+
| 8 | SMART Detection | `"Unhealthy"` `HealthStatus` from `Get-PhysicalDisk` not included in the recommendations pattern | Medium: actively failing drives not flagged |
45+
| 9 | Windows Update | Two separate check blocks both fired `"ACTION: N update(s) pending"` for any `pendingCount > 0` | Low: doubled recommendations on most systems |
46+
| 10 | Windows Update | After removing the duplicate early check, 1–5 pending updates produced no recommendation at all | Low: silent gap in coverage for minor pending counts |
47+
| 11 | Tool Output | `clockres` and `du` not in the `-accepteula` list — full Sysinternals EULA text was written into the clock resolution and disk usage report sections instead of actual data | Medium: two report sections always empty/garbage |
48+
| 12 | Security Analysis | `autorunsc` argument `-a -c` caused autorunsc to consume `-c` as the type-selection character for `-a` (codecs only), leaving no CSV flag — tool printed usage/help text instead of autorun entries | Medium: autorun entries never captured |
49+
| 13 | Tool Output | `2>&1` stderr capture produced raw PowerShell `NativeCommandError` / `CategoryInfo` / `FullyQualifiedErrorId` formatting inside tool output sections | Low: error-object noise cluttering report output |
4150

4251
### What Changed Technically
4352

44-
**`Test-NetworkLatency`**
45-
- Removed the undefined `$targetPort` variable entirely: ICMP ping does not require a port
46-
- Removed `-Port` and `-InformationLevel Detailed` from `Test-NetConnection` (both require a valid port number)
47-
- Made `PsPing` ICMP args use bare IP instead of `IP:Port` format
48-
- Widened PsPing regex to allow variable whitespace (`\s*` instead of literal spaces)
49-
- Added a debug "raw tail" output line when PsPing parsing fails, so failures are diagnosable
50-
**`Test-NetworkSpeed`**
51-
- Replaced single Hetzner URL with a 3-URL fallback chain: Cloudflare → Hetzner HTTP → OVH
52-
- Added `[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }` before each attempt to bypass VPN/proxy MITM certificate interception, restored immediately after
53-
- Added minimum file size check (1000 bytes) so an error HTML page returned by a firewall isn't measured as a "successful" download
54-
**Recommendation Engine: NIC check**
55-
- Now iterates adapter lines individually rather than pattern-matching the whole output block
56-
- Skips lines matching: `VMware`, `VMnet`, `Virtual`, `vEthernet`, `Tailscale`, `Mullvad`, `WireGuard`, `Loopback`, `Hyper-V`, `VPN`, `TAP-Windows`, `OpenVPN`
57-
- Only physical adapters at 10/100 Mbps generate a recommendation
58-
**Report encoding**
59-
- All `` replaced with `*`, all `->` were already ASCII but confirmed clean
60-
- `Out-File` changed from `-Encoding UTF8` to `-Encoding ASCII`
61-
- Removed Unicode box-drawing characters (`└─`) from the menu display strings
62-
- Script itself is now fully 7-bit ASCII: no encoding surprises in any viewer
63-
**Batch Launcher (`SystemTester.bat`)**
64-
- Added the same SSL bypass pattern to the Sysinternals Suite download block
65-
- Simplified VERIFY section: removed exit-code branching that produced misleading results
66-
- Removed stale reference to legacy `SystemTester_FIXED.ps1` filename from the error message
53+
**`Test-NetworkSpeed` (full rewrite)**
54+
- Three-method cascade: **curl.exe** (primary) → **BITS** (fallback) → **Invoke-WebRequest** (last resort)
55+
- curl.exe and BITS use WinHTTP/Schannel natively — completely unaffected by `.NET ServicePointManager` TLS limitations; both support TLS 1.3 out of the box
56+
- Replaced retired `speed.hetzner.de` with `speedtest.tele2.net/10MB.zip` in the fallback slot
57+
58+
**`Invoke-GPUToolDownload` (new function)**
59+
- Accepts `-Tool` (`"MSIAfterburner"` or `"FurMark"`) and `-TargetDir` parameters via new `$DownloadGPUTool` / `$DownloadDir` script params
60+
- Batch launcher calls `-File "%SCRIPT_PS1%" -DownloadGPUTool "..." -DownloadDir "..."` — avoids all `!` delayed-expansion issues entirely
61+
62+
**Recommendation Engine: False positive fixes**
63+
- WHEA: `Where-Object { $_.Level -le 3 }` — excludes Level 4 informational events (normal boot activity)
64+
- Disk perf: split single `Write.*Read` multiline regex into two separate `if (-match "Write:")` / `if (-match "Read:")` blocks
65+
- Battery: match narrowed from `"Battery"` to `"Battery: "` (colon + space) — only matches actual battery data lines
66+
- NIC exclusion: added `Wi-Fi|Wireless|WLAN` to the virtual/non-physical adapter exclusion pattern
67+
- Windows Update: consolidated into a single check block covering the full range: `>20` (WARNING), `>5` (INFO), `>0` (ACTION), `0` (GOOD)
68+
69+
**`Convert-ToolOutput` cleaner: Output quality fixes**
70+
- Added `clockres` and `du` to the `-accepteula` injection list so clock resolution and disk usage sections show actual data instead of EULA text
71+
- Added `NativeCommandError|CategoryInfo|FullyQualifiedErrorId|RemoteException|At .*\.ps1:` to the per-line skip pattern to strip PowerShell error-object formatting from `2>&1` captures
72+
- Fixed `autorunsc` argument from `-a -c` to `-c`: `-a` was consuming `-c` as its selection character (codecs), leaving no CSV flag; default logon-entry CSV output now works correctly
6773
---
6874

6975
## Key Capabilities
@@ -81,8 +87,8 @@ v2.5 focuses on fixing real-world network testing failures observed in the field
8187
* **Fully Portable**: runs from USB; no installation required
8288
* **Graceful Degradation**: missing tools detected and skipped automatically
8389
* **Robust Elevation Handling**: reliable admin detection (Windows Home compatible)
84-
* **Auto-Download Tools**: built-in Sysinternals Suite downloader via batch launcher
85-
* **Resilient Downloads**: Triple-redundant download engine (BITS > IWR > WebClient) for Sysinternals utilities.
90+
* **Auto-Download Tools**: built-in Sysinternals Suite and GPU tool downloader via batch launcher
91+
* **Resilient Downloads**: Triple-redundant download engine (curl.exe > BITS > IWR) for speed tests and GPU tool downloads — native TLS 1.3 via WinHTTP/Schannel.
8692
* **Windows Update Integration**: checks pending updates and service status
8793
* **Modern PowerShell**: uses CIM instances (not deprecated WMI) for better performance
8894
---
@@ -94,7 +100,7 @@ v2.5 focuses on fixing real-world network testing failures observed in the field
94100
* **Permissions:** Administrator rights recommended (some tests require elevation)
95101
* **Internet**: Required for Option 5 (Sysinternals Download)
96102
* **Sysinternals Tools:** Auto-downloadable via launcher or manual installation
97-
* *Note: v2.5 now supports TLS 1.3 for secure communication with Microsoft CDNs.*
103+
* *Note: v2.6 uses curl.exe (WinHTTP/Schannel) as the primary download engine for native TLS 1.3 support on all systems.*
98104
* **GPU Tools (Optional):** NVIDIA drivers (nvidia-smi), AMD drivers, GPU-Z
99105
---
100106

@@ -178,23 +184,23 @@ For enhanced GPU testing:
178184
| 14 | Hardware Events | WHEA error logs (last 7 days) | Event Viewer |
179185
| 15 | Windows Update | Pending updates, service status | Windows Update COM API |
180186

181-
### Network Testing (Option 7): v2.5 Changes
187+
### Network Testing (Option 7): v2.6 Changes
182188

183-
The network test was the most heavily revised area in v2.5. Specific improvements:
189+
The speed test engine was fully rewritten in v2.6 after all three test URLs failed simultaneously:
184190

185-
* **Speed test** now tries three servers in sequence (Cloudflare, Hetzner HTTP, OVH) and stops at the first success, rather than failing outright if the single Hetzner HTTPS URL is blocked or intercepted
186-
* **SSL certificate bypass** is applied per-attempt and restored immediately after, handling VPN and proxy setups that perform TLS interception (Mullvad, corporate proxies, etc.)
187-
* **Latency test** now runs without a port parameter, so the `Test-NetConnection` ICMP ping actually executes on every system instead of throwing a port validation error
188-
* **PsPing** parsing is more flexible: results are captured correctly across different PsPing output formats
189-
* **Adapter recommendations** no longer flag VMware, Hyper-V, Tailscale, Mullvad, or other virtual adapters as "slow physical NICs"
191+
* **Speed test method 1 — curl.exe**: Uses WinHTTP/Schannel directly; supports TLS 1.3 natively; completely unaffected by `.NET ServicePointManager` limitations that caused failures under Mullvad, WireGuard, and corporate TLS-inspection proxies
192+
* **Speed test method 2 — BITS**: Background Intelligent Transfer Service also uses WinHTTP; TLS 1.3 capable; activates if curl.exe is unavailable
193+
* **Speed test method 3 — Invoke-WebRequest**: .NET fallback with TLS workarounds; last resort only
194+
* **URL updated**: Retired `speed.hetzner.de` (DNS failure) replaced with `speedtest.tele2.net/10MB.zip`
195+
* **Adapter recommendations**: Wi-Fi, Wireless, and WLAN adapters added to the exclusion pattern — 802.11n at 100 Mbps no longer triggers "Upgrade to Gigabit Ethernet"
190196
---
191197

192198
## Sample Output
193199

194200
### Clean Summary Report
195201
```
196202
=========================================
197-
SYSTEM TEST REPORT v2.5
203+
SYSTEM TEST REPORT v2.6
198204
CLEAN SUMMARY
199205
=========================================
200206
Date: 04/23/2026 14:30:22
@@ -284,9 +290,9 @@ The batch launcher (`SystemTester.bat`) provides:
284290
2. **Run ALL Tests Automatically**: Complete system scan with auto-report
285291
3. **Fix PowerShell Execution Policy**: Set CurrentUser to RemoteSigned
286292
4. **Verify Tool Integrity**: Check digital signatures and file sizes of Sysinternals tools
287-
5. **Download/Update Sysinternals Suite**: Auto-download from Microsoft (~35 MB); VPN-compatible in v2.5
288-
6. **GPU Testing Tools Manager**: Download and manage GPU testing tools
289-
7. **Help / Troubleshooting**: Comprehensive troubleshooting guide updated for v2.5
293+
5. **Download/Update Sysinternals Suite**: Auto-download from Microsoft (~35 MB); uses curl.exe for TLS 1.3 compatibility
294+
6. **GPU Testing Tools Manager**: Download and manage GPU testing tools (sub-menu includes Option 5: Download GPU Tools Automatically — MSI Afterburner and FurMark via curl.exe)
295+
7. **Help / Troubleshooting**: Comprehensive troubleshooting guide
290296
8. **Exit**
291297
---
292298

@@ -351,6 +357,23 @@ The `Reports\` folder is created automatically the first time a report is genera
351357

352358
## Version History
353359

360+
### v2.6: June 2026
361+
- Rewrote network speed test engine: curl.exe (primary, WinHTTP/Schannel) → BITS → Invoke-WebRequest cascade for native TLS 1.3 on all systems
362+
- Replaced retired `speed.hetzner.de` (DNS failure) with `speedtest.tele2.net/10MB.zip`
363+
- Added PNWC branded ASCII startup banner with Clear-Host, version header, and system context
364+
- Added `Invoke-GPUToolDownload` function: automated MSI Afterburner and FurMark downloads via curl.exe → BITS → IWR
365+
- Batch: GPU Tools Manager Option 5 now triggers automated tool downloads directly
366+
- Batch: Fixed GPU download parser errors caused by delayed expansion consuming `!` characters in inline PowerShell; moved all download logic to PS1 function, batch calls `-File` instead
367+
- Fixed WHEA false positive: Level 4 informational events (including normal boot events) no longer trigger hardware error alert; filter now requires Level ≤ 3
368+
- Fixed disk performance recommendations: split multiline `.*` regex into two separate match operations
369+
- Fixed battery false positive on desktops: narrowed match from `"Battery"` to `"Battery: "`
370+
- Fixed Wi-Fi NIC false positive: added `Wi-Fi|Wireless|WLAN` to adapter exclusion pattern
371+
- Fixed SMART detection: added `"Unhealthy"` to `HealthStatus` pattern match
372+
- Fixed Windows Update: consolidated duplicate check blocks; added branch for 1–5 pending updates
373+
- Fixed clockres and du EULA output: added both to `-accepteula` injection list
374+
- Fixed autorunsc producing usage text: corrected argument from `-a -c` to `-c` (default logon entries, CSV)
375+
- Fixed PowerShell error formatting leaking into report output: added NativeCommandError/CategoryInfo filter to output cleaner
376+
354377
### v2.5: April 2026
355378
- Fixed latency test crash: removed undefined `$targetPort` and broken `Test-NetConnection` args
356379
- Fixed speed test SSL failure under VPN/proxy TLS interception
@@ -510,4 +533,4 @@ MIT License: See [LICENSE](LICENSE) file for details.
510533

511534
*Tested on Windows 10 (1909+) and Windows 11: Enterprise, Pro, Home & Server editions*
512535

513-
**Last Updated:** AMay 2026 | **Version:** 2.5 | **Status:** Production Ready
536+
**Last Updated:** June 2026 | **Version:** 2.6 | **Status:** Production Ready

0 commit comments

Comments
 (0)