mirror of https://github.com/red-prig/fpPS4.git
sceKernelPreadv
This commit is contained in:
parent
66f585c245
commit
ae44cd497a
|
@ -32,6 +32,9 @@ function ps4_sceKernelPread(fd:Integer;buf:Pointer;nbytes,offset:Int64):Int64; S
|
|||
function ps4_readv(fd:Integer;vector:p_iovec;count:Integer):Int64; SysV_ABI_CDecl;
|
||||
function ps4_sceKernelReadv(fd:Integer;iov:p_iovec;iovcnt:Integer):Int64; SysV_ABI_CDecl;
|
||||
|
||||
function ps4_preadv(fd:Integer;vector:p_iovec;count:Integer;offset:Int64):Int64; SysV_ABI_CDecl;
|
||||
function ps4_sceKernelPreadv(fd:Integer;iov:p_iovec;iovcnt:Integer;offset:Int64):Int64; SysV_ABI_CDecl;
|
||||
|
||||
function ps4_write(fd:Integer;data:Pointer;size:Int64):Int64; SysV_ABI_CDecl;
|
||||
function ps4_sceKernelWrite(fd:Integer;buf:Pointer;nbytes:Int64):Int64; SysV_ABI_CDecl;
|
||||
|
||||
|
@ -314,6 +317,38 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function ps4_preadv(fd:Integer;vector:p_iovec;count:Integer;offset:Int64):Int64; SysV_ABI_CDecl;
|
||||
begin
|
||||
_sig_lock;
|
||||
Result:=_sys_preadv(fd,vector,count,offset);
|
||||
_sig_unlock;
|
||||
|
||||
if (Result<0) then
|
||||
begin
|
||||
Result:=_set_errno(-Result);
|
||||
end else
|
||||
begin
|
||||
_set_errno(0);
|
||||
end;
|
||||
end;
|
||||
|
||||
function ps4_sceKernelPreadv(fd:Integer;iov:p_iovec;iovcnt:Integer;offset:Int64):Int64; SysV_ABI_CDecl;
|
||||
begin
|
||||
_sig_lock;
|
||||
Result:=_sys_preadv(fd,iov,iovcnt,offset);
|
||||
_sig_unlock;
|
||||
|
||||
if (Result<0) then
|
||||
begin
|
||||
Result:=-Result;
|
||||
_set_errno(Result);
|
||||
Result:=px2sce(Result);
|
||||
end else
|
||||
begin
|
||||
_set_errno(0);
|
||||
end;
|
||||
end;
|
||||
|
||||
function ps4_write(fd:Integer;data:Pointer;size:Int64):Int64; SysV_ABI_CDecl;
|
||||
begin
|
||||
_sig_lock;
|
||||
|
|
|
@ -1477,6 +1477,7 @@ begin
|
|||
lib^.set_proc($A226FBE85FF5D9F9,@ps4_sceKernelLseek);
|
||||
lib^.set_proc($0A0E2CAD9E9329B5,@ps4_sceKernelRead);
|
||||
lib^.set_proc($FABDEB305C08B55E,@ps4_sceKernelPread);
|
||||
lib^.set_proc($C938FAD88EE4C38B,@ps4_sceKernelPreadv);
|
||||
lib^.set_proc($E304B37BDD8184B2,@ps4_sceKernelWrite);
|
||||
lib^.set_proc($9CA5A2FCDD87055E,@ps4_sceKernelPwrite);
|
||||
lib^.set_proc($556DD355988CE3F1,@ps4_sceKernelFtruncate);
|
||||
|
@ -1498,15 +1499,17 @@ begin
|
|||
lib^.set_proc($0D1B81B76A6F2029,@ps4_read); //_read
|
||||
lib^.set_proc($02A062A02DAF1772,@ps4_read); //read
|
||||
|
||||
lib^.set_proc($7B3BFF45204D2AA2,@ps4_pread); //pread
|
||||
lib^.set_proc($7B3BFF45204D2AA2,@ps4_pread);
|
||||
|
||||
lib^.set_proc($F9646590A8D9BDA8,@ps4_readv); //_readv
|
||||
lib^.set_proc($23B22670B76CFEE5,@ps4_readv); //readv
|
||||
|
||||
lib^.set_proc($65A47369AA406703,@ps4_preadv);
|
||||
|
||||
lib^.set_proc($171559A81000EE4B,@ps4_write); //_write
|
||||
lib^.set_proc($14DE2068F9AE155F,@ps4_write); //write
|
||||
|
||||
lib^.set_proc($0B6909FDBC92E6B3,@ps4_pwrite); //pwrite
|
||||
lib^.set_proc($0B6909FDBC92E6B3,@ps4_pwrite);
|
||||
|
||||
lib^.set_proc($8A1E020FDFE08213,@ps4_ftruncate);
|
||||
lib^.set_proc($9AA40C875CCF3D3F,@ps4_fstat);
|
||||
|
|
|
@ -27,11 +27,12 @@ type
|
|||
end;
|
||||
|
||||
TDevRandom=class(TDevFile)
|
||||
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 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 preadv(vector:p_iovec;count:Integer;offset:Int64):Int64; override;
|
||||
function write (data:Pointer;size:Int64):Int64; override;
|
||||
function pwrite(data:Pointer;size,offset:Int64):Int64; override;
|
||||
end;
|
||||
|
||||
TDevStd=class(TDevFile)
|
||||
|
@ -41,11 +42,12 @@ type
|
|||
cache:RawByteString;
|
||||
Constructor Create(t:PText);
|
||||
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 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 preadv(vector:p_iovec;count:Integer;offset:Int64):Int64; override;
|
||||
function write (data:Pointer;size:Int64):Int64; override;
|
||||
function pwrite(data:Pointer;size,offset:Int64):Int64; override;
|
||||
end;
|
||||
|
||||
procedure _sys_dev_init;
|
||||
|
@ -134,10 +136,7 @@ end;
|
|||
|
||||
function TDevRandom.pread (data:Pointer;size,offset:Int64):Int64;
|
||||
begin
|
||||
Assert(size<High(DWORD));
|
||||
|
||||
BCryptGenRandom(nil,data,size,BCRYPT_USE_SYSTEM_PREFERRED_RNG);
|
||||
Result:=size;
|
||||
Result:=read(data,size);
|
||||
end;
|
||||
|
||||
function TDevRandom.readv (vector:p_iovec;count:Integer):Int64;
|
||||
|
@ -148,13 +147,15 @@ begin
|
|||
|
||||
For i:=0 to count-1 do
|
||||
begin
|
||||
Assert(vector[i].iov_len<High(DWORD));
|
||||
|
||||
BCryptGenRandom(nil,vector[i].iov_base,vector[i].iov_len,BCRYPT_USE_SYSTEM_PREFERRED_RNG);
|
||||
Result:=Result+vector[i].iov_len;
|
||||
Result:=Result+read(vector[i].iov_base,vector[i].iov_len);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TDevRandom.preadv(vector:p_iovec;count:Integer;offset:Int64):Int64;
|
||||
begin
|
||||
Result:=readv(vector,count);
|
||||
end;
|
||||
|
||||
function TDevRandom.write (data:Pointer;size:Int64):Int64;
|
||||
begin
|
||||
Result:=size;
|
||||
|
@ -253,6 +254,11 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TDevStd.preadv(vector:p_iovec;count:Integer;offset:Int64):Int64;
|
||||
begin
|
||||
Result:=readv(vector,count);
|
||||
end;
|
||||
|
||||
function TDevStd.write (data:Pointer;size:Int64):Int64;
|
||||
var
|
||||
S:RawByteString;
|
||||
|
|
|
@ -57,15 +57,16 @@ 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 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;
|
||||
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 preadv (vector:p_iovec;count:Integer;offset:Int64):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;
|
||||
|
||||
function get_d_type(dwFileAttributes:DWORD):BYTE;
|
||||
|
@ -344,6 +345,11 @@ begin
|
|||
Result:=-EISDIR;
|
||||
end;
|
||||
|
||||
function TDirFile.preadv(vector:p_iovec;count:Integer;offset:Int64):Int64;
|
||||
begin
|
||||
Result:=-EISDIR;
|
||||
end;
|
||||
|
||||
function TDirFile.write (data:Pointer;size:Int64):Int64;
|
||||
begin
|
||||
Result:=-EISDIR;
|
||||
|
|
|
@ -200,17 +200,18 @@ type
|
|||
fd:Integer;
|
||||
status: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 ftruncate (size:Int64):Integer; virtual;
|
||||
function fstat (stat:PSceKernelStat):Integer; virtual;
|
||||
function fsync ():Integer; virtual;
|
||||
function fcntl (cmd:Integer;param1:ptruint):Integer; virtual;
|
||||
function getdirentries(buf:Pointer;nbytes:Int64;basep:PInt64):Int64; 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 preadv (vector:p_iovec;count:Integer;offset:Int64):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 fsync ():Integer; virtual;
|
||||
function fcntl (cmd:Integer;param1:ptruint):Integer; virtual;
|
||||
function getdirentries(buf:Pointer;nbytes:Int64;basep:PInt64):Int64; virtual;
|
||||
end;
|
||||
|
||||
function _sys_get_osfhandle(fd:Integer):THandle;
|
||||
|
@ -221,6 +222,7 @@ function _sys_lseek(fd:Integer;offset:Int64;whence:Integer):Int64;
|
|||
function _sys_read(fd:Integer;data:Pointer;size:Int64):Int64;
|
||||
function _sys_pread(fd:Integer;data:Pointer;size,offset:Int64):Int64;
|
||||
function _sys_readv(fd:Integer;vector:p_iovec;count:Integer):Int64;
|
||||
function _sys_preadv(fd:Integer;vector:p_iovec;count:Integer;offset:Int64):Int64;
|
||||
function _sys_write(fd:Integer;data:Pointer;size:Int64):Int64;
|
||||
function _sys_pwrite(fd:Integer;data:Pointer;size,offset:Int64):Int64;
|
||||
function _sys_ftruncate(fd:Integer;size:Int64):Integer;
|
||||
|
@ -256,6 +258,11 @@ begin
|
|||
Result:=-ENOTSUP;
|
||||
end;
|
||||
|
||||
function TCustomFile.preadv(vector:p_iovec;count:Integer;offset:Int64):Int64;
|
||||
begin
|
||||
Result:=-ENOTSUP;
|
||||
end;
|
||||
|
||||
function TCustomFile.write (data:Pointer;size:Int64):Int64;
|
||||
begin
|
||||
Result:=-ENOTSUP;
|
||||
|
@ -442,6 +449,29 @@ begin
|
|||
f.Release;
|
||||
end;
|
||||
|
||||
function _sys_preadv(fd:Integer;vector:p_iovec;count:Integer;offset:Int64):Int64;
|
||||
var
|
||||
f:TCustomFile;
|
||||
i:Integer;
|
||||
begin
|
||||
if (fd<0) then Exit(-EINVAL);
|
||||
if (vector=nil) then Exit(-EFAULT);
|
||||
if (count<=0) then Exit(-EINVAL);
|
||||
|
||||
For i:=0 to count-1 do
|
||||
begin
|
||||
if (vector[i].iov_base=nil) then Exit(-EFAULT);
|
||||
if (vector[i].iov_len<=0) then Exit(-EINVAL);
|
||||
end;
|
||||
|
||||
f:=_sys_acqure_fd(fd);
|
||||
if (f=nil) then Exit(-EBADF);
|
||||
|
||||
Result:=f.preadv(vector,count,offset);
|
||||
|
||||
f.Release;
|
||||
end;
|
||||
|
||||
function _sys_write(fd:Integer;data:Pointer;size:Int64):Int64;
|
||||
var
|
||||
f:TCustomFile;
|
||||
|
|
101
sys/sys_file.pas
101
sys/sys_file.pas
|
@ -24,16 +24,17 @@ 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 ftruncate(size:Int64):Integer; override;
|
||||
function fstat (stat:PSceKernelStat):Integer; override;
|
||||
function fsync ():Integer; override;
|
||||
function fcntl (cmd:Integer;param1:ptruint):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 preadv (vector:p_iovec;count:Integer;offset:Int64):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 fsync ():Integer; override;
|
||||
function fcntl (cmd:Integer;param1:ptruint):Integer; override;
|
||||
end;
|
||||
|
||||
Function get_DesiredAccess(flags:Integer):DWORD;
|
||||
|
@ -265,6 +266,8 @@ begin
|
|||
end;
|
||||
|
||||
function TFile.readv (vector:p_iovec;count:Integer):Int64;
|
||||
label
|
||||
_exit;
|
||||
var
|
||||
N:DWORD;
|
||||
R:BOOL;
|
||||
|
@ -272,27 +275,75 @@ var
|
|||
begin
|
||||
Result:=0;
|
||||
|
||||
For i:=0 to count-1 do
|
||||
begin
|
||||
Assert(vector[i].iov_len<High(DWORD));
|
||||
rwlock_wrlock(lock);
|
||||
|
||||
N:=0;
|
||||
rwlock_wrlock(lock);
|
||||
For i:=0 to count-1 do
|
||||
begin
|
||||
Assert(vector[i].iov_len<High(DWORD));
|
||||
|
||||
N:=0;
|
||||
R:=ReadFile(Handle,vector[i].iov_base^,vector[i].iov_len,N,nil);
|
||||
rwlock_unlock(lock);
|
||||
|
||||
if R then
|
||||
begin
|
||||
Result:=Result+N;
|
||||
if (N<vector[i].iov_len) then Exit;
|
||||
end else
|
||||
begin
|
||||
Exit(-EIO);
|
||||
Break;
|
||||
if R then
|
||||
begin
|
||||
Result:=Result+N;
|
||||
if (N<vector[i].iov_len) then
|
||||
begin
|
||||
Goto _exit;
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
Result:=-EIO;
|
||||
Goto _exit;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
_exit:
|
||||
rwlock_unlock(lock);
|
||||
end;
|
||||
|
||||
function TFile.preadv(vector:p_iovec;count:Integer;offset:Int64):Int64;
|
||||
label
|
||||
_exit;
|
||||
var
|
||||
N:DWORD;
|
||||
R:BOOL;
|
||||
p:Int64;
|
||||
i:Integer;
|
||||
begin
|
||||
Result:=0;
|
||||
|
||||
rwlock_wrlock(lock);
|
||||
|
||||
p:=_get_pos(Handle);
|
||||
if not _set_pos(Handle,offset) then Assert(False);
|
||||
|
||||
For i:=0 to count-1 do
|
||||
begin
|
||||
Assert(vector[i].iov_len<High(DWORD));
|
||||
|
||||
N:=0;
|
||||
R:=ReadFile(Handle,vector[i].iov_base^,vector[i].iov_len,N,nil);
|
||||
|
||||
if R then
|
||||
begin
|
||||
Result:=Result+N;
|
||||
if (N<vector[i].iov_len) then
|
||||
begin
|
||||
Goto _exit;
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
Result:=-EIO;
|
||||
Goto _exit;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
_exit:
|
||||
if not _set_pos(Handle,p) then Assert(False);
|
||||
rwlock_unlock(lock);
|
||||
end;
|
||||
|
||||
function TFile.write (data:Pointer;size:Int64):Int64;
|
||||
|
|
Loading…
Reference in New Issue