[DRIVERS][NTOS][NDK] Use IO_STACK_LOCATION instead of EXTENDED_IO_STACK_LOCATION...
[reactos.git] / drivers / filesystems / npfs / create.c
index 4e46e5b..da2f967 100644 (file)
@@ -25,7 +25,7 @@ NpCheckForNotify(IN PNP_DCB Dcb,
     PIRP Irp;
     ULONG i;
     PAGED_CODE();
-    
+
     ListHead = &Dcb->NotifyList;
     for (i = 0; i < 2; i++)
     {
@@ -59,12 +59,14 @@ NpOpenNamedPipeFileSystem(IN PFILE_OBJECT FileObject,
 {
     IO_STATUS_BLOCK Status;
     PAGED_CODE();
+    TRACE("Entered\n");
 
     NpSetFileObject(FileObject, NpVcb, NULL, FALSE);
     ++NpVcb->ReferenceCount;
 
     Status.Information = FILE_OPENED;
     Status.Status = STATUS_SUCCESS;
+    TRACE("Leaving, Status.Status = %lx\n", Status.Status);
     return Status;
 }
 
@@ -78,6 +80,7 @@ NpOpenNamedPipeRootDirectory(IN PNP_DCB Dcb,
     IO_STATUS_BLOCK IoStatus;
     PNP_ROOT_DCB_FCB Ccb;
     PAGED_CODE();
+    TRACE("Entered\n");
 
     IoStatus.Status = NpCreateRootDcbCcb(&Ccb);
     if (NT_SUCCESS(IoStatus.Status))
@@ -93,6 +96,7 @@ NpOpenNamedPipeRootDirectory(IN PNP_DCB Dcb,
         IoStatus.Information = 0;
     }
 
+    TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
     return IoStatus;
 }
 
@@ -116,8 +120,8 @@ NpCreateClientEnd(IN PNP_FCB Fcb,
     USHORT NamedPipeConfiguration;
     PLIST_ENTRY NextEntry, ListHead;
     PNP_CCB Ccb = NULL;
+    TRACE("Entered\n");
 
-    IoStatus.Status = STATUS_SUCCESS;
     IoStatus.Information = 0;
     Privileges = NULL;
 
@@ -167,6 +171,7 @@ NpCreateClientEnd(IN PNP_FCB Fcb,
         ((GrantedAccess & FILE_WRITE_DATA) && (NamedPipeConfiguration == FILE_PIPE_OUTBOUND)))
     {
         IoStatus.Status = STATUS_ACCESS_DENIED;
+        TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
         return IoStatus;
     }
 
@@ -185,6 +190,7 @@ NpCreateClientEnd(IN PNP_FCB Fcb,
     if (NextEntry == ListHead)
     {
         IoStatus.Status = STATUS_PIPE_NOT_AVAILABLE;
+        TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
         return IoStatus;
     }
 
@@ -195,6 +201,7 @@ NpCreateClientEnd(IN PNP_FCB Fcb,
     if (!NT_SUCCESS(IoStatus.Status))
     {
         NpUninitializeSecurity(Ccb);
+        TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
         return IoStatus;
     }
 
@@ -203,15 +210,158 @@ NpCreateClientEnd(IN PNP_FCB Fcb,
 
     IoStatus.Information = FILE_OPENED;
     IoStatus.Status = STATUS_SUCCESS;
+    TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
     return IoStatus;
 }
 
+NTSTATUS
+NTAPI
+NpTranslateAlias(
+    PUNICODE_STRING PipeName)
+{
+    WCHAR UpcaseBuffer[MAX_INDEXED_LENGTH + 1];
+    UNICODE_STRING UpcaseString;
+    ULONG Length;
+    PNPFS_ALIAS CurrentAlias;
+    NTSTATUS Status;
+    BOOLEAN BufferAllocated, BackSlash;
+    LONG Result;
+    PAGED_CODE();
+
+    /* Get the pipe name length and check for empty string */
+    Length = PipeName->Length;
+    if (Length == 0)
+    {
+        return STATUS_SUCCESS;
+    }
+
+    /* Check if the name starts with a path separator */
+    BackSlash = (PipeName->Buffer[0] == OBJ_NAME_PATH_SEPARATOR);
+    if (BackSlash)
+    {
+        /* We are only interested in the part after the backslash */
+        Length -= sizeof(WCHAR);
+    }
+
+    /* Check if the length is within our indexed list bounds */
+    if ((Length >= MIN_INDEXED_LENGTH * sizeof(WCHAR)) &&
+        (Length <= MAX_INDEXED_LENGTH * sizeof(WCHAR)))
+    {
+        /* Length is within bounds, use the list by length */
+        CurrentAlias = NpAliasListByLength[(Length / sizeof(WCHAR)) - MIN_INDEXED_LENGTH];
+    }
+    else
+    {
+        /* We use the generic list, search for an entry of the right size */
+        CurrentAlias = NpAliasList;
+        while ((CurrentAlias != NULL) && (CurrentAlias->Name.Length != Length))
+        {
+            /* Check if we went past the desired length */
+            if (CurrentAlias->Name.Length > Length)
+            {
+                /* In this case there is no matching alias, return success */
+                return STATUS_SUCCESS;
+            }
+
+            /* Go to the next alias in the list */
+            CurrentAlias = CurrentAlias->Next;
+        }
+    }
+
+    /* Did we find any alias? */
+    if (CurrentAlias == NULL)
+    {
+        /* Nothing found, no matching alias */
+        return STATUS_SUCCESS;
+    }
+
+    /* Check whether we can use our stack buffer */
+    if (Length <= MAX_INDEXED_LENGTH * sizeof(WCHAR))
+    {
+        /* Initialize the upcased string */
+        UpcaseString.Buffer = UpcaseBuffer;
+        UpcaseString.MaximumLength = sizeof(UpcaseBuffer);
+
+        /* Upcase the pipe name */
+        Status = RtlUpcaseUnicodeString(&UpcaseString, PipeName, FALSE);
+        NT_ASSERT(NT_SUCCESS(Status));
+        BufferAllocated = FALSE;
+    }
+    else
+    {
+        /* Upcase the pipe name, allocate the string buffer */
+        Status = RtlUpcaseUnicodeString(&UpcaseString, PipeName, TRUE);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
+
+        BufferAllocated = TRUE;
+    }
+
+    /* Did the original name start with a backslash? */
+    if (BackSlash)
+    {
+        /* Skip it for the comparison */
+        UpcaseString.Buffer++;
+        UpcaseString.Length -= sizeof(WCHAR);
+    }
+
+    /* Make sure the length matches the "raw" length */
+    NT_ASSERT(UpcaseString.Length == Length);
+    NT_ASSERT(CurrentAlias->Name.Length == Length);
+
+    /* Loop while we have aliases */
+    do
+    {
+        /* Compare the names and check if they match */
+        Result = NpCompareAliasNames(&UpcaseString, &CurrentAlias->Name);
+        if (Result == 0)
+        {
+            /* The names match, use the target name */
+            *PipeName = *CurrentAlias->TargetName;
+
+            /* Did the original name start with a backslash? */
+            if (!BackSlash)
+            {
+                /* It didn't, so skip it in the target name as well */
+                PipeName->Buffer++;
+                PipeName->Length -= sizeof(WCHAR);
+            }
+            break;
+        }
+
+        /* Check if we went past all string candidates */
+        if (Result < 0)
+        {
+            /* Nothing found, we're done */
+            break;
+        }
+
+        /* Go to the next alias */
+        CurrentAlias = CurrentAlias->Next;
+
+        /* Keep looping while we have aliases of the right length */
+    } while ((CurrentAlias != NULL) && (CurrentAlias->Name.Length == Length));
+
+    /* Did we allocate a buffer? */
+    if (BufferAllocated)
+    {
+        /* Free the allocated buffer */
+        ASSERT(UpcaseString.Buffer != UpcaseBuffer);
+        RtlFreeUnicodeString(&UpcaseString);
+    }
+
+    return STATUS_SUCCESS;
+}
+
 NTSTATUS
 NTAPI
 NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
             IN PIRP Irp)
 {
-    PEXTENDED_IO_STACK_LOCATION IoStack;
+    IO_STATUS_BLOCK IoStatus;
+    PIO_STACK_LOCATION IoStack;
     UNICODE_STRING FileName;
     PFILE_OBJECT FileObject;
     PFILE_OBJECT RelatedFileObject;
@@ -222,16 +372,19 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
     ACCESS_MASK DesiredAccess;
     LIST_ENTRY DeferredList;
     UNICODE_STRING Prefix;
+    TRACE("Entered\n");
 
     InitializeListHead(&DeferredList);
-    IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp);
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
     FileObject = IoStack->FileObject;
     RelatedFileObject = FileObject->RelatedFileObject;
     FileName = FileObject->FileName;
     DesiredAccess = IoStack->Parameters.CreatePipe.SecurityContext->DesiredAccess;
 
+    IoStatus.Information = 0;
+
     FsRtlEnterFileSystem();
-    ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+    NpAcquireExclusiveVcb();
 
     if (RelatedFileObject)
     {
@@ -250,48 +403,49 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
             (FileName.Buffer[0] == OBJ_NAME_PATH_SEPARATOR) &&
             !(RelatedFileObject))
         {
-            Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
-                                                            FileObject,
-                                                            DesiredAccess,
-                                                            &DeferredList);
+            IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
+                                                    FileObject,
+                                                    DesiredAccess,
+                                                    &DeferredList);
             goto Quickie;
         }
     }
     else if (!(RelatedFileObject) || (Type == NPFS_NTC_VCB))
     {
-        Irp->IoStatus = NpOpenNamedPipeFileSystem(FileObject,
-                                                  DesiredAccess);
+        IoStatus = NpOpenNamedPipeFileSystem(FileObject,
+                                             DesiredAccess);
         goto Quickie;
     }
     else if (Type == NPFS_NTC_ROOT_DCB)
     {
-        Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
-                                                     FileObject,
-                                                     DesiredAccess,
-                                                     &DeferredList);
+        IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
+                                                FileObject,
+                                                DesiredAccess,
+                                                &DeferredList);
         goto Quickie;
     }
 
-    // Status = NpTranslateAlias(&FileName);; // ignore this for now
-    // if (!NT_SUCCESS(Status)) goto Quickie;
+    IoStatus.Status = NpTranslateAlias(&FileName);
+    if (!NT_SUCCESS(IoStatus.Status)) goto Quickie;
+
     if (RelatedFileObject)
     {
         if (Type == NPFS_NTC_ROOT_DCB)
         {
             Dcb = (PNP_DCB)Ccb;
-            Irp->IoStatus.Status = NpFindRelativePrefix(Dcb,
-                                                        &FileName,
-                                                        1,
-                                                        &Prefix,
-                                                        &Fcb);
-            if (!NT_SUCCESS(Irp->IoStatus.Status))
+            IoStatus.Status = NpFindRelativePrefix(Dcb,
+                                                   &FileName,
+                                                   1,
+                                                   &Prefix,
+                                                   &Fcb);
+            if (!NT_SUCCESS(IoStatus.Status))
             {
                 goto Quickie;
             }
         }
         else if ((Type != NPFS_NTC_CCB) || (FileName.Length))
         {
-            Irp->IoStatus.Status = STATUS_OBJECT_NAME_INVALID;
+            IoStatus.Status = STATUS_OBJECT_NAME_INVALID;
             goto Quickie;
         }
         else
@@ -304,65 +458,67 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
         if ((FileName.Length <= sizeof(OBJ_NAME_PATH_SEPARATOR)) ||
             (FileName.Buffer[0] != OBJ_NAME_PATH_SEPARATOR))
         {
-            Irp->IoStatus.Status = STATUS_OBJECT_NAME_INVALID;
+            IoStatus.Status = STATUS_OBJECT_NAME_INVALID;
             goto Quickie;
         }
 
-        Fcb = NpFindPrefix(&FileName, TRUE, &Prefix);
+        Fcb = NpFindPrefix(&FileName, 1, &Prefix);
     }
 
     if (Prefix.Length)
     {
-        Irp->IoStatus.Status = Fcb->NodeType != NPFS_NTC_FCB ?
-                                STATUS_OBJECT_NAME_NOT_FOUND :
-                                STATUS_OBJECT_NAME_INVALID;
+        IoStatus.Status = Fcb->NodeType != NPFS_NTC_FCB ?
+                           STATUS_OBJECT_NAME_NOT_FOUND :
+                           STATUS_OBJECT_NAME_INVALID;
         goto Quickie;
     }
 
     if (Fcb->NodeType != NPFS_NTC_FCB)
     {
-        Irp->IoStatus.Status = STATUS_OBJECT_NAME_INVALID;
+        IoStatus.Status = STATUS_OBJECT_NAME_INVALID;
         goto Quickie;
     }
 
     if (!Fcb->ServerOpenCount)
     {
-        Irp->IoStatus.Status = STATUS_OBJECT_NAME_NOT_FOUND;
+        IoStatus.Status = STATUS_OBJECT_NAME_NOT_FOUND;
         goto Quickie;
     }
 
-    Irp->IoStatus = NpCreateClientEnd(Fcb,
-                                      FileObject,
-                                      DesiredAccess,
-                                      IoStack->Parameters.CreatePipe.
-                                      SecurityContext->SecurityQos,
-                                      IoStack->Parameters.CreatePipe.
-                                      SecurityContext->AccessState,
-                                      IoStack->Flags &
-                                      SL_FORCE_ACCESS_CHECK ?
-                                      UserMode : Irp->RequestorMode,
-                                      Irp->Tail.Overlay.Thread,
-                                      &DeferredList);
+    IoStatus = NpCreateClientEnd(Fcb,
+                                 FileObject,
+                                 DesiredAccess,
+                                 IoStack->Parameters.CreatePipe.
+                                 SecurityContext->SecurityQos,
+                                 IoStack->Parameters.CreatePipe.
+                                 SecurityContext->AccessState,
+                                 IoStack->Flags &
+                                 SL_FORCE_ACCESS_CHECK ?
+                                 UserMode : Irp->RequestorMode,
+                                 Irp->Tail.Overlay.Thread,
+                                 &DeferredList);
 
 Quickie:
-    ExReleaseResourceLite(&NpVcb->Lock);
+    NpReleaseVcb();
     NpCompleteDeferredIrps(&DeferredList);
     FsRtlExitFileSystem();
 
+    Irp->IoStatus = IoStatus;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return Irp->IoStatus.Status;
+    TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
+    return IoStatus.Status;
 }
 
 IO_STATUS_BLOCK
 NTAPI
-NpCreateExistingNamedPipe(IN PNP_FCB Fcb, 
-                          IN PFILE_OBJECT FileObject, 
+NpCreateExistingNamedPipe(IN PNP_FCB Fcb,
+                          IN PFILE_OBJECT FileObject,
                           IN ACCESS_MASK DesiredAccess,
-                          IN PACCESS_STATE AccessState, 
-                          IN KPROCESSOR_MODE PreviousMode, 
-                          IN ULONG Disposition, 
-                          IN ULONG ShareAccess, 
-                          IN PNAMED_PIPE_CREATE_PARAMETERS Parameters, 
+                          IN PACCESS_STATE AccessState,
+                          IN KPROCESSOR_MODE PreviousMode,
+                          IN ULONG Disposition,
+                          IN ULONG ShareAccess,
+                          IN PNAMED_PIPE_CREATE_PARAMETERS Parameters,
                           IN PEPROCESS Process,
                           OUT PLIST_ENTRY List)
 {
@@ -375,6 +531,7 @@ NpCreateExistingNamedPipe(IN PNP_FCB Fcb,
     USHORT NamedPipeConfiguration, CheckShareAccess;
     BOOLEAN AccessGranted;
     PAGED_CODE();
+    TRACE("Entered\n");
 
     Privileges = NULL;
 
@@ -383,6 +540,8 @@ NpCreateExistingNamedPipe(IN PNP_FCB Fcb,
     SubjectSecurityContext = &AccessState->SubjectSecurityContext;
     SeLockSubjectContext(SubjectSecurityContext);
 
+    IoStatus.Information = 0;
+
     AccessGranted = SeAccessCheck(Fcb->SecurityDescriptor,
                                   SubjectSecurityContext,
                                   TRUE,
@@ -419,17 +578,23 @@ NpCreateExistingNamedPipe(IN PNP_FCB Fcb,
                            &AccessState->GenerateOnClose);
 
     SeUnlockSubjectContext(SubjectSecurityContext);
-    if (!AccessGranted) return IoStatus;
+    if (!AccessGranted)
+    {
+        TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
+        return IoStatus;
+    }
 
     if (Fcb->CurrentInstances >= Fcb->MaximumInstances)
     {
         IoStatus.Status = STATUS_INSTANCE_NOT_AVAILABLE;
+        TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
         return IoStatus;
     }
 
     if (Disposition == FILE_CREATE)
     {
         IoStatus.Status = STATUS_ACCESS_DENIED;
+        TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
         return IoStatus;
     }
 
@@ -450,6 +615,7 @@ NpCreateExistingNamedPipe(IN PNP_FCB Fcb,
     if (CheckShareAccess != ShareAccess)
     {
         IoStatus.Status = STATUS_ACCESS_DENIED;
+        TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
         return IoStatus;
     }
 
@@ -471,6 +637,7 @@ NpCreateExistingNamedPipe(IN PNP_FCB Fcb,
     {
         --Ccb->Fcb->CurrentInstances;
         NpDeleteCcb(Ccb, List);
+        TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
         return IoStatus;
     }
 
@@ -479,7 +646,8 @@ NpCreateExistingNamedPipe(IN PNP_FCB Fcb,
     NpCheckForNotify(Fcb->ParentDcb, 0, List);
 
     IoStatus.Status = STATUS_SUCCESS;
-    IoStatus.Information = 1;
+    IoStatus.Information = FILE_OPENED;
+    TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
     return IoStatus;
 }
 
@@ -495,7 +663,7 @@ NpCreateNewNamedPipe(IN PNP_DCB Dcb,
                      IN PNAMED_PIPE_CREATE_PARAMETERS Parameters,
                      IN PEPROCESS Process,
                      IN PLIST_ENTRY List,
-                     IN PIO_STATUS_BLOCK IoStatus)
+                     OUT PIO_STATUS_BLOCK IoStatus)
 {
     NTSTATUS Status;
     USHORT NamedPipeConfiguration;
@@ -504,10 +672,11 @@ NpCreateNewNamedPipe(IN PNP_DCB Dcb,
     PNP_CCB Ccb;
     PNP_FCB Fcb;
     PAGED_CODE();
+    TRACE("Entered\n");
 
     if (!(Parameters->TimeoutSpecified) ||
         !(Parameters->MaximumInstances) ||
-        (Parameters->DefaultTimeout.HighPart >= 0))
+        (Parameters->DefaultTimeout.QuadPart >= 0))
     {
         Status = STATUS_INVALID_PARAMETER;
         goto Quickie;
@@ -537,7 +706,8 @@ NpCreateNewNamedPipe(IN PNP_DCB Dcb,
         goto Quickie;
     }
 
-    if (!Parameters->NamedPipeType && Parameters->ReadMode == 1)
+    if (Parameters->NamedPipeType == FILE_PIPE_BYTE_STREAM_TYPE &&
+        Parameters->ReadMode == FILE_PIPE_MESSAGE_MODE)
     {
         Status = STATUS_INVALID_PARAMETER;
         goto Quickie;
@@ -567,12 +737,12 @@ NpCreateNewNamedPipe(IN PNP_DCB Dcb,
     }
 
     SecurityContext = &AccessState->SubjectSecurityContext;
-    SeLockSubjectContext(&AccessState->SubjectSecurityContext);
+    SeLockSubjectContext(SecurityContext);
 
-    Status = SeAssignSecurity(0,
+    Status = SeAssignSecurity(NULL,
                               AccessState->SecurityDescriptor,
                               &SecurityDescriptor,
-                              0,
+                              FALSE,
                               SecurityContext,
                               IoGetFileObjectGenericMapping(),
                               PagedPool);
@@ -587,7 +757,7 @@ NpCreateNewNamedPipe(IN PNP_DCB Dcb,
     Status = ObLogSecurityDescriptor(SecurityDescriptor,
                                      &CachedSecurityDescriptor,
                                      1);
-    ExFreePool(SecurityDescriptor);
+    ExFreePoolWithTag(SecurityDescriptor, 0);
 
     if (!NT_SUCCESS(Status))
     {
@@ -606,9 +776,11 @@ NpCreateNewNamedPipe(IN PNP_DCB Dcb,
     IoStatus->Status = STATUS_SUCCESS;
     IoStatus->Information = FILE_CREATED;
 
+    TRACE("Leaving, STATUS_SUCCESS\n");
     return STATUS_SUCCESS;
 
 Quickie:
+    TRACE("Leaving, Status = %lx\n", Status);
     IoStatus->Information = 0;
     IoStatus->Status = Status;
     return Status;
@@ -619,7 +791,7 @@ NTAPI
 NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
                      IN PIRP Irp)
 {
-    PEXTENDED_IO_STACK_LOCATION IoStack;
+    PIO_STACK_LOCATION IoStack;
     PFILE_OBJECT FileObject;
     PFILE_OBJECT RelatedFileObject;
     USHORT Disposition, ShareAccess;
@@ -630,11 +802,12 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
     UNICODE_STRING Prefix;
     PNAMED_PIPE_CREATE_PARAMETERS Parameters;
     IO_STATUS_BLOCK IoStatus;
+    TRACE("Entered\n");
 
     InitializeListHead(&DeferredList);
     Process = IoGetRequestorProcess(Irp);
 
-    IoStack = (PEXTENDED_IO_STACK_LOCATION) IoGetCurrentIrpStackLocation(Irp);
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
     FileObject = IoStack->FileObject;
     RelatedFileObject = FileObject->RelatedFileObject;
 
@@ -642,11 +815,8 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
     ShareAccess = IoStack->Parameters.CreatePipe.ShareAccess & 0xFFFF;
     Parameters = IoStack->Parameters.CreatePipe.Parameters;
 
-    FileName.Buffer = FileObject->FileName.Buffer;
-    FileName.Length = FileObject->FileName.Length;
-    FileName.MaximumLength = FileObject->FileName.MaximumLength;
+    FileName = FileObject->FileName;
 
-    IoStatus.Status = STATUS_SUCCESS;
     IoStatus.Information = 0;
 
     FsRtlEnterFileSystem();
@@ -683,7 +853,7 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
             goto Quickie;
         }
 
-        Fcb = NpFindPrefix(&FileName, TRUE, &Prefix);
+        Fcb = NpFindPrefix(&FileName, 1, &Prefix);
     }
 
     if (Prefix.Length)
@@ -738,6 +908,7 @@ Quickie:
     NpCompleteDeferredIrps(&DeferredList);
     FsRtlExitFileSystem();
 
+    TRACE("Leaving, IoStatus.Status = %lx\n", IoStatus.Status);
     Irp->IoStatus = IoStatus;
     IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
     return IoStatus.Status;