FPPS4/ps4_libscesavedata.pas

301 lines
8.3 KiB
Plaintext

unit ps4_libSceSaveData;
{$mode objfpc}{$H+}
interface
uses
ps4_program,
Classes,
SysUtils;
Const
SCE_SAVE_DATA_TITLE_ID_DATA_SIZE=10;
SCE_SAVE_DATA_FINGERPRINT_DATA_SIZE=65;
SCE_SAVE_DATA_TITLE_MAXSIZE =128;
SCE_SAVE_DATA_SUBTITLE_MAXSIZE=128;
SCE_SAVE_DATA_DETAIL_MAXSIZE =1024;
SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE=32;
SCE_SAVE_DATA_MOUNT_POINT_DATA_MAXSIZE=16;
SCE_SAVE_DATA_MOUNT_STATUS_CREATED=$00000001;
type
PSceSaveDataParam=^SceSaveDataParam;
SceSaveDataParam=packed record
title:array[0..SCE_SAVE_DATA_TITLE_MAXSIZE-1] of AnsiChar;
subTitle:array[0..SCE_SAVE_DATA_SUBTITLE_MAXSIZE-1] of AnsiChar;
detail:array[0..SCE_SAVE_DATA_DETAIL_MAXSIZE-1] of AnsiChar;
userParam:DWORD;
align:DWORD;
mtime:QWORD;
reserved:array[0..31] of Byte;
end;
PSceSaveDataIcon=^SceSaveDataIcon;
SceSaveDataIcon=packed record
buf:Pointer;
bufSize:size_t;
dataSize:size_t;
reserved:array[0..31] of Byte;
end;
PSceSaveDataMemorySetup2=^SceSaveDataMemorySetup2;
SceSaveDataMemorySetup2=packed record
option:DWORD;
userId:Integer;
memorySize:size_t;
iconMemorySize:size_t;
initParam:PSceSaveDataParam;
initIcon:PSceSaveDataIcon;
reserved:array[0..23] of Byte;
end;
PSceSaveDataMemorySetupResult=^SceSaveDataMemorySetupResult;
SceSaveDataMemorySetupResult=packed record
existedMemorySize:size_t;
reserved:array[0..15] of Byte;
end;
PSceSaveDataDirName=^SceSaveDataDirName;
SceSaveDataDirName=array[0..SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE-1] of Char;
PSceSaveDataMountPoint=^SceSaveDataMountPoint;
SceSaveDataMountPoint=array[0..SCE_SAVE_DATA_MOUNT_POINT_DATA_MAXSIZE-1] of Char;
pSceSaveDataTitleId=^SceSaveDataTitleId;
SceSaveDataTitleId=packed record
data:array[0..SCE_SAVE_DATA_TITLE_ID_DATA_SIZE-1] of Char;
padding:array[0..5] of Byte;
end;
pSceSaveDataFingerprint=^SceSaveDataFingerprint;
SceSaveDataFingerprint=packed record
data:array[0..SCE_SAVE_DATA_FINGERPRINT_DATA_SIZE-1] of Byte;
padding:array[0..14] of Byte;
end;
pSceSaveDataMount=^SceSaveDataMount;
SceSaveDataMount=packed record
userId:Integer; //SceUserServiceUserId
align1:Integer;
titleId:pSceSaveDataTitleId;
dirName:PSceSaveDataDirName;
fingerprint:pSceSaveDataFingerprint;
blocks:QWORD; //SceSaveDataBlocks
mountMode:DWORD; //SceSaveDataMountMode
reserved:array[0..31] of Byte;
end;
PSceSaveDataMount2=^SceSaveDataMount2;
SceSaveDataMount2=packed record
userId:Integer;
align1:Integer;
dirName:PSceSaveDataDirName;
blocks:QWORD;
mountMode:DWORD;
reserved:array[0..31] of Byte;
align2:Integer;
end;
PSceSaveDataMountResult=^SceSaveDataMountResult;
SceSaveDataMountResult=packed record
mountPoint:SceSaveDataMountPoint;
requiredBlocks:QWORD;
unused:DWORD;
mountStatus:DWORD;
reserved:array[0..27] of Byte;
align1:Integer;
end;
pSceSaveDataMountInfo=^SceSaveDataMountInfo;
SceSaveDataMountInfo=packed record
blocks :QWORD; //SceSaveDataBlocks
freeBlocks:QWORD; //SceSaveDataBlocks
reserved:array[0..31] of Byte;
end;
pSceSaveDataDirNameSearchCond=^SceSaveDataDirNameSearchCond;
SceSaveDataDirNameSearchCond=packed record
userId:Integer;
_align:Integer;
titleId:pSceSaveDataTitleId;
dirName:pSceSaveDataDirName;
key:DWORD; //SceSaveDataSortKey
order:DWORD; //SceSaveDataSortOrder
reserved:array[0..31] of Byte;
end;
pSceSaveDataSearchInfo=^SceSaveDataSearchInfo;
SceSaveDataSearchInfo=packed record
blocks:QWORD; //SceSaveDataBlocks
freeBlocks:QWORD; //SceSaveDataBlocks
reserved:array[0..31] of Byte;
end;
pSceSaveDataDirNameSearchResult=^SceSaveDataDirNameSearchResult;
SceSaveDataDirNameSearchResult=packed record
hitNum:DWORD;
_align:Integer;
dirNames:pSceSaveDataDirName;
dirNamesNum:DWORD;
setNum:DWORD;
params:pSceSaveDataParam;
infos:pSceSaveDataSearchInfo;
reserved:array[0..11] of Byte;
_align2:Integer;
end;
implementation
uses
sys_signal;
function ps4_sceSaveDataInitialize(params:Pointer):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
function ps4_sceSaveDataInitialize2(params:Pointer):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
function ps4_sceSaveDataInitialize3(params:Pointer):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
function ps4_sceSaveDataTerminate:Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
function ps4_sceSaveDataSetupSaveDataMemory(userId:Integer;
memorySize:QWORD;
param:PSceSaveDataParam):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
function sceSaveDataSetupSaveDataMemory2(setupParam:PSceSaveDataMemorySetup2;
_result:PSceSaveDataMemorySetupResult):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
function ps4_sceSaveDataGetSaveDataMemory(userId:Integer;
buf:Pointer;
bufSize:size_t;
offset:QWORD):Integer; SysV_ABI_CDecl;
begin
FillChar(buf^,bufSize,0);
Result:=0;
end;
function ps4_sceSaveDataSetSaveDataMemory(userId:Integer;
buf:Pointer;
bufSize:size_t;
offset:QWORD):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
const
SCE_SAVE_DATA_ERROR_PARAMETER =-2137063424; // 0x809F0000
SCE_SAVE_DATA_ERROR_EXISTS =-2137063417; // 0x809F0007
SCE_SAVE_DATA_ERROR_MOUNT_FULL =-2137063412; // 0x809F000C
SCE_SAVE_DATA_ERROR_NOT_MOUNTED=-2137063420; // 0x809F0004
function ps4_sceSaveDataMount(mount:pSceSaveDataMount;mountResult:pSceSaveDataMountResult):Integer; SysV_ABI_CDecl;
begin
if (mount=nil) or (mountResult=nil) then Exit(SCE_SAVE_DATA_ERROR_PARAMETER);
_sig_lock;
Result:=FetchMount(PChar(mount^.dirName),@mountResult^.mountPoint);
_sig_unlock;
end;
function ps4_sceSaveDataMount2(mount:PSceSaveDataMount2;mountResult:PSceSaveDataMountResult):Integer; SysV_ABI_CDecl;
begin
if (mount=nil) or (mountResult=nil) then Exit(SCE_SAVE_DATA_ERROR_PARAMETER);
_sig_lock;
Result:=FetchMount(PChar(mount^.dirName),@mountResult^.mountPoint);
_sig_unlock;
end;
function ps4_sceSaveDataUmount(mountPoint:PSceSaveDataMountPoint):Integer; SysV_ABI_CDecl;
begin
_sig_lock;
Result:=UnMountPath(PChar(mountPoint));
_sig_unlock;
end;
function ps4_sceSaveDataGetMountInfo(mountPoint:PSceSaveDataMountPoint;
info:pSceSaveDataMountInfo):Integer; SysV_ABI_CDecl;
begin
Result:=0;
if (info<>nil) then
begin
info^:=Default(SceSaveDataMountInfo);
end;
end;
function ps4_sceSaveDataDirNameSearch(cond:pSceSaveDataDirNameSearchCond;
sres:pSceSaveDataDirNameSearchResult):Integer; SysV_ABI_CDecl;
begin
Result:=0;
if (sres<>nil) then
begin
sres^:=Default(SceSaveDataDirNameSearchResult);
end;
end;
type
SceSaveDataParamType=DWORD;
function ps4_sceSaveDataSetParam(mountPoint:PSceSaveDataMountPoint;
paramType:SceSaveDataParamType;
paramBuf:Pointer;
paramBufSize:size_t):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
function ps4_sceSaveDataSaveIcon(mountPoint:PSceSaveDataMountPoint;
param:pSceSaveDataIcon):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
function Load_libSceSaveData(Const name:RawByteString):TElf_node;
var
lib:PLIBRARY;
begin
Result:=TElf_node.Create;
Result.pFileName:=name;
lib:=Result._add_lib('libSceSaveData');
lib^.set_proc($664661B2408F5C5C,@ps4_sceSaveDataInitialize);
lib^.set_proc($9753660DE0E93465,@ps4_sceSaveDataInitialize2);
lib^.set_proc($4F2C2B14A0A82C66,@ps4_sceSaveDataInitialize3);
lib^.set_proc($C8A0F2F12E722C0D,@ps4_sceSaveDataTerminate);
lib^.set_proc($BFB00000CA342F3E,@ps4_sceSaveDataSetupSaveDataMemory);
lib^.set_proc($EC1B79A410BF01CA,@ps4_sceSaveDataGetSaveDataMemory);
lib^.set_proc($8776144735C64954,@ps4_sceSaveDataSetSaveDataMemory);
lib^.set_proc($DF61D0010770336A,@ps4_sceSaveDataMount);
lib^.set_proc($D33E393C81FE48D2,@ps4_sceSaveDataMount2);
lib^.set_proc($04C47817F51E9371,@ps4_sceSaveDataUmount);
lib^.set_proc($EB9547D1069ACFAB,@ps4_sceSaveDataGetMountInfo);
lib^.set_proc($7722219D7ABFD123,@ps4_sceSaveDataDirNameSearch);
lib^.set_proc($F39CEE97FFDE197B,@ps4_sceSaveDataSetParam);
lib^.set_proc($73CF18CB9E0CC74C,@ps4_sceSaveDataSaveIcon);
end;
initialization
ps4_app.RegistredPreLoad('libSceSaveData.prx',@Load_libSceSaveData);
end.