mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-18 23:07:07 -05:00
feat(libSceNpManager): register NP state callbacks and report signed-out from sceNpCheckCallback
6.4 KiB
6.4 KiB
libSceNpManager technical debt
Unknown function info
- sceNpGetSandboxInfo (libSceNpManager, NID
ZVZ++68nNI8) - the name hashes to the imported NID (found with nidhunt, confirmed withtools/nid_names.py). STAR WARS: Galactic Racer (PPSA28416) imports it; its OnlineSubsystemPS5 calls it with one pointer to a 0x50-byte stack buffer and reads the buffer as a string (discussions/3086). The returned string, the exact parameter struct and console errors are unknown, so every call throws without reading or writing caller memory. A working implementation belongs with that title's bring-up. - sceNpUnknown_8weiQyIdI3A (libSceNpManager, NID
8weiQyIdI3A) - the name is not in aerolib. EA SPORTS FC 27 (PPSA34015) fails to loadlibSceNpManager.prxwithout it (unresolved ELF import/GetLastError: 127). Its only call ismov edi, r14d(a user id) andlea rsi, [rbp-0x40]after a 17-byte copy into that buffer (mov edx, 0x11);test eax, eaxfollows. The C name, the type of the 17-byte object and the console return are unknown, so every call throws without reading or writing caller memory. - sceNpUnknown_WxLcN76q19o (libSceNpManager, NID
WxLcN76q19o) - the name is not in aerolib. PPSA34015 imports it fromlibSceNpManager.prxas a strongJUMP_SLOTwith no call found in the eboot; the loader still requires the export. Arguments, result and console errors are unknown, so every call throws. - sceNpSetTimeout (libSceNpManager) - the signature follows orbital, shadPS4 and SharpProspero; the rejected values (all five 0, negative retries, a resolve timeout under 1 s or another timeout under 10 s, 0 meaning the default) are shadPS4's, not checked on a console. An id that was never created or was deleted returns
REQUEST_NOT_FOUND, as in shadPS4; there is no network, so the timeouts are not stored - sceNpGetUserIdByAccountId - the
(account id, user id output)signature and its errors follow shadPS4: account id 0 or a null output returnsSCE_NP_ERROR_INVALID_ARGUMENT, and a signed-out NP returnsSCE_NP_ERROR_SIGNED_OUTwithout writing the output. NP is always signed out here, so no account id resolves to a user
Functional
- NP reachability callbacks retain one callback and its user data; duplicate registration and unregistering an absent callback return the errors used by shadPS4. No callback is delivered because the existing NP model remains signed out with reachability unavailable.
- sceNpCheckNpAvailability (libSceNpManager) - the
(req_id, online_id)signature and the errors follow shadPS4 with no user signed in to PSN: a null online id isSCE_NP_ERROR_INVALID_ARGUMENT, and any other online id matches no user,SCE_NP_ERROR_USER_NOT_FOUND; the request id is not checked, as in the other NpManager requests - NP state callbacks (libSceNpManager) - the registration rules are shadPS4's:
sceNpRegisterStateCallbackAkeeps up to 8 callbacks and returns the slot plus 1, a null callback returnsINVALID_ARGUMENT, a callback already registeredCALLBACK_ALREADY_REGISTEREDand a ninth oneCALLBACK_MAX(0x8055001D, np_error.h);sceNpUnregisterStateCallbackAreturnsINVALID_ARGUMENTfor an id outside 1..8 andCALLBACK_NOT_REGISTEREDfor an empty slot; the legacy sceNpRegisterStateCallback keeps one callback with the same errors. Each registration getsSIGNED_OUTfor the initial user (0x10000000) once, from the nextsceNpCheckCallbackon the calling thread. For the A form this follows KytyPS5, whose sceNpRegisterStateCallbackA marks the registration pending. KytyPS5 never calls the legacy callback (sceNpRegisterStateCallback stores nothing); it is called as(user, SIGNED_OUT, nullptr, userdata), as in shadPS4, which passes an NpId only forSIGNED_IN(L823, L938-L940). shadPS4 instead queuesSIGNED_OUTfrom the user service login event and delivers it fromsceNpCheckCallback(DispatchPendingNpStateCallbacks); the reachability callback is not given an initialUNAVAILABLE, unlike that function (L922-L961). A callback being delivered when another thread unregisters it is still called once. When and how often the console calls the state callbacks, and the errors, are not measured