mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-29 19:26:33 +00:00
fix some flags calculations and access rights in CreateNamedPipe and CreatePipe
svn path=/trunk/; revision=18883
This commit is contained in:
@@ -15,6 +15,12 @@
|
||||
#define NDEBUG
|
||||
#include "../include/debug.h"
|
||||
|
||||
/* FIXME - defined in ntifs.h */
|
||||
#if !defined(FILE_PIPE_BYTE_STREAM_TYPE) && !defined(FILE_PIPE_MESSAGE_TYPE)
|
||||
#define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
|
||||
#define FILE_PIPE_MESSAGE_TYPE 0x00000001
|
||||
#endif
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
/*
|
||||
@@ -72,7 +78,6 @@ CreateNamedPipeW(LPCWSTR lpName,
|
||||
HANDLE PipeHandle;
|
||||
ACCESS_MASK DesiredAccess;
|
||||
ULONG CreateOptions;
|
||||
ULONG CreateDisposition;
|
||||
ULONG WriteModeMessage;
|
||||
ULONG ReadModeMessage;
|
||||
ULONG NonBlocking;
|
||||
@@ -80,6 +85,12 @@ CreateNamedPipeW(LPCWSTR lpName,
|
||||
ULONG ShareAccess, Attributes;
|
||||
LARGE_INTEGER DefaultTimeOut;
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
|
||||
|
||||
if (nMaxInstances == 0 || nMaxInstances > PIPE_UNLIMITED_INSTANCES)
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
Result = RtlDosPathNameToNtPathName_U((LPWSTR)lpName,
|
||||
&NamedPipeName,
|
||||
@@ -108,77 +119,47 @@ CreateNamedPipeW(LPCWSTR lpName,
|
||||
NULL,
|
||||
SecurityDescriptor);
|
||||
|
||||
DesiredAccess = 0;
|
||||
DesiredAccess = SYNCHRONIZE | (dwOpenMode & (WRITE_DAC | WRITE_OWNER | ACCESS_SYSTEM_SECURITY));
|
||||
ShareAccess = 0;
|
||||
CreateDisposition = FILE_OPEN_IF;
|
||||
CreateOptions = 0;
|
||||
|
||||
if (dwOpenMode & FILE_FLAG_WRITE_THROUGH)
|
||||
{
|
||||
CreateOptions = CreateOptions | FILE_WRITE_THROUGH;
|
||||
}
|
||||
CreateOptions |= FILE_WRITE_THROUGH;
|
||||
if (!(dwOpenMode & FILE_FLAG_OVERLAPPED))
|
||||
CreateOptions |= FILE_SYNCHRONOUS_IO_NONALERT;
|
||||
|
||||
switch (dwOpenMode & PIPE_ACCESS_DUPLEX)
|
||||
{
|
||||
CreateOptions = CreateOptions | FILE_SYNCHRONOUS_IO_NONALERT;
|
||||
}
|
||||
if (dwOpenMode & PIPE_ACCESS_DUPLEX)
|
||||
{
|
||||
CreateOptions = CreateOptions | FILE_PIPE_FULL_DUPLEX;
|
||||
DesiredAccess |= (FILE_GENERIC_READ | FILE_GENERIC_WRITE);
|
||||
}
|
||||
else if (dwOpenMode & PIPE_ACCESS_INBOUND)
|
||||
{
|
||||
CreateOptions = CreateOptions | FILE_PIPE_INBOUND;
|
||||
DesiredAccess |= FILE_GENERIC_READ;
|
||||
}
|
||||
else if (dwOpenMode & PIPE_ACCESS_OUTBOUND)
|
||||
{
|
||||
CreateOptions = CreateOptions | FILE_PIPE_OUTBOUND;
|
||||
DesiredAccess |= FILE_GENERIC_WRITE;
|
||||
case PIPE_ACCESS_INBOUND:
|
||||
ShareAccess |= FILE_SHARE_WRITE;
|
||||
DesiredAccess |= GENERIC_READ;
|
||||
break;
|
||||
|
||||
case PIPE_ACCESS_OUTBOUND:
|
||||
ShareAccess |= FILE_SHARE_READ;
|
||||
DesiredAccess |= GENERIC_WRITE;
|
||||
break;
|
||||
|
||||
case PIPE_ACCESS_DUPLEX:
|
||||
ShareAccess |= FILE_SHARE_READ | FILE_SHARE_WRITE;
|
||||
DesiredAccess |= GENERIC_READ | GENERIC_WRITE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dwPipeMode & PIPE_TYPE_BYTE)
|
||||
{
|
||||
WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
|
||||
}
|
||||
else if (dwPipeMode & PIPE_TYPE_MESSAGE)
|
||||
{
|
||||
WriteModeMessage = FILE_PIPE_MESSAGE_MODE;
|
||||
}
|
||||
if (dwPipeMode & PIPE_TYPE_MESSAGE)
|
||||
WriteModeMessage = FILE_PIPE_MESSAGE_TYPE;
|
||||
else
|
||||
{
|
||||
WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
|
||||
}
|
||||
WriteModeMessage = FILE_PIPE_BYTE_STREAM_TYPE;
|
||||
|
||||
if (dwPipeMode & PIPE_READMODE_BYTE)
|
||||
{
|
||||
ReadModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
|
||||
}
|
||||
else if (dwPipeMode & PIPE_READMODE_MESSAGE)
|
||||
{
|
||||
ReadModeMessage = FILE_PIPE_MESSAGE_MODE;
|
||||
}
|
||||
if (dwPipeMode & PIPE_READMODE_MESSAGE)
|
||||
ReadModeMessage = FILE_PIPE_MESSAGE_MODE;
|
||||
else
|
||||
{
|
||||
ReadModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
|
||||
}
|
||||
ReadModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
|
||||
|
||||
if (dwPipeMode & PIPE_WAIT)
|
||||
{
|
||||
NonBlocking = FILE_PIPE_QUEUE_OPERATION;
|
||||
}
|
||||
else if (dwPipeMode & PIPE_NOWAIT)
|
||||
{
|
||||
NonBlocking = FILE_PIPE_COMPLETE_OPERATION;
|
||||
}
|
||||
if (dwPipeMode & PIPE_NOWAIT)
|
||||
NonBlocking = FILE_PIPE_COMPLETE_OPERATION;
|
||||
else
|
||||
{
|
||||
NonBlocking = FILE_PIPE_QUEUE_OPERATION;
|
||||
}
|
||||
|
||||
if (nMaxInstances >= PIPE_UNLIMITED_INSTANCES)
|
||||
{
|
||||
nMaxInstances = 0xFFFFFFFF;
|
||||
}
|
||||
NonBlocking = FILE_PIPE_QUEUE_OPERATION;
|
||||
|
||||
DefaultTimeOut.QuadPart = nDefaultTimeOut * -10000LL;
|
||||
|
||||
@@ -187,7 +168,7 @@ CreateNamedPipeW(LPCWSTR lpName,
|
||||
&ObjectAttributes,
|
||||
&Iosb,
|
||||
ShareAccess,
|
||||
CreateDisposition,
|
||||
FILE_OPEN_IF,
|
||||
CreateOptions,
|
||||
WriteModeMessage,
|
||||
ReadModeMessage,
|
||||
|
||||
@@ -59,6 +59,9 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
|
||||
Attributes |= OBJ_INHERIT;
|
||||
}
|
||||
|
||||
/* use default buffer size if desired */
|
||||
if (nSize == 0) nSize = 0x1000;
|
||||
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&PipeName,
|
||||
Attributes,
|
||||
@@ -66,7 +69,7 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
|
||||
SecurityDescriptor);
|
||||
|
||||
Status = NtCreateNamedPipeFile(&ReadPipeHandle,
|
||||
FILE_GENERIC_READ,
|
||||
FILE_GENERIC_READ | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
|
||||
&ObjectAttributes,
|
||||
&StatusBlock,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
@@ -86,10 +89,10 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
|
||||
}
|
||||
|
||||
Status = NtOpenFile(&WritePipeHandle,
|
||||
FILE_GENERIC_WRITE,
|
||||
FILE_GENERIC_WRITE | SYNCHRONIZE,
|
||||
&ObjectAttributes,
|
||||
&StatusBlock,
|
||||
0,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user