xref: /reactos/drivers/filesystems/npfs/cleanup.c (revision c2c66aff)
1 /*
2  * PROJECT:     ReactOS Named Pipe FileSystem
3  * LICENSE:     BSD - See COPYING.ARM in the top level directory
4  * FILE:        drivers/filesystems/npfs/cleanup.c
5  * PURPOSE:     Pipes Cleanup
6  * PROGRAMMERS: ReactOS Portable Systems Group
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include "npfs.h"
12 
13 // File ID number for NPFS bugchecking support
14 #define NPFS_BUGCHECK_FILE_ID   (NPFS_BUGCHECK_CLEANUP)
15 
16 /* FUNCTIONS ******************************************************************/
17 
18 NTSTATUS
19 NTAPI
NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)20 NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject,
21                 IN PIRP Irp)
22 {
23     PIO_STACK_LOCATION IoStack;
24     NODE_TYPE_CODE NodeTypeCode;
25     LIST_ENTRY DeferredList;
26     PNP_FCB Fcb;
27     PNP_CCB Ccb;
28     ULONG NamedPipeEnd;
29     PAGED_CODE();
30 
31     IoStack = IoGetCurrentIrpStackLocation(Irp);
32     InitializeListHead(&DeferredList);
33 
34     NpAcquireExclusiveVcb();
35     NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
36                                       (PVOID*)&Fcb,
37                                       &Ccb,
38                                       &NamedPipeEnd);
39     if (NodeTypeCode == NPFS_NTC_CCB)
40     {
41         if (NamedPipeEnd == FILE_PIPE_SERVER_END)
42         {
43             ASSERT(Ccb->Fcb->ServerOpenCount != 0);
44             --Ccb->Fcb->ServerOpenCount;
45         }
46 
47         NpSetClosingPipeState(Ccb, Irp, NamedPipeEnd, &DeferredList);
48     }
49 
50     NpReleaseVcb();
51     NpCompleteDeferredIrps(&DeferredList);
52 
53     return STATUS_SUCCESS;
54 }
55 
56 NTSTATUS
57 NTAPI
NpFsdCleanup(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)58 NpFsdCleanup(IN PDEVICE_OBJECT DeviceObject,
59              IN PIRP Irp)
60 {
61     NTSTATUS Status;
62     PAGED_CODE();
63 
64     FsRtlEnterFileSystem();
65 
66     Status = NpCommonCleanup(DeviceObject, Irp);
67 
68     FsRtlExitFileSystem();
69 
70     if (Status != STATUS_PENDING)
71     {
72         Irp->IoStatus.Status = Status;
73         IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
74     }
75 
76     return Status;
77 }
78 
79 /* EOF */
80