FPPS4/sys/md/md_pipe.pas

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.