diff --git a/reactos/lib/kernel32/file/npipe.c b/reactos/lib/kernel32/file/npipe.c index fa8338e2cf6..8997298d7cb 100644 --- a/reactos/lib/kernel32/file/npipe.c +++ b/reactos/lib/kernel32/file/npipe.c @@ -72,7 +72,6 @@ CreateNamedPipeW(LPCWSTR lpName, HANDLE PipeHandle; ACCESS_MASK DesiredAccess; ULONG CreateOptions; - ULONG CreateDisposition; ULONG WriteModeMessage; ULONG ReadModeMessage; ULONG NonBlocking; @@ -81,6 +80,12 @@ CreateNamedPipeW(LPCWSTR lpName, 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, NULL, @@ -108,77 +113,51 @@ 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 = 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 = CreateOptions | FILE_SYNCHRONOUS_IO_NONALERT; - if (dwPipeMode & PIPE_TYPE_BYTE) - { - WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE; - } - else if (dwPipeMode & PIPE_TYPE_MESSAGE) - { - WriteModeMessage = FILE_PIPE_MESSAGE_MODE; - } + switch (dwOpenMode & PIPE_ACCESS_DUPLEX) + { + case PIPE_ACCESS_INBOUND: + CreateOptions |= FILE_PIPE_INBOUND; + ShareAccess |= FILE_SHARE_WRITE; + DesiredAccess |= GENERIC_READ; + break; + + case PIPE_ACCESS_OUTBOUND: + CreateOptions |= FILE_PIPE_OUTBOUND; + ShareAccess |= FILE_SHARE_READ; + DesiredAccess |= GENERIC_WRITE; + break; + + case PIPE_ACCESS_DUPLEX: + CreateOptions |= FILE_PIPE_FULL_DUPLEX; + ShareAccess |= (FILE_SHARE_READ | FILE_SHARE_WRITE); + DesiredAccess |= (GENERIC_READ | GENERIC_WRITE); + break; + } + + if (dwPipeMode & PIPE_TYPE_MESSAGE) + WriteModeMessage = FILE_PIPE_MESSAGE_MODE; else - { - WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE; - } + WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE; - 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 +166,7 @@ CreateNamedPipeW(LPCWSTR lpName, &ObjectAttributes, &Iosb, ShareAccess, - CreateDisposition, + FILE_OPEN_IF, CreateOptions, WriteModeMessage, ReadModeMessage, @@ -371,7 +350,7 @@ ConnectNamedPipe(IN HANDLE hNamedPipe, /* * @implemented */ -BOOL +BOOL STDCALL SetNamedPipeHandleState(HANDLE hNamedPipe, LPDWORD lpMode, @@ -394,7 +373,7 @@ SetNamedPipeHandleState(HANDLE hNamedPipe, Settings.ReadMode = (*lpMode & PIPE_READMODE_MESSAGE) ? FILE_PIPE_MESSAGE_MODE: FILE_PIPE_BYTE_STREAM_MODE; - /* Send the changes to the Driver */ + /* Send the changes to the Driver */ Status = NtSetInformationFile(hNamedPipe, &Iosb, &Settings, @@ -406,7 +385,7 @@ SetNamedPipeHandleState(HANDLE hNamedPipe, return(FALSE); } } - + /* Check if the Collection count or Timeout are being changed */ if (lpMaxCollectionCount || lpCollectDataTimeout) { @@ -428,9 +407,9 @@ SetNamedPipeHandleState(HANDLE hNamedPipe, } } - /* Now set the new settings */ - RemoteSettings.MaximumCollectionCount = (lpMaxCollectionCount) ? - *lpMaxCollectionCount : + /* Now set the new settings */ + RemoteSettings.MaximumCollectionCount = (lpMaxCollectionCount) ? + *lpMaxCollectionCount : RemoteSettings.MaximumCollectionCount; if (lpCollectDataTimeout) {