mirror of https://github.com/red-prig/fpPS4.git
169 lines
3.6 KiB
Plaintext
169 lines
3.6 KiB
Plaintext
unit systm;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
uses
|
|
ntapi;
|
|
|
|
const
|
|
IOSIZE_MAX =High(Integer);
|
|
DEVFS_IOSIZE_MAX=High(Integer);
|
|
|
|
function copystr(from,_to:Pointer;maxlen:ptruint;lencopied:pptruint):Integer;
|
|
function copyin(udaddr,kaddr:Pointer;len:ptruint):Integer;
|
|
function copyinstr(udaddr,kaddr:Pointer;len:ptruint;lencopied:pptruint):Integer;
|
|
function copyout(kaddr,udaddr:Pointer;len:ptruint):Integer;
|
|
function fubyte(var base:Byte):Byte; inline;
|
|
function fuword32(var base:DWORD):DWORD; inline;
|
|
function fuword64(var base:QWORD):QWORD; inline;
|
|
function fuword(var base:Pointer):Pointer; inline;
|
|
function casuword32(var base:DWORD;oldval,newval:DWORD):DWORD; inline;
|
|
function casuword64(var base:QWORD;oldval,newval:QWORD):QWORD; inline;
|
|
function suword32(var base:DWORD;word:DWORD):DWORD; inline;
|
|
function suword64(var base:QWORD;word:QWORD):DWORD; inline;
|
|
function suword(var base:Pointer;word:Pointer):DWORD; inline;
|
|
|
|
implementation
|
|
|
|
uses
|
|
sysutils,
|
|
errno;
|
|
|
|
function copystr(from,_to:Pointer;maxlen:ptruint;lencopied:pptruint):Integer;
|
|
begin
|
|
strlcopy(_to,from,maxlen);
|
|
if (lencopied<>nil) then
|
|
begin
|
|
lencopied^:=strlen(_to);
|
|
end;
|
|
Result:=0;
|
|
end;
|
|
|
|
function copyin(udaddr,kaddr:Pointer;len:ptruint):Integer;
|
|
begin
|
|
if (NtReadVirtualMemory(NtCurrentProcess,udaddr,kaddr,len,nil)=0) then
|
|
begin
|
|
Result:=0;
|
|
end else
|
|
begin
|
|
Result:=EFAULT;
|
|
end;
|
|
end;
|
|
|
|
function copyinstr(udaddr,kaddr:Pointer;len:ptruint;lencopied:pptruint):Integer;
|
|
var
|
|
ch:Char;
|
|
i:ptruint;
|
|
begin
|
|
Result:=0;
|
|
i:=0;
|
|
ch:=#0;
|
|
while (len>0) do
|
|
begin
|
|
Result:=copyin(udaddr,@ch,1);
|
|
if (Result<>0) then Break;
|
|
PChar(kaddr)^:=ch;
|
|
Inc(i);
|
|
if (ch=#0) then Break;
|
|
Inc(udaddr);
|
|
Inc(kaddr);
|
|
Dec(len);
|
|
end;
|
|
if (lencopied<>nil) then
|
|
begin
|
|
lencopied^:=i;
|
|
end;
|
|
end;
|
|
|
|
function copyout(kaddr,udaddr:Pointer;len:ptruint):Integer;
|
|
begin
|
|
if (NtWriteVirtualMemory(NtCurrentProcess,udaddr,kaddr,len,nil)=0) then
|
|
begin
|
|
Result:=0;
|
|
end else
|
|
begin
|
|
Result:=EFAULT;
|
|
end;
|
|
end;
|
|
|
|
function fubyte(var base:Byte):Byte; inline;
|
|
begin
|
|
if (NtReadVirtualMemory(NtCurrentProcess,@base,@Result,SizeOf(Byte),nil)<>0) then
|
|
begin
|
|
Result:=BYTE(-1);
|
|
end;
|
|
end;
|
|
|
|
function fuword32(var base:DWORD):DWORD; inline;
|
|
begin
|
|
if (NtReadVirtualMemory(NtCurrentProcess,@base,@Result,SizeOf(DWORD),nil)<>0) then
|
|
begin
|
|
Result:=DWORD(-1);
|
|
end;
|
|
end;
|
|
|
|
function fuword64(var base:QWORD):QWORD; inline;
|
|
begin
|
|
if (NtReadVirtualMemory(NtCurrentProcess,@base,@Result,SizeOf(QWORD),nil)<>0) then
|
|
begin
|
|
Result:=QWORD(-1);
|
|
end;
|
|
end;
|
|
|
|
function fuword(var base:Pointer):Pointer; inline;
|
|
begin
|
|
if (NtReadVirtualMemory(NtCurrentProcess,@base,@Result,SizeOf(Pointer),nil)<>0) then
|
|
begin
|
|
Result:=Pointer(QWORD(-1));
|
|
end;
|
|
end;
|
|
|
|
function casuword32(var base:DWORD;oldval,newval:DWORD):DWORD; inline;
|
|
begin
|
|
Result:=System.InterlockedCompareExchange(base,newval,oldval);
|
|
end;
|
|
|
|
function casuword64(var base:QWORD;oldval,newval:QWORD):QWORD; inline;
|
|
begin
|
|
Result:=System.InterlockedCompareExchange64(base,newval,oldval);
|
|
end;
|
|
|
|
function suword32(var base:DWORD;word:DWORD):DWORD; inline;
|
|
begin
|
|
if (NtWriteVirtualMemory(NtCurrentProcess,@base,@word,SizeOf(DWORD),nil)=0) then
|
|
begin
|
|
Result:=0;
|
|
end else
|
|
begin
|
|
Result:=DWORD(-1);
|
|
end;
|
|
end;
|
|
|
|
function suword64(var base:QWORD;word:QWORD):DWORD; inline;
|
|
begin
|
|
if (NtWriteVirtualMemory(NtCurrentProcess,@base,@word,SizeOf(QWORD),nil)=0) then
|
|
begin
|
|
Result:=0;
|
|
end else
|
|
begin
|
|
Result:=DWORD(-1);
|
|
end;
|
|
end;
|
|
|
|
function suword(var base:Pointer;word:Pointer):DWORD; inline;
|
|
begin
|
|
if (NtWriteVirtualMemory(NtCurrentProcess,@base,@word,SizeOf(Pointer),nil)=0) then
|
|
begin
|
|
Result:=0;
|
|
end else
|
|
begin
|
|
Result:=DWORD(-1);
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|