PoorDS4 RC51 brings concurrent multi-controller streaming (up to 4 controllers), full support for modular PRX input engines (Control, Forza Horizon 5), UE5 crash and ghost handle fixes (Stellar Blade, Poppy Playtime, Kena, TEKKEN 8), and automatic stale gateway recovery.
What Changed (since RC44)
-
Concurrent Multi-DS4 Controller Streaming (Slots 0..3):
- The injected
SceRemotePlayreader thread now discovers, opens, and polls up to 4 active physical DS4 controller handles concurrently at up to 1000Hz using independent per-slot buffers and atomic sequence counters. All opened handles are cleanly closed when the thread terminates. - Implemented per-slot reader retrieval (
wireless_ds4_remote_reader_read_slot), allowing independent 120Hz polling of each controller. - Extended the supervisor slot multiplexer (
feed_multi_controller_slots) to feed physical secondary controllers, simulated pads, and same-user aliases, supporting any combination of physical DS4, simulated DS4, and native DualSense controllers. - Updated
PoorDS4-status.elfto report exact slot roles dynamically:Player %u (Physical DS4),Player %u (Primary DS4),Player %u Alias (Primary DS4),Player %u (Simulated DS4),Player %u (Native DualSense), orUnassigned/Empty.
- The injected
-
Forza Horizon 5 & Multi-Module Same-User Handle Aliasing:
- Fixed an issue where games with peripheral or wheel plugins (like Forza Horizon 5's
/app0/logiWheel.prx) open a handle under the same user before the game engine opens its handle. Previously, only handle 0 received translated packets while the engine received handle mismatch errors (0x80920001). - Added user ID tracking across the
libScePadclient table. The bridge now feeds primary input to all active non-DualSense handles owned by the user simultaneously, allowing bothlogiWheel.prxandeboot.binto stream input with 0 mismatches.
- Fixed an issue where games with peripheral or wheel plugins (like Forza Horizon 5's
-
Modular PRX Import Scanning (Fix for Control Ultimate Edition):
- Fixed
import_scan_error=no_supported_hooks(install_result=-4) on games with modular architectures (like Remedy's Control Ultimate Edition, which loads input logic from/app0/input_ps5_f.prxand/app0/platform_ps5_f.prx). - Switched module path resolution to direct kernel memory copying, accurately scanning all loaded PRX modules in the game container.
- Hardened system module detection against randomized container mount prefixes.
- Fixed
-
Stellar Blade Button Remapping Crash Fix & Extended Controller Info:
- Fixed
deviceClassbyte inscePadGetControllerInformationreturning0(UNKNOWN), which caused Unreal Engine button remapping menus to crash due to NULL pointer dereferences when looking up controller profiles. It is now properly set to1(STANDARD/ DualSense). - Implemented hook and spoofing for
scePadGetExtControllerInformation(7th hooked API), returning DualSense geometry and extended descriptors to prevent Sony unhooked fallback error0x80920101(DEVICE_NOT_FOUND).
- Fixed
-
Native Passthrough Priority (Fix for Poppy Playtime Chapter 3):
- Inverted stub evaluation order across all read stubs: always invoke the Sony firmware native function first, and only activate PoorDS4's Direct DS4 packet translation as an authoritative fallback when the backing handle is disconnected or in error.
- Fixes unresponsiveness in Unreal Engine titles that validate native handle state before consuming input.
-
Ghost Handle & Unreal Engine 5 Dummy Handle Filtering:
- Filtered invalid/dummy handles (
handle <= 0 || (handle & 0xffffff00) == 0 || (handle & 0x80000000) != 0) ingame_bridge_record_callandgame_bridge_handle_matches. Eliminates false mismatch counts and menu stalls in games like Kena: Bridge of Spirits, Poppy Playtime, TEKKEN 8, and JoJo's Bizarre Adventure.
- Filtered invalid/dummy handles (
-
Autonomous Stale Gateway Auto-Healing & Direct DMAP Rollback:
- If a previous session terminated unexpectedly or left orphaned hooks,
game_bridge_recover_stale_v1automatically heals modified GOT slots back to Sony's originallibScePadpointers using direct physical DMAP memory writes (game_bridge_process_write), preventingforeign_importorargs_validationstalls. - Added fallback direct physical memory write in rollback cleanup to guarantee all modified GOT slots are restored even if user-space COW write fails.
- If a previous session terminated unexpectedly or left orphaned hooks,
-
Autonomous Multi-Controller Simulation Channel (
/data/poords4/simulated_pads.txt):- Added a configuration channel to test any combination of slots directly on console hardware (
slots=all,slots=1,2,3,slots=none, or specific slot lists) with custom buttons, sticks, and triggers.
- Added a configuration channel to test any combination of slots directly on console hardware (
Multi-Controller Support (Experimental)
Please note that multi-controller support (up to 4 controllers) is currently experimental as I haven't done heavy testing with multiple physical DS4s yet because I don't have a reliable second DualShock 4 controller. If you have multiple DS4 controllers, please test them out and let me know how they work!
Testers Needed
I need testers especially for firmwares 13.40, 13.20, 13.00, 12.60, and 9.60. If you encounter any bugs, crashes, or want to contribute test logs, please send the whole /data/poords4/ logs folder as a zipped archive in GitHub issues or reach out to me directly on Discord (blurf.).
Special Thanks & Shoutout
A huge shoutout to reyzinhoplayoliver-design / ElCauaRey on Discord for helping with a lot of testing and finding bugs!
Donations & Support
If you find this project useful and want to support faster future developments, please consider donating:
- PayPal: paypal.me/nblurf
- Bitcoin (BTC Network):
1CW8JWSnWc5w7yKhYk7ixAFG487nU5Jrzc - USDT (Tron / TRC20):
TRcrCeonXzgyxjR4LGzo4JdfEHYGGqD3gX
Downloads & Usage
| Asset | Description |
|---|---|
PoorDS4rc51.elf
| Main automatic wireless DS4 bridge payload (send to port 9021) |
PoorDS4-status.elf
| Read-only bridge status snapshot utility |
PoorDS4-stop.elf
| Cooperative stop utility for clean shutdown |
SHA256SUMS.txt
| Cryptographic checksums for release verification |