Repository navigation
Releases: AldySan/USBUtils_src
Release list
USBUtils 0.0.6
USBUtils 0.0.6
Quality release: a full re-audit of the engine, CLI and GUI (bugs, logic errors, memory violations — no feature changes). Everything below was verified against real test drives and hostile/corrupt inputs before shipping.
Fixed — engine (memory safety)
- Corrupt video-rip backup could OOM the app. The
.ripsidecar loader sized its entry vector from the untrusted header count — a file claiming 4 billion entries attempted a ~64 GiB allocation on the worker thread before any read failed. The count is now clamped by the actual file size. Regression-tested with a hostile sidecar in the test suite. - PS2Load scan: unbounded allocation on corrupt images. The root-directory size from the Primary Volume Descriptor was trusted directly (up to a ~4 GiB vector). Now capped at 8 MiB, the same bound the ISO walker already enforced.
- Failed copy/move left half-written games on the destination. If part N failed (or the destination
ul.cfgcould not be written), every already-copied chunk stayed behind as an unreferenced file until you ran Restore-space. All failure paths now roll back the written files — the same contract installs already had.
Fixed — CLI (could damage the wrong game)
usbutils remove 4294967296deleted game #0. The index was parsed withatoi(), which on 64-bit Linux/macOS silently wraps (4294967296→ 0) and passes every bounds check. The same wrap affectedrename/export/rip/inject/move/dnas patch. Indices are now parsed withstrtolland saturated, so the command errors out withbad index. (Verified against a real test drive: game #0 survives.)find 666searched for an empty pattern (matching every file of every game) instead of "666" — numeric positionals were stolen by the index branch.listwithout-dsilently listed the current working directory as if it were a drive, exit code 0.recover --applyprinted "ul.cfg updated" even when the write failed;fix --applyexited 0 when fixes failed — both now report errors and exit non-zero.- Multi-file
extract/iso extract/export all: same-named files silently overwrote each other; collisions now get_1,_2… suffixes. extract -o <existing directory>now treats it as an output directory (the ruleiso extractalready had);--sizerejects non-numeric values;dnas patchwithout an index is a usage error;report -odetects short writes.
Fixed — GUI (stability)
- Closing a dialog mid-operation could crash the app. The Video-rip, Game-files and Find dialogs run work on background threads that post progress back to the dialog — and all three could be destroyed while that work was still running (Esc and the Close button bypass the existing close guard; Game-files and Find had no guard at all). All close paths now respect a busy counter.
- The menu bar stayed live during operations. After clicking Cancel on a progress dialog the job keeps running for a moment — during that window File→Open / Games→Remove could re-enter mid-operation and corrupt the list. The menu bar is disabled while busy.
- Copy/Move ran on a live snapshot problem: the worker thread used the GUI-owned game list directly (a Move even mutated it from the thread). It now works on its own snapshot and re-resolves the game by id+serial.
- Sort / Clean up drive space / Recover could act on the wrong drive. They used the drive combo selection instead of the opened games list — with two drives plugged in, "Clean up" deleted leftover files from the other drive while the visible list stayed unchanged. They now always operate on the opened list's drive.
- The shutdown wait for the update check could time out before the network timeouts it waits for, leaving the worker posting events into a destroyed window; it now waits for completion.
- A cancelled backup/extract was reported as a failure message box; the Replace progress dialog showed a Cancel button that could not cancel anything.
Fixed — dead features
- ISO explorer: editing the Volume ID never worked — the field's signals were blocked on image load and never unblocked, so edits were silently dropped when saving the modified copy.
- Find dialog: the optional exact-size filter was never read — typing a size changed nothing. It is now applied.
Downloads
| File | Contents |
|---|---|
usbutils-0.0.6-windows-x86_64.zip |
GUI (usbutils-gui.exe) + CLI (usbutils.exe) + all required Qt and MinGW runtime DLLs + data files |
usbutils-0.0.6-linux-x86_64.tar.gz |
GUI (usbutils-gui) + CLI (usbutils) + bundled Qt runtime + data files |
Both packages are self-contained: extract and run — no Qt installation, no other downloads needed.
As always: the GUI performs a silent update check a few seconds after startup; the CLI has usbutils check-update.
USBUtils 0.0.5
USBUtils 0.0.5
Stability release: fixes the Windows heap-corruption crash that surfaced in "Open ISO to [Explore/Modify]", and ships the project's analysis toolkit inside the repository.
Fixed
- Windows: heap corruption crashing the GUI. The crash reported in 0.0.4 could be triggered by "Open ISO to [Explore/Modify]" but could also detonate later in unrelated features — the minidumps pointed at the ntdll heap manager, meaning the heap was already damaged elsewhere. Root causes (found by analyzing user-supplied minidumps, see
docs/crash-v0.0.4-iso-explorer.md):- The Windows package now always bundles the MinGW runtime DLLs (
libstdc++-6.dll,libgcc_s_seh-1.dll,libwinpthread-1.dll) thatQt6Core.dllimports. Previously Windows loaded them from whatever GCC runtime it found on the machine (e.g. an MSYS2 folder built with a different GCC) — a classic mixed-runtime heap corruption; on machines without any MinGW the app would not start at all. The packaging script now walks the import tables of the bundled Qt DLLs and plugins, and fails the build if any of the three is missing. Ps2LoadDialog's thread helper captured stack locals by reference inside a worker-thread lambda and freed theQThreadobject while the OS thread could still be inside its teardown — a use-after-free that slowly corrupted the heap. Rewritten: the callable is copied into the worker, the result lives in a shared heap slot, and the wait happens in a properQEventLoop.WorkerThreadnow owns its ownfinished → deleteLaterconnection (the canonical Qt pattern); the hand-rolled lifetime wiring at all nine call sites was removed so nobody can get the contract wrong again.- The startup update-check thread is tracked via
QPointerand cannot dangle at shutdown. - ISO9660 parser hardening (defense in depth, found while auditing): directory records must fully fit inside the extent — a record with a lied-about identifier length or a truncated header used to read past the buffer. Guarded by a hostile-ISO regression test (
tools/hostile_iso_test.py).
- The Windows package now always bundles the MinGW runtime DLLs (
- CLI:
usbutils drivesnow prints a friendly message when no removable drive is found, instead of an empty listing.
Added
- The analysis toolkit now ships in the repository (
tools/) — the Python tooling that produced this reimplementation: the reverse-engineering kit (PE resource/DFM extraction, binary DFM-to-text converter, Delphi string-reference finder, function-window extractor,usbutil.rcndecoder), the three minidump parsers used for both Windows crash forensics, the procedural icon generator and the hostile-ISO regression test. Everything runs on a stock Python 3; seetools/README.md.
Changed
- The release-packaging script runs out of the box and self-discovers the full Qt/MinGW DLL closure.
Downloads
| File | Contents |
|---|---|
usbutils-0.0.5-windows-x86_64.zip |
GUI (usbutils-gui.exe) + CLI (usbutils.exe) + all required Qt and MinGW runtime DLLs + data files |
usbutils-0.0.5-linux-x86_64.tar.gz |
GUI (usbutils-gui) + CLI (usbutils) + bundled Qt runtime + data files |
Both packages are self-contained: extract and run — no Qt installation, no other downloads needed.
As always: the GUI performs a silent update check a few seconds after startup; the CLI has usbutils check-update.
USBUtils 0.0.4
USBUtils 0.0.4
Bug-fix release focused on Windows stability.
Fixed
- Windows: crash about 3 seconds after GUI startup. The bundled Qt 6.8 implements
QThread::create()on top ofstd::async(std::launch::deferred, ...); under the MinGW-w64 toolchain that machinery corrupted heap state and crashed the app right when the automatic update check finished. Every background job (update check, copy/move, extract/inject, video rip, drive report, find, PS2Load) now uses a plain worker-thread implementation — the crashing code path no longer exists in the binary. Full minidump analysis:docs/crash-v0.0.3-startup.md. - The main window can no longer be destroyed while the startup update check is still running (it now waits for the worker to finish).
- Update check: defensive URL parsing in the Windows HTTP path.
Changed
- Release packages now ship the complete data set:
PS2LOAD.ELF,usbutil.dniandusbutil.dna(the IOPRP image packages used by DNAS patching) andusbutil.ljs(game compatibility notes). Earlier packages only includedPS2LOAD.ELF, which left the DNAS patch tool without its data. - Windows build:
libwinpthreadis statically linked (one less DLL to ship).
Downloads
| File | Contents |
|---|---|
usbutils-0.0.4-windows-x86_64.zip |
GUI (usbutils-gui.exe) + CLI (usbutils.exe) + all required Qt and MinGW runtime DLLs + data files |
usbutils-0.0.4-linux-x86_64.tar.gz |
GUI (usbutils-gui) + CLI (usbutils) + bundled Qt runtime + data files |
Both packages are self-contained: extract and run — no Qt installation, no other downloads needed.
As always: the GUI performs a silent update check a few seconds after startup; the CLI has usbutils check-update.
USBUtils 0.0.3
USBUtils 0.0.3
A catch-up release: everything the classic 2009 tool could do is now in here, the app got much friendlier for everyday use, and it now checks by itself when a new version comes out.
What's new
- Find files inside your games — lost track of which game has which file? Search every game at once, by name or by size.
- Look inside a game — open a game like a folder, pull a single file out to your computer, or put a modified one back in (same size only).
- Copy or move games to another drive — moving your collection to a bigger drive no longer means reinstalling everything.
- Sort the games list — one click puts everything in A-to-Z order, on screen and on the drive.
- Clean up drive space — safely finds left-over files from deleted or broken installs and clears them out, freeing room for new games.
- A full drive report — a plain-text health report of your drive and every game on it.
- Repairs games damaged by other tools — the known "666.66" serial-code damage is detected and fixed automatically.
- Checks for updates by itself — the windowed app quietly looks for new releases when it starts (never blocks you), and both apps can check on demand.
- A friendlier windowed app — clearer wording, a proper Quick Help page, smoother progress bars with cancel buttons, and fresh dialogs for the features above.
- Windows users get the windowed app too — previous Windows downloads only had the text version; both downloads now always include both apps.
The two apps, as always
- USBUtils — the one with windows and buttons, friendly for everyday use.
- usbutils — the text version for people who like typing commands.
Both are in the downloads below (Windows and Linux), GUI and command line together. Quick start: unpack, double-click usbutils-gui (usbutils-gui.exe on Windows), pick your drive, go.
As before: use it only with games you own. Big thanks to ISEKO for the original 2009 tool this project is based on.
USBUtils 0.0.2 — PS2Load + ready-made downloads
USBUtils 0.0.2
This version adds the PS2Load helper and — as promised last time — ready-made downloads for both apps, so you no longer have to build anything yourself.
What's new
- PS2Load support — some games only start from a USB drive when their boot program is swapped for a small helper called PS2Load. The tool can now do that swap for you, and undo it at any time. The helper file is included, and the game keeps all its data in place.
- Ready-made downloads for everyone — grab the archive for your computer below, unpack it and run. Both downloads now include the windowed app as well as the command-line one.
- A fix for reading real game discs — in the previous version, some game details could fail to be read from discs made the usual way. That is fixed.
Two apps, like before
- USBUtils — the one with windows and buttons (in both downloads).
- usbutils — the text version for people who like typing commands (in both downloads).
Quick start: unpack, then double-click usbutils-gui (usbutils-gui.exe on Windows), or run usbutils --help in a terminal.
As before: use it only with games you own. Big thanks to ISEKO for the original 2009 tool this project is based on.
USBUtils 0.0.1 — first release
USBUtils 0.0.1 — first release!
A free, modern replacement for the classic USBUtil 2.2 — the tool that
lets you keep PlayStation 2 games on a USB drive and play them without
burning discs. The original tool's source code was lost, so this one was
rebuilt from the ground up to keep it alive.
What you can do
- Put games on your USB drive — pick a game file, pick your drive, wait a bit, done.
- See all your games in one list, with sizes.
- Rename or delete games.
- Turn game videos off and on — some games play smoother from USB without their movies. Turning them off keeps a backup, so you can always turn them back on.
- Back up a game from the drive back into a single game file.
- Fix the "DNAS" error that stops some games from going online.
- Bring back games that vanished from the list.
Two apps included
- USBUtils — the one with windows and buttons, for everyday use.
- usbutils — a text version for people who like typing commands.
Both are in the downloads below — grab the archive for your computer
(Windows or Linux), unpack it and run: double-click usbutils-gui, or
open a terminal and try usbutils --help. On macOS you can build it
yourself from the README. Plug in a USB drive (FAT32), pick your games,
and go.
Please use it only with games you own. Huge thanks to ISEKO for the
original 2009 tool this project is based on.