Sync with trunk r65656.
[reactos.git] / drivers / filesystems / npfs / 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 // File ID number for NPFS bugchecking support
14 #define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_SEINFO)
15
16 /* FUNCTIONS ******************************************************************/
17
18 NTSTATUS
19 NTAPI
20 NpCommonQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
21 IN PIRP Irp)
22 {
23 NODE_TYPE_CODE NodeTypeCode;
24 PIO_STACK_LOCATION IoStack;
25 NTSTATUS Status;
26 PNP_FCB Fcb;
27 PNP_CCB Ccb;
28 ULONG NamedPipeEnd;
29 PAGED_CODE();
30
31 IoStack = IoGetCurrentIrpStackLocation(Irp);
32
33 NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
34 (PVOID*)&Fcb,
35 &Ccb,
36 &NamedPipeEnd);
37 if (!NodeTypeCode) return STATUS_PIPE_DISCONNECTED;
38 if (NodeTypeCode != NPFS_NTC_CCB) return STATUS_INVALID_PARAMETER;
39
40 Status = SeQuerySecurityDescriptorInfo(&IoStack->Parameters.QuerySecurity.SecurityInformation,
41 Irp->UserBuffer,
42 &IoStack->Parameters.QuerySecurity.Length,
43 &Fcb->SecurityDescriptor);
44 if (Status == STATUS_BUFFER_TOO_SMALL)
45 {
46 Irp->IoStatus.Information = IoStack->Parameters.QuerySecurity.Length;
47 Status = STATUS_BUFFER_OVERFLOW;
48 }
49
50 return Status;
51 }
52
53 NTSTATUS
54 NTAPI
55 NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
56 IN PIRP Irp)
57 {
58 NODE_TYPE_CODE NodeTypeCode;
59 PIO_STACK_LOCATION IoStack;
60 NTSTATUS Status;
61 PNP_FCB Fcb;
62 PNP_CCB Ccb;
63 ULONG NamedPipeEnd;
64 PSECURITY_DESCRIPTOR OldSecurityDescriptor;
65 PSECURITY_DESCRIPTOR TempSecurityDescriptor;
66 PSECURITY_DESCRIPTOR NewSecurityDescriptor;
67 PAGED_CODE();
68
69 IoStack = IoGetCurrentIrpStackLocation(Irp);
70
71 NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
72 (PVOID*)&Fcb,
73 &Ccb,
74 &NamedPipeEnd);
75 if (!NodeTypeCode) return STATUS_PIPE_DISCONNECTED;
76 if (NodeTypeCode != NPFS_NTC_CCB) return STATUS_INVALID_PARAMETER;
77
78 OldSecurityDescriptor = TempSecurityDescriptor = Fcb->SecurityDescriptor;
79 Status = SeSetSecurityDescriptorInfo(NULL,
80 &IoStack->Parameters.SetSecurity.SecurityInformation,
81 IoStack->Parameters.SetSecurity.SecurityDescriptor,
82 &TempSecurityDescriptor,
83 TRUE,
84 IoGetFileObjectGenericMapping());
85 if (!NT_SUCCESS(Status)) return Status;
86
87 Status = ObLogSecurityDescriptor(TempSecurityDescriptor, &NewSecurityDescriptor, 1);
88 ASSERT(TempSecurityDescriptor != OldSecurityDescriptor);
89 ExFreePoolWithTag(TempSecurityDescriptor, 0);
90
91 if (!NT_SUCCESS(Status)) return Status;
92
93 Fcb->SecurityDescriptor = NewSecurityDescriptor;
94 ObDereferenceSecurityDescriptor(OldSecurityDescriptor, 1);
95 return Status;
96 }
97
98 NTSTATUS
99 NTAPI
100 NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
101 IN PIRP Irp)
102 {
103 NTSTATUS Status;
104 PAGED_CODE();
105
106 FsRtlEnterFileSystem();
107 NpAcquireExclusiveVcb();
108
109 Status = NpCommonQuerySecurityInfo(DeviceObject, Irp);
110
111 NpReleaseVcb();
112 FsRtlExitFileSystem();
113
114 if (Status != STATUS_PENDING)
115 {
116 Irp->IoStatus.Status = Status;
117 IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
118 }
119
120 return Status;
121 }
122
123 NTSTATUS
124 NTAPI
125 NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
126 IN PIRP Irp)
127 {
128 NTSTATUS Status;
129 PAGED_CODE();
130
131 FsRtlEnterFileSystem();
132 NpAcquireExclusiveVcb();
133
134 Status = NpCommonSetSecurityInfo(DeviceObject, Irp);
135
136 NpReleaseVcb();
137 FsRtlExitFileSystem();
138
139 if (Status != STATUS_PENDING)
140 {
141 Irp->IoStatus.Status = Status;
142 IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
143 }
144
145 return Status;
146 }
147
148 /* EOF */