fix some flags calculations and access rights in CreateNamedPipe and CreatePipe

svn path=/trunk/; revision=18883
This commit is contained in:
Thomas Bluemel
2005-10-30 14:51:12 +00:00
parent c6d9a617be
commit c1245552ab
2 changed files with 48 additions and 64 deletions
+42 -61
View File
@@ -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,
+6 -3
View File
@@ -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))
{