Files
AnyPS5/docs/dev/debt/libSceNpCppWebApi.md
T
Ararararagi c136ffa1a9 fix(libSceNpCppWebApi): name the exports the NID database resolves
The 73 sceNpCppWebApiUnknown<nn> stubs carried an APS5_EXPORT alias because their
names were placeholders. aerolib names all of them, and each name recomputes to
the NID a title imports, so the alias is dropped and the loader derives the NID
from the real symbol name, as the rest of the library does. Behaviour is
unchanged: every one of them throws.

The stubs are ordered by demangled name instead of by NID, so the Common template
instantiations and the V1/V5 accessors sit together, as the rest of the file
does. No symbol changes: the built .prx exports the same 359 NIDs as main.
2026-10-19 22:44:05 +01:00

5.9 KiB

libSceNpCppWebApi technical debt

Silent stubs

  • sce::Np::CppWebApi::Common (libSceNpCppWebApi) - the finish overrides of TransactionBase<...> (8 instantiations), DownStreamTransaction<...> (2 instantiations) and Vector<IntrusivePtr<Leaderboards::V1::User>>::pushBack return success without doing work; a failed request never produces a transaction to finish
  • sce::Np::CppWebApi::Leaderboards::V1 (libSceNpCppWebApi) - request-body and parameter bookkeeping succeeds without storing state: GetRankingRequestBody::set{StartSerialRank,Group,Limit,Users,Offset}, RecordScoreRequestBody::set{Comment,SmallData,NeedsTmpRank,ComparedDateTime,PcId}, User::{setAccountId,setPcId}, BoardsApi::ParameterToGetBoardDefinition::{initialize,terminate}, RecordApi::ParameterToRecordLargeData::{initialize,terminate}, RecordApi::ParameterToRecordScore::{initialize,setxPsnAtomicOperation,terminate}, ViewApi::ParameterToGetLargeDataByObjectId::{initialize,terminate}, ViewApi::ParameterToGetRanking::{initialize,setgetRankingRequestBody,terminate}
  • sce::Np::CppWebApi::SessionManager::V1 (libSceNpCppWebApi) - parameter bookkeeping succeeds without storing state: PlayerSessionsApi::ParameterToCreatePlayerSessions::{ctor,dtor,initialize}, PlayerSessionsApi::ParameterToGetPlayerSessionInvitations::{ctor,dtor,initialize,setfields,setinvitationInvalidFilter}, PlayerSessionsApi::ParameterToJoinPlayerSessionAsPlayer::{ctor,dtor,initialize,terminate}, PlayerSessionsApi::ParameterToLeavePlayerSession::{ctor,dtor,initialize}, RequestPlayerSession::set{MaxSpectators,InvitableUserType,JoinableUserType,ExclusiveLeaderPrivileges}, RequestPlayerSessionPlayer::setPushContexts
  • sce::Np::CppWebApi::TitleCloudStorage::V1 (libSceNpCppWebApi) - DataApi::ParameterToDownloadData::{initialize,terminate} succeed without storing state

Unknown function info

  • sce::Np::CppWebApi (libSceNpCppWebApi) - every request entry point (API calls, transaction start/getResponse/readData, the *Factory::creates) returns SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN offline. The constant's name and value follow the reference tables in shadPS4 np_error.h and fpPS4 np_error.pas, where 0x80552907 is ORBIS_NP_WEBAPI_ERROR_NOT_SIGNED_IN and 0x80552901 is OUT_OF_MEMORY (no UNAVAILABLE exists in the 0x80552901-0x8055291F range); it is the code a signed-out console returns from these entry points. The earlier 0x80552901 value came from the module the previous implementation shipped, which used the same incorrect constant
  • sce::Np::CppWebApi::Common::IntrusivePtr (libSceNpCppWebApi) - the 0x18-byte layout (object, deleter, LibContext*) and the offset of the 32-bit reference count in the pointee (0x00, 0x30 for Vector) come from the module bundled with one title (PPSA21564); other SDK versions are not checked. The destructor throws on the last reference of a pointer without a deleter: destroying the object needs its destructor and the LibContext allocator, which are not implemented
  • sce::Np::CppWebApi::Common::String (libSceNpCppWebApi) - the 0x20-byte layout (32-bit reference count, buffer at 0x08, buffer size at 0x10, LibContext* at 0x18) comes from the module bundled with one title (PPSA21564); other SDK versions are not checked. append grows the buffer with the host allocator and the destructor frees it, instead of going through the LibContext allocator. pushBack into Vector<String> stores a deep copy, so a destroyed temporary cannot invalidate the stored element; a title that byte-copies a String with a live buffer would still double-free, as nothing increments the reference count
  • sce::Np::CppWebApi::Common::Vector (libSceNpCppWebApi) - imported by PPSA03671, whose dump ships no libSceNpCppWebApi.prx. A Vector handle is an IntrusivePtr over a shared body; bodies created by pushBack use a host-side layout with the reference count at 0x30, matching the adopted-body convention measured on PPSA21564. The pointer/deleter constructor adopts a title-provided body released through the stored deleter; pushBack on such a body throws, since its element layout is unknown. begin, end, iterators and operator[] throw: the only Vectors the title reads back come from failed transactions, which never produce one
  • sce::Np::CppWebApi::SessionManager2V1 (libSceNpCppWebApi) - imported by PPSA03671. Offline, the factories, PlayerSessionsApi calls and transaction start/getResponse/readData fail with SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; parameter setters, initialize, terminate, constructors and destructors succeed without keeping state, as no request is ever sent. Response-body accessors (getSessionId, getPlayerSessions, getInvitations, the IsSet queries) throw: a failed request never produces a response object
  • libSceNpCppWebApi (libSceNpCppWebApi) - 73 exports are named from aerolib, so each name recomputes to the NID a title imports (tools/nid_names.py), and each throws. They are the Common template members (IntrusivePtr, Vector, Iterator, ConstIterator, Transaction, TransactionBase) and the TitleCloudStorage::V1 and InGameCatalog::V5 accessors: a mangled name gives the class, the method and the argument types, but the layout of the object the call is made on, the values the caller reads back and the console's errors are unknown, so no call can be answered without writing to memory no source describes. No call site is recorded for any of them