25 KiB
libSceNpCppWebApi technical debt
Functional
- Matches factory output release - releasing the last reference of an occupied output with a null deleter still throws through the shared
IntrusivePtrrelease path. The bundled modules instead use the storedLibContextallocator and model destructor in that case; the host allocator remains in use, and that fallback is unimplemented.
Silent stubs
-
sce::Np::CppWebApi title-imported parameter bookkeeping (libSceNpCppWebApi) - the
SessionManager::V1GameSessionsApiParameterTo*constructors, destructors,initializeandterminate, theRequestGameSession*/Patch*RequestBody/RequestMatch*/Added*/Removed*/RequestPlayer*/RequestTeam*/RequestMember*/RequestResults*setters, and the CommonIntrusivePtr/Vector/Transactionconstructors, destructors and bookkeeping calls over the new families succeed without keeping state or contacting the network. The values are never read because a request is never started. Behaviour beyond the signatures has no source. -
sce::Np::CppWebApi::Common (libSceNpCppWebApi) - the
finishoverrides ofDownStreamTransaction<...>(2 instantiations) andVector<IntrusivePtr<Leaderboards::V1::User>>::pushBackreturn success without doing work; a failed request never produces a transaction to finish.Transaction<...>::setOnFinishedCallbackandTransactionBase<...>::setResponseInformationOption(5 instantiations each, theUserProfile::V1,ProfanityFilter::V2andCommunicationRestrictionStatus::V3responses) return success without storing the callback or the option:startfails, so neither is ever used. The constructors and destructors of the same fiveTransaction<...>instantiations succeed without keeping state -
sce::Np::CppWebApi::Leaderboards::V1 (libSceNpCppWebApi) - request-body bookkeeping succeeds without storing state:
GetRankingRequestBody::set{StartSerialRank,Group,Limit,Users,Offset},RecordScoreRequestBody::set{Comment,SmallData,NeedsTmpRank,ComparedDateTime,PcId}andUser::{setAccountId,setPcId}.BoardsApi::ParameterToGetBoardDefinition,RecordApi::ParameterToRecordLargeData,RecordApi::ParameterToRecordScore,ViewApi::ParameterToGetLargeDataByObjectIdandViewApi::ParameterToGetRankingkeep only whether they are initialized, as the SessionManager::V1 parameters do:initializeandterminatereturn the codes of the module bundled with PPSA21564, 0x80553512 for an emptyRecordScoreRequestBodyincluded. They store none of the arguments, andsetxPsnAtomicOperationandsetgetRankingRequestBodystore nothing either -
sce::Np::CppWebApi::SessionManager::V1 (libSceNpCppWebApi) -
RequestPlayerSession::set{MaxSpectators,InvitableUserType,JoinableUserType,ExclusiveLeaderPrivileges}andRequestPlayerSessionPlayer::setPushContextssucceed without storing state. ThePlayerSessionsApiparametersParameterToCreatePlayerSessions,ParameterToGetPlayerSessionInvitations,ParameterToJoinPlayerSessionAsPlayerandParameterToLeavePlayerSessionkeep only whether they are initialized, as the TitleCloudStorage ones do:initialize,terminateandsetinvitationInvalidFilterreturn the codes of the module bundled with PPSA21564, plus 0x80553512 when the request body ofParameterToCreatePlayerSessionsorParameterToJoinPlayerSessionAsPlayeris empty. They store none of the strings or bodies, andsetfieldsstores nothing either: only a request would read them -
sce::Np::CppWebApi::TitleCloudStorage::V1 and InGameCatalog::V5 (libSceNpCppWebApi) -
DataApi::ParameterToDownloadData,DataApi::ParameterToGetMultiDataStatusesByUserandContainerApi::ParameterToGetContainerkeep only whether they are initialized.initialize,terminateand the string setters return the codes of the module bundled with PPSA21564: 0x80553503 for a nullLibContextor string, 0x80553502 for aLibContextthatCommon::initializedid not set or a parameter not yet initialized, 0x8055350f for a secondinitializeand 0x80553510 forterminatewithout one; an emptySetDataInfobody returns 0x80553512.ParameterToUploadData,ParameterToSetDataInfo,ParameterToDeleteMultiDataByUserandParameterWithBinaryRequestBodyToUploadDataadd state-less setters and keep only the initialized flag. None store values; only a request would read them.DataStatus::{getLastUpdatedDateTime,getInfo}andUploadDataResponseHeaders::{getXPsnAtomicOperationId,hasXPsnAtomicOperationId}throw, as a failed request never produces those objects. The console behaviour is not measured. -
sce::Np::CppWebApi::UserProfile::V1, ProfanityFilter::V2, CommunicationRestrictionStatus::V3 (libSceNpCppWebApi) -
FriendsApi::ParameterToGetFriends,PresenceApi::ParameterToGetBasicPresences,BlocksApi::ParameterToGetBlockingUsers,ProfanityApi::ParameterToFilterProfanityandCommunicationRestrictionStatusApi::ParameterToGetCommunicationRestrictionStatuskeep only whether they are initialized, as the SessionManager::V1 parameters do:initializeandterminatereturn the codes of the module bundled with PPSA21564, 0x80553512 for an emptyWebApiFilterRequestincluded. They store none of the arguments: only a request would read them -
sce::Np::CppWebApi::UserProfile::V1 public profiles (libSceNpCppWebApi) -
BasicProfileApi::ParameterToGetPublicProfile{ctor,dtor,initialize,terminate}andTransactionBase<IntrusivePtr<GetPublicProfilesResponse>>::setResponseInformationOptionreturn success without keeping state, as the pluralParameterToGetPublicProfilesdoes, and the constructor and destructor ofTransaction<IntrusivePtr<GetPublicProfileResponse>>do the same:startfails, so none of them is ever used -
sce::Np::CppWebApi::Activities::V1 (libSceNpCppWebApi) -
ParameterToGetUserActivities::initializeignores the account-id vector,setlimitandsetnpServiceLabelstore their value in a host block that nothing reads, andgetUserActivitiesreturnsSCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; the response accessors throw because an offline request never produces a response object. The 0x10-byte handle and the lifecycle codes come from the module bundled with PPSA21564/PPSA23732 (buildsJ03093737/J03341606, addresses0x3e7a10,0x3e7a70,0x3e7cb0,0x3e7e50,0x3e7ec0,0x3e7f20); the module's setters write no return value, so they stayvoid. Nothing here is measured on a console. PPSA22408 (Hot Wheels Infinite Rush) imports the 15 NIDs
Unknown function info
-
sce::Np::CppWebApi (libSceNpCppWebApi) - every request entry point (API calls, transaction
start/getResponse/readData, the*Factory::creates) returnsSCE_NP_WEBAPI_ERROR_NOT_SIGNED_INoffline. The constant's name and value follow the reference tables in shadPS4np_error.hand fpPS4np_error.pas, where0x80552907isORBIS_NP_WEBAPI_ERROR_NOT_SIGNED_INand0x80552901isOUT_OF_MEMORY(noUNAVAILABLEexists in the0x80552901-0x8055291Frange); it is the code a signed-out console returns from these entry points. The earlier0x80552901value 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; in aVector, 0x20 forunsigned long, 0x30 forIntrusivePtrand 0x38 forStringelements) 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 theLibContextallocator, which are not implemented -
sce::Np::CppWebApi::Common::String (libSceNpCppWebApi) - the 0x20-byte layout (32-bit reference count, buffer at 0x08, used size including the terminator at 0x10,
LibContext*at 0x18), the+0x10semantics and the0x80553503/0x80553504results follow the module bundled with PPSA21564 and PPSA23732 (builds J03093737/J03341606):append,copyFrom,clear,size,length,operator==,setContextand the intrusive reference operations match it. Allocation and release still use the host allocator instead of theLibContextallocator, so a title-provided buffer released through this destructor would use the wrong allocator;find,replaceandnposremain unimplemented.pushBackintoVector<String>stores a deep copy, so a destroyed temporary cannot invalidate the stored element; a title that byte-copies aStringwith 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. AVectorhandle is anIntrusivePtrover a shared body; bodies created bypushBackuse a host layout with the reference count at 0x30. The pointer/deleter constructor adopts a title-providedVector<String>, counting the reference at 0x38, which theVector<String>constructor zeroes, as the module bundled with PPSA21564 does, and releases it through the stored deleter;pushBackon such a body throws, as its element layout is unknown.Vector<String>::begin/endandIterator<String>operators walk host-created bodies and throw on title-provided ones; otherbegin,endand iterators, andcopyFrom, throw: the onlyVectors the title reads back come from failed transactions, which never produce one.empty,sizeandoperator[]read host-created bodies and throw on title-provided ones -
sce::Np::CppWebApi::Common::Binary (libSceNpCppWebApi) - the 0x20-byte layout (32-bit reference count, buffer at 0x08, size at 0x10,
LibContext*at 0x18) comes from the module bundled with PPSA21564/PPSA23732 (buildsJ03093737/J03341606); other SDK versions are not checked.setBinaryandappendBinaryuse the host allocator instead of theLibContextallocator, reject a null source with a non-zero size where the module does not, keep the old contents when the input is invalid or allocation fails, and copy the input before releasing a buffer it aliases. A title that byte-copies aBinarywith a live buffer would double-free, as nothing increments the reference count -
sce::Np::CppWebApi::Common::Vector audited members (libSceNpCppWebApi) -
begin,end, iterators andcopyFromfollow the bundled module for the auditedIntrusivePtr/unsigned longfamilies (iterator = zero tag plus element pointer;copyFromreplaces elements through the element reference count) and throw on adopted bodies and other families; they accept either theIntrusivePtrhandle or the object itsoperator->returns, which module bodies read at offsets 0x18/0x28.copyFromreleases old elements — a deliberate deviation: the module installs the fresh zeroed array before its release loop -
sce::Np::CppWebApi::SessionManager::V1 friends player sessions (libSceNpCppWebApi) - the
getFriendsPlayerSessionsfamily follows the module bundled with the titles (build J03341606):Friendstores account id at 0x10,accountIdIsSetat 0x18,IntrusivePtr<Vector<FriendJoinedPlayerSession>>at 0x30 andplayerSessionsIsSetat 0x48;FriendJoinedPlayerSessionstoresString sessionIdat 0x10 andsessionIdIsSetat 0x30; the response body storesIntrusivePtr<Vector<Friend>>at 0x30. Vector views use the real inline layout (begin 0x18, end 0x28, refcount 0x30, 0x18-byte elements). The model layouts are measured in build J03341606; destroying the last vector reference without a deleter throws until the allocator lands. Other builds are not checked. -
sce::Np::CppWebApi::SessionManager::V1 friends transaction (libSceNpCppWebApi) - the transaction is 0x10 bytes; its constructor zeroes it.
startreturns 0x80553503 for a null context, 0x80553502 for an uninitialized context and thenSCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN;getResponseandgetFriendsPlayerSessionsreturn 0x80553508 while the two transaction words are zero. No response is produced; these offline paths are not console measurements. -
sce::Np::CppWebApi::SessionManager2V1 (libSceNpCppWebApi) - imported by PPSA03671. Offline, the factories,
PlayerSessionsApicalls and transactionstart/getResponse/readDatafail withSCE_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, theIsSetqueries) throw: a failed request never produces a response object -
sce::Np::CppWebApi::Matchmaking::V1 (libSceNpCppWebApi) - imported by PPSA21564 (86 of 92) and PPSA05510, PPSA25256, PPSA17226 and PPSA08395 for the other six; behaviour comes from the module bundled with PPSA21564/PPSA23732 (builds J03093737/J03341606), not from a console. Offline, the four
Apicalls and four factories returnSCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN. The fourParameterTo*objects keep only an initialized flag:initializereturns 0x80553503 for a null context or string, 0x80553502 for an unset context, 0x8055350f when already initialized and 0x80553512 for an emptySubmitTicketRequestBody;terminatereturns 0x80553510.ParameterToGetTicket::setviewreturns 0x80553502 uninitialized and 0x80553503 for a null string. Other setters succeed without keeping state. Response accessors throw: a failed request produces no response. 0x80553504 is never returned; the stub stores a static pointer. -
sce::Np::CppWebApi::UserProfile::V1, ProfanityFilter::V2, CommunicationRestrictionStatus::V3 (libSceNpCppWebApi) - imported by an Epic Online Services module whose dump ships no
libSceNpCppWebApi.prx. The 0x10-byteResponseHeaderBase(count at 0x00, header block at 0x08) comes from PPSA21564/PPSA23732J03093737/J03341606(0x14980,0x149a0,0x149b0);getHeaderValuereturns 0x80553512 when the block is null and throws when it is present. TheWebApiFilterRequestoffset 0x00 is assumed, not measured. Offline, the five API calls,WebApiFilterRequestFactory::createand the transactions'start/getResponseHeadersfail withSCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN. Response accessors throw: a failed request never produces a response. TheVector/Iteratormembers overIntrusivePtr<UserProfile::V1::BasicPresence>follow the bundled module on host-created bodies and throw on title-provided ones. Nothing can create a hostVector<unsigned long>body, so itsbegin,endand iterator throw for every non-empty vector -
libSceNpCppWebApi (libSceNpCppWebApi) - unimplemented stubs have their parameter lists, const qualifiers and return types aligned with the demangled symbols confirmed by NID matching in #8143. They cover response-body accessors, iterators, and uninstantiated transactions in Leaderboards::V1, SessionManager::V1, InGameCatalog::V5, TitleCloudStorage::V1, and Common templates: each mangled name gives the method and parameter types, but the runtime layout of response objects and errors are unverified on console, so each call continues to throw NotImplemented_nid_no_patch. No call site is recorded for them
-
sce::Np::CppWebApi::SessionManager2V1 and sce::Np::CppWebApi::InGameCatalog2V5 (libSceNpCppWebApi) - 198 further exports imported by PPSA20397, named from aerolib. API calls, factories and transaction
start/getResponse*failSCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; parameter bookkeeping succeeds without state, except thePlayerSessionsApiparameters, which track it per SessionManager::V1;IntrusivePtr/Vectorhelpers follow the layouts above,Vector::empty/size/operator[]reading host bodies and throwing on title-provided ones. The audited accessors read the offsets in the next entry; the other response accessors, iterators,Vector::begin/end/copyFromand transactionoperator=throw: no response object exists. Asstartnever succeeds here,TransactionBase::finishandabortreturn 0x80553508 andgetIdreturns 0, as the bundled module does while itsTransactionconstructor's zeroed words are unset -
sce::Np::CppWebApi::InGameCatalog2V5 audited accessors (libSceNpCppWebApi) - measured on the
sce_modulecopy oflibSceNpCppWebApi.prxbundled with PPSA21564 (buildJ03093737): theSkuprice/label fields and*IsSetbytes,ProductgetId/getType/getDisplayName/getDescription/getReleaseDate/releaseDateIsSet/skusIsSet/getSkus,Container::getChildren(vector handle at 0x228) and the Container-responseTransactionBase::operator=/startguards -
sce::Np::CppWebApi::SessionManager2V1 audited accessors (libSceNpCppWebApi) - measured on the same bundled module:
PlayerSession::getSessionId(string at 0x10) andgetMember(pointer member at 0x30),PlayerSessionForReadgetLeader(0xf8),getCustomData1/getCustomData2(strings at 0x1c8/0x1e8),customData2IsSet(byte at 0x200) andgetExclusiveLeaderPrivileges(pointer member at 0x188),ResponsePlayerSessionPlayergetPlatform(member at 0x18) andgetAccountId(word at 0x10),GetPlayerSessionsResponseBody::getPlayerSessions(0x30),ResponsePlayerSessionMemberPlayer::getPlayers(0x10), the matching iterators,Vectorbegin/end/empty/sizeandResponsePlayerSessionPlayercopyFrom/size -
sce::Np::CppWebApi::UserProfile::V1, sce::Np::CppWebApi::CommunicationRestrictionStatus::V3 and the remaining sce::Np::CppWebApi::Common instantiations (libSceNpCppWebApi) - 87 further exports imported by PPSA20397, plus the previously-throwing
ContainerApi::ParameterToGetContainerlifecycle andgetContainer. API verbs and transactionstart/getResponsefailSCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; parameter and model bookkeeping (initialize,terminate,set*, constructors, destructors) succeeds without state.ResponseHeaderBase::getHeaderValueand the remaining response accessors and transactionabort/getId/operator=throw: no response object exists offline -
sce::Np::CppWebApi::Common::TransactionBase and Transaction (libSceNpCppWebApi) - not read in a module for the four
UserProfile::V1transactions: theirabortandgetIdreturn 0x80553508 and 0, as theTransactionBasecode read in the PPSA21564 module does for six and five other instantiations (#11235). TheInGameCatalog::V5Vector<IntrusivePtr<Container>>andTitleCloudStorage::V1GetMultiDataStatusesResponseBodytransactions still throw fromstartandDataApi::getMultiDataStatusesByUser: past theLibContextchecks (0x80553503, 0x80553502), the module bundled with PPSA21567 returns whatlibSceNpWebApi2and the service answer, which is not measured. TheirgetResponsereturns 0x80553508 and writes nothing, as that module does while the words at +0 and +8 are null -
sce::Np::CppWebApi audited member batch (libSceNpCppWebApi) - the second audited batch implements
BasicProfile::getOnlineId/getPersonalDetail/getIsOfficiallyVerified,BasicPresence::accountIdIsSet,PersonalDetail::getDisplayName, thePlayerSessionForReadgetters and*IsSetbytes,PlayerSession::getMember,ResponsePlayerSessionPlayer::{getPlatform,getAccountId},FilterProfanityResponse::getMessage, theGet*Response/GetPlayerSessionsResponseBodyvector getters,Vector<String>::copyFrom,Vector<IntrusivePtr<BasicProfile>>::begin, theBasicProfile/Skuiterator compare/advance and the CRS-responseTransactionBase::operator=.Vector<String>::copyFromdeviates by design: the bundled module allocates a freshmax(8, 2n)array and assigns each string over it without releasing the old elements; the host releases them first, avoiding the orphan leak the module accepts -
sce::Np::CppWebApi::UserProfile::V1 audited accessors (libSceNpCppWebApi) - measured on the bundled module:
BasicPresenceconstruct/destruct,set{AccountId,InContext,OnlineStatus},get{AccountId,InContext,OnlineStatus}and theinContextIsSet/onlineStatusIsSet/accountIdIsSetbytes at 0x22/0x20/0x18;BasicProfileconstruct/destruct,setOnlineId,setIsOfficiallyVerified,getOnlineId(0x14 bytes at 0x10/0x20),getPersonalDetail(pointer member at 0x28),getIsOfficiallyVerified(byte at 0xa9) and theonlineIdIsSet/personalDetailIsSet/isOfficiallyVerifiedIsSetbytes at 0x24/0x40/0xaa;PersonalDetail::getDisplayName(member at 0x88) -
sce::Np::CppWebApi::UserProfile::V1 and CommunicationRestrictionStatus::V3 audited response accessors (libSceNpCppWebApi) - measured on the bundled module:
GetPublicProfilesResponse::getProfiles(vector handle at 0x30),GetFriendsResponse::getFriends/GetBlockingUsersResponse::getBlocks(members at 0x30),GetBasicPresencesResponse::getBasicPresences(pointer member at 0x30),FilterProfanityResponse::getMessage(member at 0x38) and the restriction responsegetRestricted(byte at 0x30) -
sce::Np::CppWebApi title-imported exports (libSceNpCppWebApi) - exports imported by the
sce_modulecopies shipped with PPSA20397 and PPSA03530 that main did not declare. NIDs and signatures come only from the titles' import tables; const and return types are inferred from the demangled name. Layouts and offline behaviour follow the landed same-template implementations sourced from the module bundled with PPSA21564. The audited subset reads the bundled module's measured layouts — model fields,Vector/Iteratormembers,copyFromand the transactionoperator=/startguards; the rest still throw: a failed request produces no response object.SessionManager::V1GameSessionsApi,Matches::V1,Matchmaking::V1,UserProfile::V1,TitleCloudStorage::V1andInGameCatalog::V5accessors have no other source, so behaviour is only what the signatures admit. -
sce::Np::CppWebApi::Matches::V1 (libSceNpCppWebApi) - imported by PPSA21564/PPSA23732 (builds
J03093737/J03341606). The 34 request/model setters store the value and the is-set flag at the measured offsets; the 10 vector setters copy theIntrusivePtrhandle and increment the body reference count at +0x30 instead of deep-copying the elements, which is a host choice. A constructor-created empty vector (null backing pointer) is a valid value: those setters copy the empty handle and set the flag instead of returning 0x80553512. The sixParameterTo*objects allocate a host implementation of the module's layout andinitialize/terminatefollow the measured results. The host allocator stands in for the module'sLibContextallocator. Twelve factories are implemented from the PPSA03530 (GTA Vice City) bundled module's create protocol: null context or out returns 0x80553503, allocation failure returns 0x80553504, the object is wrapped{object, deleter, context}intooutand each create parameter is stored at its measured offset.CreateMatchRequestFactory's host size 0xb8 exceeds the module's 0x88 to keep the measured setter range at +152..+176 inside the allocation. The remaining ten factories still throwNotImplemented_nid_no_patch: their second create parameters have no measured field offset. TheTitleCloudStorage2V1::DataStatusVector::begin/enditerators produce the host iterator, matching the module's[self]/[self+0x10]element reads;Product::getLabeland the TitleCloudStorageTransactionBase::startstill throw, their bodies unmeasured past the first checks. Only the six API verbs keepSCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN. The three accessors read +0x30/+0x48/+0x28. Response layouts beyond those fields are unverified.