* Sync up to trunk HEAD (r62502).
[reactos.git] / drivers / filesystems / npfs / close.c
1 /*
2 * PROJECT: ReactOS Named Pipe FileSystem
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/filesystems/npfs/close.c
5 * PURPOSE: Pipes Closing
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_CLOSE)
15
16 /* FUNCTIONS ******************************************************************/
17
18 NTSTATUS
19 NTAPI
20 NpCommonClose(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_ROOT_DCB)
40 {
41 --Fcb->CurrentInstances;
42 NpDeleteCcb(Ccb, &DeferredList);
43 }
44 else if (NodeTypeCode == NPFS_NTC_VCB)
45 {
46 --NpVcb->ReferenceCount;
47 }
48
49 NpReleaseVcb();
50 NpCompleteDeferredIrps(&DeferredList);
51
52 Irp->IoStatus.Status = STATUS_SUCCESS;
53 IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
54 return STATUS_SUCCESS;
55 }
56
57 NTSTATUS
58 NTAPI
59 NpFsdClose(IN PDEVICE_OBJECT DeviceObject,
60 IN PIRP Irp)
61 {
62 NTSTATUS Status;
63 PAGED_CODE();
64
65 FsRtlEnterFileSystem();
66
67 Status = NpCommonClose(DeviceObject, Irp);
68
69 FsRtlExitFileSystem();
70
71 return Status;
72 }
73
74 /* EOF */