[NPFS_NEW]: Add file header info.
[reactos.git] / reactos / drivers / filesystems / npfs_new / seinfo.c
1 /*
2 * PROJECT: ReactOS Named Pipe FileSystem
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/filesystems/npfs/seinfo.c
5 * PURPOSE: Pipes Security Information
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "npfs.h"
12
13 /* FUNCTIONS ******************************************************************/
14
15 NTSTATUS
16 NTAPI
17 NpCommonQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
18 IN PIRP Irp)
19 {
20 NODE_TYPE_CODE NodeTypeCode;
21 PIO_STACK_LOCATION IoStack;
22 NTSTATUS Status;
23 PNP_FCB Fcb;
24 PNP_CCB Ccb;
25 ULONG NamedPipeEnd;
26 PAGED_CODE();
27
28 IoStack = IoGetCurrentIrpStackLocation(Irp);
29
30 NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
31 (PVOID*)&Fcb,
32 &Ccb,
33 &NamedPipeEnd);
34 if (!NodeTypeCode) return STATUS_PIPE_DISCONNECTED;
35 if (NodeTypeCode != NPFS_NTC_CCB) return STATUS_INVALID_PARAMETER;
36
37 Status = SeQuerySecurityDescriptorInfo(&IoStack->Parameters.QuerySecurity.SecurityInformation,
38 Irp->UserBuffer,
39 &IoStack->Parameters.QuerySecurity.Length,
40 &Fcb->SecurityDescriptor);
41 if (Status == STATUS_BUFFER_TOO_SMALL)
42 {
43 Irp->IoStatus.Information = IoStack->Parameters.QuerySecurity.Length;
44 Status = STATUS_BUFFER_OVERFLOW;
45 }
46
47 return Status;
48 }
49
50 NTSTATUS
51 NTAPI
52 NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
53 IN PIRP Irp)
54 {
55 NODE_TYPE_CODE NodeTypeCode;
56 PIO_STACK_LOCATION IoStack;
57 NTSTATUS Status;
58 PNP_FCB Fcb;
59 PNP_CCB Ccb;
60 ULONG NamedPipeEnd;
61 PVOID CachedSecurityDescriptor, SecurityDescriptor;
62 PAGED_CODE();
63
64 IoStack = IoGetCurrentIrpStackLocation(Irp);
65
66 NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
67 (PVOID*)&Fcb,
68 &Ccb,
69 &NamedPipeEnd);
70 if (!NodeTypeCode) return STATUS_PIPE_DISCONNECTED;
71 if (NodeTypeCode != NPFS_NTC_CCB) return STATUS_INVALID_PARAMETER;
72
73 Status = SeSetSecurityDescriptorInfo(NULL,
74 &IoStack->Parameters.SetSecurity.SecurityInformation,
75 IoStack->Parameters.SetSecurity.SecurityDescriptor,
76 &SecurityDescriptor,
77 TRUE,
78 IoGetFileObjectGenericMapping());
79 if (!NT_SUCCESS(Status)) return Status;
80
81 Status = ObLogSecurityDescriptor(SecurityDescriptor, &CachedSecurityDescriptor, TRUE);
82 ExFreePool(SecurityDescriptor);
83
84 if (!NT_SUCCESS(Status)) return Status;
85
86 Fcb->SecurityDescriptor = CachedSecurityDescriptor;
87 ObDereferenceSecurityDescriptor(SecurityDescriptor, 1);
88 return Status;
89 }
90
91 NTSTATUS
92 NTAPI
93 NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
94 IN PIRP Irp)
95 {
96 NTSTATUS Status;
97 PAGED_CODE();
98
99 FsRtlEnterFileSystem();
100 NpAcquireExclusiveVcb();
101
102 Status = NpCommonQuerySecurityInfo(DeviceObject, Irp);
103
104 NpReleaseVcb();
105 FsRtlExitFileSystem();
106
107 if (Status != STATUS_PENDING)
108 {
109 Irp->IoStatus.Status = Status;
110 IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
111 }
112
113 return Status;
114 }
115
116 NTSTATUS
117 NTAPI
118 NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
119 IN PIRP Irp)
120 {
121 NTSTATUS Status;
122 PAGED_CODE();
123
124 FsRtlEnterFileSystem();
125 NpAcquireExclusiveVcb();
126
127 Status = NpCommonQuerySecurityInfo(DeviceObject, Irp);
128
129 NpReleaseVcb();
130 FsRtlExitFileSystem();
131
132 if (Status != STATUS_PENDING)
133 {
134 Irp->IoStatus.Status = Status;
135 IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
136 }
137
138 return Status;
139 }
140
141 /* EOF */