Use the share disposition to detect the direction of a pipe.
authorHartmut Birr <osexpert@googlemail.com>
Sat, 5 Nov 2005 22:03:47 +0000 (22:03 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Sat, 5 Nov 2005 22:03:47 +0000 (22:03 +0000)
svn path=/trunk/; revision=19021

reactos/drivers/fs/np/create.c
reactos/lib/kernel32/file/npipe.c
reactos/lib/kernel32/file/pipe.c

index 2faef1c..198b3d9 100644 (file)
@@ -329,6 +329,14 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
 
    Irp->IoStatus.Information = 0;
 
+   if (!(IoStack->Parameters.CreatePipe.ShareAccess & (FILE_SHARE_READ|FILE_SHARE_WRITE)) ||
+       (IoStack->Parameters.CreatePipe.ShareAccess & ~(FILE_SHARE_READ|FILE_SHARE_WRITE)))
+     {
+       Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
+       IoCompleteRequest(Irp, IO_NO_INCREMENT);
+       return STATUS_INVALID_PARAMETER;
+     }
+
    Fcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB));
    if (Fcb == NULL)
      {
@@ -411,12 +419,23 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
        Pipe->WriteMode = Buffer->ReadMode;
        Pipe->ReadMode = Buffer->ReadMode;
        Pipe->CompletionMode = Buffer->CompletionMode;
-       Pipe->PipeConfiguration = IoStack->Parameters.CreatePipe.Options & 0x3;
+       switch (IoStack->Parameters.CreatePipe.ShareAccess & (FILE_SHARE_READ|FILE_SHARE_WRITE))
+         {
+           case FILE_SHARE_READ:
+             Pipe->PipeConfiguration = FILE_PIPE_OUTBOUND;
+             break;
+           case FILE_SHARE_WRITE:
+             Pipe->PipeConfiguration = FILE_PIPE_INBOUND;
+             break;
+           case FILE_SHARE_READ|FILE_SHARE_WRITE:
+             Pipe->PipeConfiguration = FILE_PIPE_FULL_DUPLEX;
+             break;
+         }
        Pipe->MaximumInstances = Buffer->MaximumInstances;
        Pipe->CurrentInstances = 0;
        Pipe->TimeOut = Buffer->DefaultTimeout;
-       if (!(IoStack->Parameters.CreatePipe.Options & FILE_PIPE_OUTBOUND) ||
-           IoStack->Parameters.CreatePipe.Options & FILE_PIPE_FULL_DUPLEX)
+       if (!(Pipe->PipeConfiguration & FILE_PIPE_OUTBOUND) ||
+           Pipe->PipeConfiguration & FILE_PIPE_FULL_DUPLEX)
          {
            if (Buffer->InboundQuota == 0)
              {
@@ -440,7 +459,7 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
            Pipe->InboundQuota = 0;
          }
 
-       if (IoStack->Parameters.CreatePipe.Options & (FILE_PIPE_FULL_DUPLEX|FILE_PIPE_OUTBOUND))
+       if (Pipe->PipeConfiguration & (FILE_PIPE_FULL_DUPLEX|FILE_PIPE_OUTBOUND))
          {
            if (Buffer->OutboundQuota == 0)
              {
index 8997298..f926dc4 100644 (file)
@@ -123,27 +123,16 @@ CreateNamedPipeW(LPCWSTR lpName,
    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 (dwOpenMode & PIPE_ACCESS_OUTBOUND)
+     {
+       ShareAccess |= FILE_SHARE_READ;
+       DesiredAccess |= GENERIC_WRITE;
+     }
+   if (dwOpenMode & PIPE_ACCESS_INBOUND)
+     {
+       ShareAccess |= FILE_SHARE_WRITE;
+       DesiredAccess |= GENERIC_READ;
+     }
    if (dwPipeMode & PIPE_TYPE_MESSAGE)
       WriteModeMessage = FILE_PIPE_MESSAGE_MODE;
    else
index abeba30..dc23507 100644 (file)
@@ -41,11 +41,11 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
    ULONG Attributes;
    PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
 
-   DefaultTimeout.QuadPart = 300000000; /* 30 seconds */
+   DefaultTimeout.QuadPart = -300000000; /* 30 seconds */
 
    PipeId = (ULONG)InterlockedIncrement((LONG*)&ProcessPipeId);
    swprintf(Buffer,
-           L"\\Device\\NamedPipe\\Win32Pipes.%08x.%08x",
+           L"\\\\.\\PIPE\\Win32Pipes.%08x.%08x",
            NtCurrentTeb()->Cid.UniqueProcess,
            PipeId);
    RtlInitUnicodeString (&PipeName,
@@ -73,7 +73,7 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
                                  FILE_GENERIC_READ |FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
                                  &ObjectAttributes,
                                  &StatusBlock,
-                                 FILE_SHARE_READ | FILE_SHARE_WRITE,
+                                 FILE_SHARE_WRITE,
                                  FILE_CREATE,
                                  FILE_SYNCHRONOUS_IO_NONALERT,
                                  FALSE,
@@ -93,8 +93,8 @@ BOOL STDCALL CreatePipe(PHANDLE hReadPipe,
                       FILE_GENERIC_WRITE | SYNCHRONIZE,
                       &ObjectAttributes,
                       &StatusBlock,
-                      FILE_SHARE_READ | FILE_SHARE_WRITE,
-                      FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
+                      FILE_SHARE_READ,
+                      FILE_SYNCHRONOUS_IO_NONALERT);
    if (!NT_SUCCESS(Status))
      {
        NtClose(ReadPipeHandle);