1 /* $Id: npipe.c,v 1.3 2000/06/03 14:47:32 ea Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/npipe.c
6 * PURPOSE: Directory functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
17 #include <ntdll/rtl.h>
19 #include <kernel32/kernel32.h>
20 #include <kernel32/error.h>
22 /* FUNCTIONS ****************************************************************/
24 HANDLE STDCALL
CreateNamedPipeA(LPCSTR lpName
,
30 DWORD nDefaultTimeOut
,
31 LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
33 HANDLE NamedPipeHandle
;
37 RtlInitAnsiString(&NameA
, (LPSTR
)lpName
);
38 RtlAnsiStringToUnicodeString(&NameU
, &NameA
, TRUE
);
40 NamedPipeHandle
= CreateNamedPipeW(NameU
.Buffer
,
47 lpSecurityAttributes
);
49 RtlFreeUnicodeString(&NameU
);
51 return(NamedPipeHandle
);
54 HANDLE STDCALL
CreateNamedPipeW(LPCWSTR lpName
,
60 DWORD nDefaultTimeOut
,
61 LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
63 UNICODE_STRING NamedPipeName
;
66 OBJECT_ATTRIBUTES ObjectAttributes
;
68 ACCESS_MASK DesiredAccess
;
70 ULONG CreateDisposition
;
71 BOOLEAN WriteModeMessage
;
72 BOOLEAN ReadModeMessage
;
76 LARGE_INTEGER DefaultTimeOut
;
78 Result
= RtlDosPathNameToNtPathName_U((LPWSTR
)lpName
,
85 return(INVALID_HANDLE_VALUE
);
88 InitializeObjectAttributes(&ObjectAttributes
,
98 CreateDisposition
= FILE_OPEN_IF
;
101 if (dwOpenMode
& FILE_FLAG_WRITE_THROUGH
)
103 CreateOptions
= CreateOptions
| FILE_FLAG_WRITE_THROUGH
;
105 if (dwOpenMode
& FILE_FLAG_OVERLAPPED
)
107 CreateOptions
= CreateOptions
| FILE_SYNCHRONOUS_IO_ALERT
;
110 if (dwPipeMode
& PIPE_TYPE_BYTE
)
112 WriteModeMessage
= FALSE
;
114 else if (dwPipeMode
& PIPE_TYPE_MESSAGE
)
116 WriteModeMessage
= TRUE
;
120 WriteModeMessage
= FALSE
;
123 if (dwPipeMode
& PIPE_READMODE_BYTE
)
125 ReadModeMessage
= FALSE
;
127 else if (dwPipeMode
& PIPE_READMODE_MESSAGE
)
129 ReadModeMessage
= TRUE
;
133 ReadModeMessage
= FALSE
;
136 if (dwPipeMode
& PIPE_WAIT
)
140 else if (dwPipeMode
& PIPE_NOWAIT
)
149 DefaultTimeOut
.QuadPart
= nDefaultTimeOut
* 1000 * 1000;
151 Status
= NtCreateNamedPipeFile(&PipeHandle
,
165 if (!NT_SUCCESS(Status
))
167 SetLastErrorByStatus (Status
);
168 return(INVALID_HANDLE_VALUE
);
173 BOOL STDCALL
WaitNamedPipeA(LPCSTR lpNamedPipeName
,
177 UNICODE_STRING NameU
;
180 RtlInitAnsiString(&NameA
, lpNamedPipeName
);
181 RtlAnsiStringToUnicodeString(&NameU
, &NameA
, TRUE
);
183 r
= WaitNamedPipeW(NameU
.Buffer
, nTimeOut
);
185 RtlFreeUnicodeString(&NameU
);
190 BOOL STDCALL
WaitNamedPipeW(LPCWSTR lpNamedPipeName
,
193 UNICODE_STRING NamedPipeName
;
196 OBJECT_ATTRIBUTES ObjectAttributes
;
197 NPFS_WAIT_PIPE WaitPipe
;
199 IO_STATUS_BLOCK Iosb
;
201 r
= RtlDosPathNameToNtPathName_U(lpNamedPipeName
,
211 InitializeObjectAttributes(&ObjectAttributes
,
216 Status
= NtOpenFile(&FileHandle
,
221 FILE_SYNCHRONOUS_IO_ALERT
);
222 if (!NT_SUCCESS(Status
))
224 SetLastErrorByStatus (Status
);
228 WaitPipe
.Timeout
.QuadPart
= nTimeOut
* 1000 * 1000;
230 Status
= NtFsControlFile(FileHandle
,
240 if (!NT_SUCCESS(Status
))
242 SetLastErrorByStatus (Status
);
250 BOOL STDCALL
ConnectNamedPipe(HANDLE hNamedPipe
,
251 LPOVERLAPPED lpOverLapped
)
253 NPFS_LISTEN ListenPipe
;
254 IO_STATUS_BLOCK Iosb
;
256 PIO_STATUS_BLOCK IoStatusBlock
;
259 if (lpOverLapped
!= NULL
)
261 lpOverLapped
->Internal
= STATUS_PENDING
;
262 hEvent
= lpOverLapped
->hEvent
;
263 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverLapped
;
267 IoStatusBlock
= &Iosb
;
271 Status
= NtFsControlFile(hNamedPipe
,
281 if (!NT_SUCCESS(Status
))
283 SetLastErrorByStatus (Status
);
289 BOOL STDCALL
SetNamedPipeHandleState(HANDLE hNamedPipe
,
291 LPDWORD lpMaxCollectionCount
,
292 LPDWORD lpCollectDataTimeout
)
294 NPFS_GET_STATE GetState
;
295 NPFS_SET_STATE SetState
;
296 IO_STATUS_BLOCK Iosb
;
299 Status
= NtFsControlFile(hNamedPipe
,
309 if (!NT_SUCCESS(Status
))
311 SetLastErrorByStatus (Status
);
317 if ((*lpMode
) & PIPE_READMODE_MESSAGE
)
319 SetState
.ReadModeMessage
= TRUE
;
323 SetState
.ReadModeMessage
= FALSE
;
325 if ((*lpMode
) & PIPE_NOWAIT
)
327 SetState
.NonBlocking
= TRUE
;
331 SetState
.NonBlocking
= FALSE
;
333 SetState
.WriteModeMessage
= GetState
.WriteModeMessage
;
337 SetState
.ReadModeMessage
= GetState
.ReadModeMessage
;
338 SetState
.WriteModeMessage
= GetState
.WriteModeMessage
;
339 SetState
.NonBlocking
= SetState
.NonBlocking
;
342 if (lpMaxCollectionCount
!= NULL
)
344 SetState
.InBufferSize
= *lpMaxCollectionCount
;
348 SetState
.InBufferSize
= GetState
.InBufferSize
;
351 SetState
.OutBufferSize
= GetState
.OutBufferSize
;
353 if (lpCollectDataTimeout
!= NULL
)
355 SetState
.Timeout
.QuadPart
= (*lpCollectDataTimeout
) * 1000 * 1000;
359 SetState
.Timeout
= GetState
.Timeout
;
362 Status
= NtFsControlFile(hNamedPipe
,
372 if (!NT_SUCCESS(Status
))
374 SetLastErrorByStatus (Status
);