ConnectNamedPipe must return TRUE if lpOverlapped is not NULL and NtFsIoControl retur...
[reactos.git] / reactos / lib / kernel32 / file / npipe.c
index 71d23b4..687888b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: npipe.c,v 1.21 2004/12/23 20:13:19 ekohl Exp $
+/* $Id$
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
@@ -123,14 +123,17 @@ CreateNamedPipeW(LPCWSTR lpName,
    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;
      }
 
    if (dwPipeMode & PIPE_TYPE_BYTE)
@@ -262,8 +265,8 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
                       FILE_GENERIC_READ,
                       &ObjectAttributes,
                       &Iosb,
-                      0,
-                      FILE_SYNCHRONOUS_IO_ALERT);
+                      FILE_SHARE_READ | FILE_SHARE_WRITE,
+                      FILE_SYNCHRONOUS_IO_NONALERT);
    if (!NT_SUCCESS(Status))
      {
        SetLastErrorByStatus (Status);
@@ -327,6 +330,9 @@ ConnectNamedPipe(HANDLE hNamedPipe,
                           0,
                           NULL,
                           0);
+  if ((lpOverlapped != NULL) && (Status == STATUS_PENDING))
+    return TRUE;
+
   if ((lpOverlapped == NULL) && (Status == STATUS_PENDING))
     {
       Status = NtWaitForSingleObject(hNamedPipe,
@@ -335,17 +341,19 @@ ConnectNamedPipe(HANDLE hNamedPipe,
       if (!NT_SUCCESS(Status))
        {
          SetLastErrorByStatus(Status);
-         return(FALSE);
+         return FALSE;
        }
       Status = Iosb.Status;
     }
+
   if ((!NT_SUCCESS(Status) && Status != STATUS_PIPE_CONNECTED) ||
       (Status == STATUS_PENDING))
     {
       SetLastErrorByStatus(Status);
-      return(FALSE);
+      return FALSE;
     }
-  return(TRUE);
+
+  return TRUE;
 }