Reapply a modified r18883 patch (by Thomas Weidenmueller) that doesn't
break named pipes.
Modified: trunk/reactos/lib/kernel32/file/npipe.c
_____
Modified: trunk/reactos/lib/kernel32/file/npipe.c
--- trunk/reactos/lib/kernel32/file/npipe.c 2005-11-05 16:11:02 UTC
(rev 19018)
+++ trunk/reactos/lib/kernel32/file/npipe.c 2005-11-05 16:11:31 UTC
(rev 19019)
@@ -72,7 +72,6 @@
HANDLE PipeHandle;
ACCESS_MASK DesiredAccess;
ULONG CreateOptions;
- ULONG CreateDisposition;
ULONG WriteModeMessage;
ULONG ReadModeMessage;
ULONG NonBlocking;
@@ -81,6 +80,12 @@
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,78 +113,52 @@
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;
- }
+ NonBlocking = FILE_PIPE_QUEUE_OPERATION;
- if (nMaxInstances >= PIPE_UNLIMITED_INSTANCES)
- {
- nMaxInstances = 0xFFFFFFFF;
- }
-
DefaultTimeOut.QuadPart = nDefaultTimeOut * -10000LL;
Status = NtCreateNamedPipeFile(&PipeHandle,
@@ -187,7 +166,7 @@
&ObjectAttributes,
&Iosb,
ShareAccess,
- CreateDisposition,
+ FILE_OPEN_IF,
CreateOptions,
WriteModeMessage,
ReadModeMessage,
@@ -371,7 +350,7 @@
/*
* @implemented
*/
-BOOL
+BOOL
STDCALL
SetNamedPipeHandleState(HANDLE hNamedPipe,
LPDWORD lpMode,
@@ -394,7 +373,7 @@
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 @@
return(FALSE);
}
}
-
+
/* Check if the Collection count or Timeout are being changed */
if (lpMaxCollectionCount || lpCollectDataTimeout)
{
@@ -428,9 +407,9 @@
}
}
- /* Now set the new settings */
- RemoteSettings.MaximumCollectionCount = (lpMaxCollectionCount)
?
- *lpMaxCollectionCount :
+ /* Now set the new settings */
+ RemoteSettings.MaximumCollectionCount = (lpMaxCollectionCount)
?
+ *lpMaxCollectionCount :
RemoteSettings.MaximumCollectionCount;
if (lpCollectDataTimeout)
{