A modern replacement for USBUtil — split PS2 ISOs for OPL/USBExtreme with style.
Features • Screenshot • Installation • Usage • How It Works • Building • License
PS2 ISO Manager is a Windows desktop app that does what USBUtil does — but with a clean, modern UI inspired by Open PS2 Loader (OPL). It splits PS2 ISO files into the USBExtreme/OPL format so you can load games from USB on a real PS2.
No more hunting for ancient, sketchy USBUtil downloads. This is open-source, built with .NET 8, and just works.
- Split PS2 ISOs into 1 GiB chunks in OPL/USBExtreme format
- Auto-detect Game ID by reading SYSTEM.CNF from the ISO (ISO9660 parsing)
- ul.cfg management — add, delete, and rename games with proper binary record handling
- Cover art download from the ps2-covers GitHub archive
- 4 selectable themes — OPL Dark, Midnight, Light, and Cosmic — switch at runtime, persisted across sessions
- Drag & drop ISO files directly onto the window
- Keyboard shortcuts —
Ctrl+Aadd,F2rename,Deldelete,F5refresh - Remembers your folder across sessions
- No external dependencies — pure .NET 8 WPF, no NuGet packages needed
Download the latest .exe from the Releases page.
Requires .NET 8 Desktop Runtime installed.
git clone https://github.com/imadali120/PS2IsoManager.git
cd PS2IsoManager
dotnet run --project PS2IsoManager- Select Folder — Point to your USB drive or the folder where OPL looks for games (e.g.
F:\DVD) - Add Game — Pick a PS2
.isofile. The app will:- Extract the Game ID from
SYSTEM.CNFautomatically - Ask you for a display name (max 32 characters)
- Split the ISO into 1 GiB chunks with a progress bar
- Register the game in
ul.cfg
- Extract the Game ID from
- Download Art — Fetches cover art and saves it to
ART/{GAME_ID}_COV.jpg(OPL format) - Rename / Delete — Right from the detail panel or keyboard shortcuts
- Plug USB into PS2 — Boot OPL, your games show up
Just drag .iso files onto the window. Multiple files supported.
OPL loads games from USB using a specific format:
| Component | Description |
|---|---|
ul.cfg |
Binary file with 64-byte records for each game |
ul.{CRC32}.{GAME_ID}.XX |
Split chunk files (1 GiB each) |
ART/{GAME_ID}_COV.jpg |
Cover art (optional) |
| Offset | Size | Field |
|---|---|---|
0x00 |
32 | Display name (ASCII, null-padded) |
0x20 |
15 | ul. + Game ID (null-padded) |
0x2F |
1 | Number of chunk files |
0x30 |
1 | Media type (0x12 = CD, 0x14 = DVD) |
0x35 |
1 | 0x08 (USBExtreme magic byte) |
OPL uses a non-standard CRC32 for naming chunk files. The key differences from standard CRC32:
- Polynomial:
0x04C11DB7 - Inverted branching: XOR when MSB is not set (opposite of normal)
- Table indexed with
table[255 - i]instead oftable[i] - Processes
strlen(name) + 1bytes from a 32-byte null-padded buffer
This must match exactly or OPL won't find your games.
The app reads the ISO's Primary Volume Descriptor (sector 16), navigates the root directory to find SYSTEM.CNF, and parses the BOOT2 line to extract the game ID:
BOOT2 = cdrom0:\SLUS_202.65;1
^^^^^^^^^^^
Game ID extracted
PS2IsoManager/
├── Models/
│ ├── GameEntry.cs # Game record model
│ └── MediaType.cs # CD (0x12) / DVD (0x14) enum
├── Services/
│ ├── OplCrc32.cs # OPL's non-standard CRC32
│ ├── UlCfgService.cs # ul.cfg binary read/write
│ ├── IsoSplitterService.cs # Async ISO chunking with progress
│ ├── Iso9660Reader.cs # ISO9660 → SYSTEM.CNF → Game ID
│ ├── CoverArtService.cs # Cover art downloader
│ └── ThemeManager.cs # Runtime theme switching + persistence
├── ViewModels/
│ ├── ViewModelBase.cs # INotifyPropertyChanged
│ ├── RelayCommand.cs # ICommand implementation
│ ├── MainViewModel.cs # App logic and commands
│ └── GameEntryViewModel.cs # Per-game UI wrapper
├── Views/
│ ├── GameListView.xaml # OPL-style game list
│ ├── GameDetailView.xaml # Cover art + metadata panel
│ └── ProgressDialog.xaml # Split progress with cancel
├── Converters/ # WPF value converters
├── Resources/Themes/
│ ├── BaseStyles.xaml # Shared styles (all themes)
│ └── Colors/ # Per-theme color palettes
│ ├── OplDarkColors.xaml
│ ├── MidnightColors.xaml
│ ├── LightColors.xaml
│ └── CosmicColors.xaml
├── MainWindow.xaml # Shell with custom chrome
└── App.xaml # Entry point + theme loading
Requirements: .NET 8 SDK
# Build
dotnet build
# Run
dotnet run --project PS2IsoManager
# Publish single-file exe
dotnet publish PS2IsoManager/PS2IsoManager.csproj -c Release -r win-x64 --self-contained -p:PublishSingleFile=true -o publish| Key | Action |
|---|---|
Ctrl+A |
Add Game |
F2 |
Rename selected game |
Delete |
Delete selected game |
F5 |
Refresh game list |
- Open PS2 Loader — the homebrew loader this tool targets
- ps2-covers — PS2 cover art archive
- USBUtil / Tihwin — reference implementations for the USBExtreme format
MIT License — do whatever you want with it.
