feat(libSceNpCppWebApi): implement audited model accessors and iterators from bundled module
26 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) - Console behaviour not measured:
DataApi::ParameterToDownloadData,DataApi::ParameterToGetMultiDataStatusesByUserandContainerApi::ParameterToGetContainerkeep only whether they are initialized;initialize,terminateand the string setters return the PPSA21564 bundled module codes - 0x80553503 (nullLibContextor string), 0x80553502 (uninitialized context or parameter), 0x8055350f (secondinitialize), 0x80553510 (terminatefirst), 0x80553512 (emptySetDataInfo). The upload/setter parameters add state-less setters keeping only the initialized flag; none store values. TheDataStatusgetters andUploadDataResponseHeaders::{getXPsnAtomicOperationId,hasXPsnAtomicOperationId}read the bundled module's offsets; the remaining response accessors throw - a failed request never produces them. -
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). The InGameCatalog Container transaction'sstartruns theLibContextchecks (0x80553503, 0x80553502), then returnsSCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN, asDataApi::getMultiDataStatusesByUserdoes directly; the TitleCloudStorage transaction'sstartthrows - whatlibSceNpWebApi2and the service answer past those checks is not measured.getResponsereturns 0x80553508 while the words at +0 and +8 are null (that module); the Container one throws once both are set, the response likewise unmeasured -
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 third audited accessor batch (libSceNpCppWebApi) - measured on the modules bundled with PPSA21564 (build J03093737) and PPSA03524 (J01397853), which agree on every offset:
EntrygetRank/getScore/getAccountId/getOnlineId(0x88/0x90/0x10, id at 0x69);SessionManager2V1model getters (members at 0x10-0x120,IsSetbytes at 0xc8-0x128) and thegetGameSessions/getEntriesvector handles at 0x30;DataStatusgetters (0x10-0xb4),getDataStatusList(0x30) andgetTotalDataStatusCount(0x5c);get/hasXPsnAtomicOperationId(pointer 0x10, byte 0x20);getTicketId(0x30);PersonalDetailname getters (0x10/0x38/0x60,IsSetat 0x30/0x58/0x80); theEntry/DataStatus/BasicProfile/StringVector/Iteratormembers follow the host-body layouts. The Container-responsegetResponsemirrors the module's not-started guard (0x80553508) and throws past it -
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.