From 6b9d3965c2dbdcb7b98b777a6375ba37fb0c2324 Mon Sep 17 00:00:00 2001 From: Kagamma Date: Sat, 11 Mar 2023 20:52:48 +0700 Subject: [PATCH] sceNpCreateEventFlag + _ZN3sce2np6ObjectnwEmR14SceNpAllocator + sceNpGetAccountDateOfBirth (#102) * sceNpCreateEventFlag * _ZN3sce2np6ObjectnwEmR14SceNpAllocator * Minor * Minor * Minor * sceNpGetAccountDateOfBirth * fix wrong declared sceNpCreateEventFlag * fix SceNpAllocator --------- Co-authored-by: red-prig --- src/np/ps4_libscenpcommon.pas | 47 ++++++++++++++++++++++++++++++++++ src/np/ps4_libscenpmanager.pas | 20 +++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/src/np/ps4_libscenpcommon.pas b/src/np/ps4_libscenpcommon.pas index 1a1a44ff..1399e0b0 100644 --- a/src/np/ps4_libscenpcommon.pas +++ b/src/np/ps4_libscenpcommon.pas @@ -57,9 +57,30 @@ type mspace:Pointer; end; +type + SceNpMallocFunc =function(size:size_t;userdata:Pointer):Pointer; SysV_ABI_CDecl; + SceNpReallocFunc=function(ptr:Pointer;size:size_t;userdata:Pointer):Pointer; SysV_ABI_CDecl; + SceNpFreeFunc =procedure(ptr,userdata:Pointer); SysV_ABI_CDecl; + + pSceNpAllocator=^SceNpAllocator; + SceNpAllocator=packed record + mallocFunc :SceNpMallocFunc; + reallocFunc:SceNpReallocFunc; + freeFunc :SceNpFreeFunc; + userdata :Pointer; + end; + + PSceNpObject=^SceNpObject; + SceNpObject=packed record + mem :pSceNpAllocator; // 8 + _unk1:QWord; // 16 + entry:Pointer; // 24 + end; + implementation uses + ps4_event_flag, ps4_mspace_internal, ps4_mutex, ps4_map_mm; @@ -199,6 +220,30 @@ begin end; end; +function ps4_sceNpCreateEventFlag(ef:pSceKernelEventFlag; + pName:PChar; + attr:DWORD; + initPattern:QWORD + ):Integer; SysV_ABI_CDecl; +begin + Result:=ps4_sceKernelCreateEventFlag(ef,pName,attr,initPattern,nil); + Result:=(Result shr $1F) and Result; // Looks like bool, but True when Result<0 +end; + +//void * sce::np::Object::operator_new(size_t size,SceNpAllocator *mem) +function ps4__ZN3sce2np6ObjectnwEmR14SceNpAllocator(size:size_t;mem:pSceNpAllocator):Pointer; SysV_ABI_CDecl; +var + npObj:PSceNpObject; +begin + npObj:=mem^.mallocFunc(size+$10,mem^.userdata); + if npObj<>nil then + begin + npObj^.mem:=mem; + Result:=@npObj^.entry; + end else + Result:=nil; +end; + function Load_libSceNpCommon(Const name:RawByteString):TElf_node; var lib:PLIBRARY; @@ -224,6 +269,8 @@ begin lib^.set_proc($E33C5EBE082D62B4,@ps4_sceNpMutexDestroy); // sceNpLwMutexDestroy // lib^.set_proc($07EC86217D7E0532,@ps4_sceNpHeapInit); + lib^.set_proc($EA3156A407EA01C7,@ps4_sceNpCreateEventFlag); + lib^.set_proc($D2CC8D921240355C,@ps4__ZN3sce2np6ObjectnwEmR14SceNpAllocator); end; initialization diff --git a/src/np/ps4_libscenpmanager.pas b/src/np/ps4_libscenpmanager.pas index b354cf98..6276bad8 100644 --- a/src/np/ps4_libscenpmanager.pas +++ b/src/np/ps4_libscenpmanager.pas @@ -103,6 +103,14 @@ type reserved:array[0..31] of Byte; end; + PSceNpDate=^SceNpDate; + SceNpDate=packed record + year :Word; + month:Byte; + day :Byte; + _pad :DWord; + end; + SceUserServiceUserId=Integer; SceNpStateCallback=procedure(userId:SceUserServiceUserId; @@ -461,6 +469,17 @@ begin Result:=0; end; +function ps4_sceNpGetAccountDateOfBirth(userId:SceUserServiceUserId; + pDateOfBirth:PSceNpDate):Integer; SysV_ABI_CDecl; +begin + if pDateOfBirth<>nil then + Exit(SCE_NP_ERROR_INVALID_ARGUMENT); + pDateOfBirth^.year :=1990; + pDateOfBirth^.month:=1; + pDateOfBirth^.day :=1; + Result:=0; +end; + function Load_libSceNpManager(Const name:RawByteString):TElf_node; var lib:PLIBRARY; @@ -504,6 +523,7 @@ begin lib^.set_proc($19AC6BA7711663F3,@ps4_sceNpNotifyPlusFeature); lib^.set_proc($BAA70F24B58BD3C3,@ps4_sceNpPollAsync); lib^.set_proc($337C055DB610B400,@ps4_sceNpUnregisterStateCallbackA); + lib^.set_proc($F150537917F56702,@ps4_sceNpGetAccountDateOfBirth); lib:=Result._add_lib('libSceNpManagerForToolkit'); lib^.set_proc($D1CEC76D744A52DE,@ps4_sceNpRegisterStateCallbackForToolkit);