Reapply a modified r18883 patch (by Thomas Weidenmueller) that doesn't break named...
authorEric Kohl <eric.kohl@reactos.org>
Sat, 5 Nov 2005 16:11:31 +0000 (16:11 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 5 Nov 2005 16:11:31 +0000 (16:11 +0000)
svn path=/trunk/; revision=19019

reactos/lib/kernel32/file/npipe.c

index fa8338e..8997298 100644 (file)
@@ -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;
-     }
-   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_WRITE_THROUGH;
 
-   if (dwPipeMode & PIPE_TYPE_BYTE)
-     {
-       WriteModeMessage = FILE_PIPE_BYTE_STREAM_MODE;
-     }
-   else if (dwPipeMode & PIPE_TYPE_MESSAGE)
-     {
-       WriteModeMessage = FILE_PIPE_MESSAGE_MODE;
-     }
+   if (!(dwOpenMode & FILE_FLAG_OVERLAPPED))
+      CreateOptions = CreateOptions | FILE_SYNCHRONOUS_IO_NONALERT;
+
+   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)
         {