mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
b28067fd3c
commit
0bdca7613b
|
@ -38,6 +38,9 @@ function ps4_sceKernelWrite(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI
|
|||
function ps4_pwrite(fd:Integer;data:Pointer;size,offset:Int64):Int64; SysV_ABI_CDecl;
|
||||
function ps4_sceKernelPwrite(fd:Integer;buf:Pointer;nbytes,offset:Int64):Int64; SysV_ABI_CDecl;
|
||||
|
||||
function ps4_ftruncate(fd:Integer;size:Int64):Integer; SysV_ABI_CDecl;
|
||||
function ps4_sceKernelFtruncate(fd:Integer;size:Int64):Integer; SysV_ABI_CDecl;
|
||||
|
||||
function ps4_fstat(fd:Integer;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
||||
function ps4_sceKernelFstat(fd:Integer;stat:PSceKernelStat):Integer; SysV_ABI_CDecl;
|
||||
|
||||
|
@ -467,6 +470,38 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function _sys_ftruncate(fd:Integer;size:Int64):Integer;
|
||||
var
|
||||
f:TCustomFile;
|
||||
begin
|
||||
if (fd<0) then Exit(EINVAL);
|
||||
if (size<=0) then Exit(EINVAL);
|
||||
|
||||
f:=_sys_acqure_fd(fd);
|
||||
if (f=nil) then Exit(EBADF);
|
||||
|
||||
Result:=f.ftruncate(size);
|
||||
|
||||
f.Release;
|
||||
end;
|
||||
|
||||
function ps4_ftruncate(fd:Integer;size:Int64):Integer; SysV_ABI_CDecl;
|
||||
begin
|
||||
_sig_lock;
|
||||
Result:=_set_errno(_sys_ftruncate(fd,size));
|
||||
_sig_unlock;
|
||||
end;
|
||||
|
||||
function ps4_sceKernelFtruncate(fd:Integer;size:Int64):Integer; SysV_ABI_CDecl;
|
||||
begin
|
||||
_sig_lock;
|
||||
Result:=_sys_ftruncate(fd,size);
|
||||
_sig_unlock;
|
||||
|
||||
_set_errno(Result);
|
||||
Result:=px2sce(Result);
|
||||
end;
|
||||
|
||||
function _sys_fstat(fd:Integer;stat:PSceKernelStat):Integer;
|
||||
var
|
||||
f:TCustomFile;
|
||||
|
@ -475,7 +510,7 @@ begin
|
|||
if (stat=nil) then Exit(EINVAL);
|
||||
|
||||
f:=_sys_acqure_fd(fd);
|
||||
if (f=nil) then Exit(-EBADF);
|
||||
if (f=nil) then Exit(EBADF);
|
||||
|
||||
Result:=f.fstat(stat);
|
||||
|
||||
|
|
|
@ -1030,6 +1030,7 @@ begin
|
|||
lib^.set_proc($FABDEB305C08B55E,@ps4_sceKernelPread);
|
||||
lib^.set_proc($E304B37BDD8184B2,@ps4_sceKernelWrite);
|
||||
lib^.set_proc($9CA5A2FCDD87055E,@ps4_sceKernelPwrite);
|
||||
lib^.set_proc($556DD355988CE3F1,@ps4_sceKernelFtruncate);
|
||||
lib^.set_proc($901C023EC617FE6E,@ps4_sceKernelFstat);
|
||||
|
||||
lib^.set_proc($B5A4568532454E01,@ps4_sceKernelGetdirentries);
|
||||
|
@ -1056,6 +1057,7 @@ begin
|
|||
|
||||
lib^.set_proc($0B6909FDBC92E6B3,@ps4_pwrite); //pwrite
|
||||
|
||||
lib^.set_proc($8A1E020FDFE08213,@ps4_ftruncate);
|
||||
lib^.set_proc($9AA40C875CCF3D3F,@ps4_fstat);
|
||||
|
||||
lib^.set_proc($7F4F4ABC83F2FD06,@ps4_getdirentries);
|
||||
|
|
16
rtl/mmap.pas
16
rtl/mmap.pas
|
@ -232,7 +232,7 @@ Var
|
|||
fileSize:size_t;
|
||||
maxSize:size_t;
|
||||
|
||||
info:BY_HANDLE_FILE_INFORMATION;
|
||||
//info:BY_HANDLE_FILE_INFORMATION;
|
||||
begin
|
||||
Result:=0;
|
||||
if (Addr=nil) then Exit(-1);
|
||||
|
@ -243,11 +243,17 @@ begin
|
|||
Exit(GetLastError);
|
||||
end;
|
||||
|
||||
info:=Default(BY_HANDLE_FILE_INFORMATION);
|
||||
Result:=SwGetFileInformationByHandle(h,@info);
|
||||
if (Result<>0) then Exit;
|
||||
fileSize:=0;
|
||||
if not GetFileSizeEx(h,@fileSize) then
|
||||
begin
|
||||
Exit(GetLastError);
|
||||
end;
|
||||
|
||||
fileSize:=info.nFileSizeLow or (QWORD(info.nFileSizeHigh) shl 32);
|
||||
//info:=Default(BY_HANDLE_FILE_INFORMATION);
|
||||
//Result:=SwGetFileInformationByHandle(h,@info);
|
||||
//if (Result<>0) then Exit;
|
||||
|
||||
//fileSize:=info.nFileSizeLow or (QWORD(info.nFileSizeHigh) shl 32);
|
||||
|
||||
maxSize:=offst+len;
|
||||
|
||||
|
|
|
@ -21,8 +21,9 @@ implementation
|
|||
type
|
||||
TDevFile=class(TCustomFile)
|
||||
Constructor Create;
|
||||
function lseek (offset:Int64;whence:Integer):Int64; override;
|
||||
function fstat (stat:PSceKernelStat):Integer; override;
|
||||
function lseek (offset:Int64;whence:Integer):Int64; override;
|
||||
function ftruncate(size:Int64):Integer; override;
|
||||
function fstat (stat:PSceKernelStat):Integer; override;
|
||||
end;
|
||||
|
||||
TDevRandom=class(TDevFile)
|
||||
|
@ -106,6 +107,11 @@ begin
|
|||
Result:=-ESPIPE;
|
||||
end;
|
||||
|
||||
function TDevFile.ftruncate(size:Int64):Integer;
|
||||
begin
|
||||
Result:=EACCES;
|
||||
end;
|
||||
|
||||
function TDevFile.fstat (stat:PSceKernelStat):Integer;
|
||||
begin
|
||||
Result:=0;
|
||||
|
|
|
@ -54,13 +54,14 @@ type
|
|||
pos:DWORD;
|
||||
Constructor Create;
|
||||
Destructor Destroy; override;
|
||||
function read (data:Pointer;size:Int64):Int64; override;
|
||||
function pread (data:Pointer;size,offset:Int64):Int64; override;
|
||||
function readv (vector:p_iovec;count:Integer):Int64; override;
|
||||
function write (data:Pointer;size:Int64):Int64; override;
|
||||
function pwrite(data:Pointer;size,offset:Int64):Int64; override;
|
||||
function fstat (stat:PSceKernelStat):Integer; override;
|
||||
function lseek (offset:Int64;whence:Integer):Int64; override;
|
||||
function read (data:Pointer;size:Int64):Int64; override;
|
||||
function pread (data:Pointer;size,offset:Int64):Int64; override;
|
||||
function readv (vector:p_iovec;count:Integer):Int64; override;
|
||||
function write (data:Pointer;size:Int64):Int64; override;
|
||||
function pwrite (data:Pointer;size,offset:Int64):Int64; override;
|
||||
function ftruncate (size:Int64):Integer; override;
|
||||
function fstat (stat:PSceKernelStat):Integer; override;
|
||||
function lseek (offset:Int64;whence:Integer):Int64; override;
|
||||
function getdirentries(buf:Pointer;nbytes:Int64;basep:PInt64):Int64; override;
|
||||
end;
|
||||
|
||||
|
@ -277,6 +278,11 @@ begin
|
|||
Result:=-EISDIR;
|
||||
end;
|
||||
|
||||
function TDirFile.ftruncate(size:Int64):Integer;
|
||||
begin
|
||||
Result:=EISDIR;
|
||||
end;
|
||||
|
||||
function TDirFile.fstat (stat:PSceKernelStat):Integer;
|
||||
begin
|
||||
Result:=_sys_dir_stat(path,stat);
|
||||
|
|
|
@ -196,13 +196,14 @@ type
|
|||
var
|
||||
fd:Integer;
|
||||
Handle:THandle;
|
||||
function lseek (offset:Int64;whence:Integer):Int64; virtual;
|
||||
function read (data:Pointer;size:Int64):Int64; virtual;
|
||||
function pread (data:Pointer;size,offset:Int64):Int64; virtual;
|
||||
function readv (vector:p_iovec;count:Integer):Int64; virtual;
|
||||
function write (data:Pointer;size:Int64):Int64; virtual;
|
||||
function pwrite(data:Pointer;size,offset:Int64):Int64; virtual;
|
||||
function fstat (stat:PSceKernelStat):Integer; virtual;
|
||||
function lseek (offset:Int64;whence:Integer):Int64; virtual;
|
||||
function read (data:Pointer;size:Int64):Int64; virtual;
|
||||
function pread (data:Pointer;size,offset:Int64):Int64; virtual;
|
||||
function readv (vector:p_iovec;count:Integer):Int64; virtual;
|
||||
function write (data:Pointer;size:Int64):Int64; virtual;
|
||||
function pwrite (data:Pointer;size,offset:Int64):Int64; virtual;
|
||||
function ftruncate (size:Int64):Integer; virtual;
|
||||
function fstat (stat:PSceKernelStat):Integer; virtual;
|
||||
function getdirentries(buf:Pointer;nbytes:Int64;basep:PInt64):Int64; virtual;
|
||||
end;
|
||||
|
||||
|
@ -248,9 +249,14 @@ begin
|
|||
Result:=-ENOTSUP;
|
||||
end;
|
||||
|
||||
function TCustomFile.ftruncate(size:Int64):Integer;
|
||||
begin
|
||||
Result:=ENOTSUP;
|
||||
end;
|
||||
|
||||
function TCustomFile.fstat (stat:PSceKernelStat):Integer;
|
||||
begin
|
||||
Result:=-ENOTSUP;
|
||||
Result:=ENOTSUP;
|
||||
end;
|
||||
|
||||
function TCustomFile.getdirentries(buf:Pointer;nbytes:Int64;basep:PInt64):Int64;
|
||||
|
|
|
@ -24,13 +24,14 @@ type
|
|||
lock:TRWLock;
|
||||
Constructor Create;
|
||||
Destructor Destroy; override;
|
||||
function lseek (offset:Int64;whence:Integer):Int64; override;
|
||||
function read (data:Pointer;size:Int64):Int64; override;
|
||||
function pread (data:Pointer;size,offset:Int64):Int64; override;
|
||||
function readv (vector:p_iovec;count:Integer):Int64; override;
|
||||
function write (data:Pointer;size:Int64):Int64; override;
|
||||
function pwrite(data:Pointer;size,offset:Int64):Int64; override;
|
||||
function fstat (stat:PSceKernelStat):Integer; override;
|
||||
function lseek (offset:Int64;whence:Integer):Int64; override;
|
||||
function read (data:Pointer;size:Int64):Int64; override;
|
||||
function pread (data:Pointer;size,offset:Int64):Int64; override;
|
||||
function readv (vector:p_iovec;count:Integer):Int64; override;
|
||||
function write (data:Pointer;size:Int64):Int64; override;
|
||||
function pwrite (data:Pointer;size,offset:Int64):Int64; override;
|
||||
function ftruncate(size:Int64):Integer; override;
|
||||
function fstat (stat:PSceKernelStat):Integer; override;
|
||||
end;
|
||||
|
||||
Function get_DesiredAccess(flags:Integer):DWORD;
|
||||
|
@ -233,9 +234,9 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
procedure _set_pos(h:THandle;p:Int64);
|
||||
function _set_pos(h:THandle;p:Int64):Boolean;
|
||||
begin
|
||||
SetFilePointerEx(h,LARGE_INTEGER(p),nil,FILE_BEGIN);
|
||||
Result:=SetFilePointerEx(h,LARGE_INTEGER(p),nil,FILE_BEGIN);
|
||||
end;
|
||||
|
||||
function TFile.pread (data:Pointer;size,offset:Int64):Int64;
|
||||
|
@ -254,7 +255,7 @@ begin
|
|||
//NOTE: pread and pwrite don't change the file position, but ReadFile/WriteFile do, damn it.
|
||||
p:=_get_pos(Handle);
|
||||
R:=ReadFile(Handle,data^,size,N,@O);
|
||||
_set_pos(Handle,p);
|
||||
if not _set_pos(Handle,p) then Assert(False);
|
||||
rwlock_unlock(lock);
|
||||
|
||||
if R then
|
||||
|
@ -334,7 +335,7 @@ begin
|
|||
//NOTE: pread and pwrite don't change the file position, but ReadFile/WriteFile do, damn it.
|
||||
p:=_get_pos(Handle);
|
||||
R:=WriteFile(Handle,data^,size,N,@O);
|
||||
_set_pos(Handle,p);
|
||||
if not _set_pos(Handle,p) then Assert(False);
|
||||
rwlock_unlock(lock);
|
||||
|
||||
if R then
|
||||
|
@ -346,6 +347,29 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TFile.ftruncate(size:Int64):Integer;
|
||||
var
|
||||
p:Int64;
|
||||
begin
|
||||
Result:=0;
|
||||
rwlock_wrlock(lock);
|
||||
p:=_get_pos(Handle);
|
||||
|
||||
if _set_pos(Handle,size) then
|
||||
begin
|
||||
if not SetEndOfFile(Handle) then
|
||||
begin
|
||||
Result:=EIO;
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
Result:=EINVAL;
|
||||
end;
|
||||
|
||||
if not _set_pos(Handle,p) then Assert(False);
|
||||
rwlock_unlock(lock);
|
||||
end;
|
||||
|
||||
function file_attr_to_st_mode(attr:DWORD):Word;
|
||||
begin
|
||||
Result:=S_IRUSR;
|
||||
|
|
|
@ -56,12 +56,15 @@ procedure safe_move_ptr(const src;var dst);
|
|||
function safe_test(var src:DWORD;value:DWORD):Boolean;
|
||||
function safe_str(P:PChar):shortstring;
|
||||
|
||||
function MapViewOfFileEx(hFileMappingObject:HANDLE;
|
||||
dwDesiredAccess:DWORD;
|
||||
dwFileOffsetHigh:DWORD;
|
||||
dwFileOffsetLow:DWORD;
|
||||
dwNumberOfBytesToMap:SIZE_T;
|
||||
lpBaseAddress:LPVOID):LPVOID; stdcall; external 'kernel32' name 'MapViewOfFileEx';
|
||||
function GetFileSizeEx(hFile:HANDLE;
|
||||
lpFileSize:PLARGE_INTEGER):BOOL; stdcall; external 'kernel32';
|
||||
|
||||
function MapViewOfFileEx(hFileMappingObject:HANDLE;
|
||||
dwDesiredAccess:DWORD;
|
||||
dwFileOffsetHigh:DWORD;
|
||||
dwFileOffsetLow:DWORD;
|
||||
dwNumberOfBytesToMap:SIZE_T;
|
||||
lpBaseAddress:LPVOID):LPVOID; stdcall; external 'kernel32' name 'MapViewOfFileEx';
|
||||
|
||||
implementation
|
||||
|
||||
|
|
Loading…
Reference in New Issue