This commit is contained in:
Pavel 2022-11-29 10:42:53 +03:00
parent b28067fd3c
commit 0bdca7613b
8 changed files with 128 additions and 40 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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