mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
- Add some definitions to NDK
- Prettify/document CreatePipe and correct some mistakes, use 120 second timeout like on NT and send FILE_PIPE flags instead of weird BOOLEAN values from hell. svn path=/trunk/; revision=19065
This commit is contained in:
parent
7f3dd627ae
commit
4e84f04716
3 changed files with 97 additions and 73 deletions
|
@ -37,6 +37,7 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
|
|||
#define FILE_DOES_NOT_EXIST 0x00000005
|
||||
|
||||
/* Pipe Flags */
|
||||
#define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
|
||||
#define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
|
||||
#define FILE_PIPE_MESSAGE_MODE 0x00000001
|
||||
#define FILE_PIPE_QUEUE_OPERATION 0x00000000
|
||||
|
|
|
@ -1181,6 +1181,15 @@ RtlIsTextUnicode(
|
|||
ULONG *Flags
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
RtlPrefixString(
|
||||
PCANSI_STRING String1,
|
||||
PCANSI_STRING String2,
|
||||
BOOLEAN CaseInsensitive
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
|
|
|
@ -17,14 +17,16 @@
|
|||
|
||||
/* GLOBALS ******************************************************************/
|
||||
|
||||
ULONG ProcessPipeId = 0;
|
||||
LONG ProcessPipeId = 0;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
|
||||
BOOL
|
||||
STDCALL
|
||||
CreatePipe(PHANDLE hReadPipe,
|
||||
PHANDLE hWritePipe,
|
||||
LPSECURITY_ATTRIBUTES lpPipeAttributes,
|
||||
DWORD nSize)
|
||||
|
@ -37,38 +39,47 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
|
|||
NTSTATUS Status;
|
||||
HANDLE ReadPipeHandle;
|
||||
HANDLE WritePipeHandle;
|
||||
ULONG PipeId;
|
||||
LONG PipeId;
|
||||
ULONG Attributes;
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
|
||||
|
||||
DefaultTimeout.QuadPart = -300000000; /* 30 seconds */
|
||||
/* Set the timeout to 120 seconds */
|
||||
DefaultTimeout.QuadPart = -1200000000;
|
||||
|
||||
PipeId = (ULONG)InterlockedIncrement((LONG*)&ProcessPipeId);
|
||||
/* Use default buffer size if desired */
|
||||
if (!nSize) nSize = 0x1000;
|
||||
|
||||
/* Increase the Pipe ID */
|
||||
PipeId = InterlockedIncrement(&ProcessPipeId);
|
||||
|
||||
/* Create the pipe name */
|
||||
swprintf(Buffer,
|
||||
L"\\\\.\\PIPE\\Win32Pipes.%08x.%08x",
|
||||
NtCurrentTeb()->Cid.UniqueProcess,
|
||||
PipeId);
|
||||
RtlInitUnicodeString (&PipeName,
|
||||
Buffer);
|
||||
RtlInitUnicodeString(&PipeName, Buffer);
|
||||
|
||||
/* Always use case insensitive */
|
||||
Attributes = OBJ_CASE_INSENSITIVE;
|
||||
|
||||
/* Check if we got attributes */
|
||||
if (lpPipeAttributes)
|
||||
{
|
||||
/* Use the attributes' SD instead */
|
||||
SecurityDescriptor = lpPipeAttributes->lpSecurityDescriptor;
|
||||
if (lpPipeAttributes->bInheritHandle)
|
||||
Attributes |= OBJ_INHERIT;
|
||||
|
||||
/* Set OBJ_INHERIT if requested */
|
||||
if (lpPipeAttributes->bInheritHandle) Attributes |= OBJ_INHERIT;
|
||||
}
|
||||
|
||||
/* use default buffer size if desired */
|
||||
if (nSize == 0)
|
||||
nSize = 0x1000;
|
||||
|
||||
/* Initialize the attributes */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&PipeName,
|
||||
Attributes,
|
||||
NULL,
|
||||
SecurityDescriptor);
|
||||
|
||||
/* Create the named pipe */
|
||||
Status = NtCreateNamedPipeFile(&ReadPipeHandle,
|
||||
FILE_GENERIC_READ |FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
|
||||
&ObjectAttributes,
|
||||
|
@ -76,35 +87,38 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
|
|||
FILE_SHARE_WRITE,
|
||||
FILE_CREATE,
|
||||
FILE_SYNCHRONOUS_IO_NONALERT,
|
||||
FALSE,
|
||||
FALSE,
|
||||
FALSE,
|
||||
FILE_PIPE_BYTE_STREAM_TYPE,
|
||||
FILE_PIPE_BYTE_STREAM_MODE,
|
||||
FILE_PIPE_BYTE_STREAM_MODE,
|
||||
1,
|
||||
nSize,
|
||||
nSize,
|
||||
&DefaultTimeout);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Convert error and fail */
|
||||
SetLastErrorByStatus(Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Now try opening it for write access */
|
||||
Status = NtOpenFile(&WritePipeHandle,
|
||||
FILE_GENERIC_WRITE | SYNCHRONIZE,
|
||||
&ObjectAttributes,
|
||||
&StatusBlock,
|
||||
FILE_SHARE_READ,
|
||||
FILE_SYNCHRONOUS_IO_NONALERT);
|
||||
FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Convert error and fail */
|
||||
NtClose(ReadPipeHandle);
|
||||
SetLastErrorByStatus(Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Return both handles */
|
||||
*hReadPipe = ReadPipeHandle;
|
||||
*hWritePipe = WritePipeHandle;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue