fix some flags calculations and access rights in CreateNamedPipe and CreatePipe Modified: trunk/reactos/lib/kernel32/file/npipe.c Modified: trunk/reactos/lib/kernel32/file/pipe.c _____
Modified: trunk/reactos/lib/kernel32/file/npipe.c --- trunk/reactos/lib/kernel32/file/npipe.c 2005-10-30 13:55:28 UTC (rev 18882) +++ trunk/reactos/lib/kernel32/file/npipe.c 2005-10-30 14:51:12 UTC (rev 18883) @@ -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 @@ HANDLE PipeHandle; ACCESS_MASK DesiredAccess; ULONG CreateOptions; - ULONG CreateDisposition; ULONG WriteModeMessage; ULONG ReadModeMessage; ULONG NonBlocking; @@ -80,6 +85,12 @@ 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,78 +119,48 @@ 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 = 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; - } + CreateOptions |= FILE_SYNCHRONOUS_IO_NONALERT;
- if (dwPipeMode & PIPE_TYPE_BYTE) + switch (dwOpenMode & PIPE_ACCESS_DUPLEX) { - WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE; + 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; } - 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; - } + NonBlocking = FILE_PIPE_QUEUE_OPERATION;
- if (nMaxInstances >= PIPE_UNLIMITED_INSTANCES) - { - nMaxInstances = 0xFFFFFFFF; - } - DefaultTimeOut.QuadPart = nDefaultTimeOut * -10000LL;
Status = NtCreateNamedPipeFile(&PipeHandle, @@ -187,7 +168,7 @@ &ObjectAttributes, &Iosb, ShareAccess, - CreateDisposition, + FILE_OPEN_IF, CreateOptions, WriteModeMessage, ReadModeMessage, _____
Modified: trunk/reactos/lib/kernel32/file/pipe.c --- trunk/reactos/lib/kernel32/file/pipe.c 2005-10-30 13:55:28 UTC (rev 18882) +++ trunk/reactos/lib/kernel32/file/pipe.c 2005-10-30 14:51:12 UTC (rev 18883) @@ -59,6 +59,9 @@
Attributes |= OBJ_INHERIT; }
+ /* use default buffer size if desired */ + if (nSize == 0) nSize = 0x1000; + InitializeObjectAttributes(&ObjectAttributes, &PipeName, Attributes, @@ -66,7 +69,7 @@ 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 @@ }
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)) {