mirror of https://github.com/red-prig/fpPS4.git
124 lines
3.0 KiB
Plaintext
124 lines
3.0 KiB
Plaintext
unit md_pipe;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
uses
|
|
windows,
|
|
ntapi;
|
|
|
|
Const
|
|
MD_PIPE_ASYNC0=1;
|
|
MD_PIPE_ASYNC1=2;
|
|
|
|
function md_pipe2(pipefd:PHandle;flags:Integer):Integer;
|
|
|
|
implementation
|
|
|
|
const
|
|
FILE_SHARE_VALID_FLAGS=FILE_SHARE_READ or
|
|
FILE_SHARE_WRITE or
|
|
FILE_SHARE_DELETE;
|
|
|
|
Const
|
|
NamedPipe:PWideChar='\Device\NamedPipe\';
|
|
|
|
function md_pipe2(pipefd:PHandle;flags:Integer):Integer;
|
|
var
|
|
BLK:IO_STATUS_BLOCK;
|
|
UNAME:UNICODE_STRING;
|
|
OATTR:OBJECT_ATTRIBUTES;
|
|
timeout:LARGE_INTEGER;
|
|
|
|
hDirectory:THandle;
|
|
hFd:array[0..1] of THandle;
|
|
begin
|
|
Result:=0;
|
|
|
|
BLK:=Default(IO_STATUS_BLOCK);
|
|
|
|
UNAME:=Default(UNICODE_STRING);
|
|
UNAME.Length :=Length(NamedPipe)*SizeOf(WideChar);
|
|
UNAME.MaximumLength:=(Length(NamedPipe)+1)*SizeOf(WideChar);
|
|
UNAME.Buffer :=NamedPipe;
|
|
|
|
OATTR:=Default(OBJECT_ATTRIBUTES);
|
|
OATTR.Length :=SizeOf(OBJECT_ATTRIBUTES);
|
|
OATTR.ObjectName:=@UNAME;
|
|
OATTR.Attributes:=OBJ_CASE_INSENSITIVE;
|
|
|
|
hDirectory:=0;
|
|
Result:=NtOpenFile(@hDirectory,
|
|
SYNCHRONIZE,
|
|
@OATTR,
|
|
@BLK,
|
|
FILE_SHARE_VALID_FLAGS,
|
|
0);
|
|
if (Result<>0) then Exit;
|
|
|
|
timeout.QuadPart:=-500000;
|
|
|
|
BLK:=Default(IO_STATUS_BLOCK);
|
|
|
|
UNAME:=Default(UNICODE_STRING);
|
|
|
|
OATTR.RootDirectory:=hDirectory;
|
|
|
|
hFd[0]:=0;
|
|
Result:=NtCreateNamedPipeFile(@hFd[0],
|
|
SYNCHRONIZE or
|
|
FILE_READ_ATTRIBUTES or FILE_READ_DATA or
|
|
FILE_WRITE_ATTRIBUTES or FILE_WRITE_DATA or
|
|
FILE_CREATE_PIPE_INSTANCE,
|
|
@OATTR,
|
|
@BLK,
|
|
FILE_SHARE_READ or FILE_SHARE_WRITE,
|
|
FILE_CREATE,
|
|
(ord((flags and MD_PIPE_ASYNC0)=0)*FILE_SYNCHRONOUS_IO_NONALERT),
|
|
FILE_PIPE_BYTE_STREAM_TYPE,
|
|
FILE_PIPE_BYTE_STREAM_MODE,
|
|
FILE_PIPE_QUEUE_OPERATION,
|
|
$ffffffff,
|
|
0,
|
|
0,
|
|
@timeout);
|
|
if (Result<>0) then
|
|
begin
|
|
NtClose(hDirectory);
|
|
Exit;
|
|
end;
|
|
|
|
BLK:=Default(IO_STATUS_BLOCK);
|
|
|
|
OATTR.RootDirectory:=hFd[0];
|
|
OATTR.Attributes:=OBJ_CASE_INSENSITIVE or OBJ_INHERIT;
|
|
|
|
hFd[1]:=0;
|
|
Result:=NtOpenFile(@hFd[1],
|
|
SYNCHRONIZE or
|
|
FILE_READ_ATTRIBUTES or FILE_READ_DATA or
|
|
FILE_WRITE_ATTRIBUTES or FILE_WRITE_DATA,
|
|
@OATTR,
|
|
@BLK,
|
|
FILE_SHARE_VALID_FLAGS,
|
|
(ord((flags and MD_PIPE_ASYNC1)=0)*FILE_SYNCHRONOUS_IO_NONALERT)
|
|
);
|
|
|
|
if (Result<>0) then
|
|
begin
|
|
NtClose(hFd[0]);
|
|
NtClose(hDirectory);
|
|
Exit;
|
|
end;
|
|
|
|
NtClose(hDirectory);
|
|
|
|
pipefd[0]:=hFd[0];
|
|
pipefd[1]:=hFd[1];
|
|
end;
|
|
|
|
end.
|
|
|