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
9 /* INCLUDES *******************************************************************/
13 // File ID number for NPFS bugchecking support
14 #define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_SEINFO)
16 /* FUNCTIONS ******************************************************************/
20 NpCommonQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
23 NODE_TYPE_CODE NodeTypeCode
;
24 PIO_STACK_LOCATION IoStack
;
31 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
33 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
,
37 if (!NodeTypeCode
) return STATUS_PIPE_DISCONNECTED
;
38 if (NodeTypeCode
!= NPFS_NTC_CCB
) return STATUS_INVALID_PARAMETER
;
40 Status
= SeQuerySecurityDescriptorInfo(&IoStack
->Parameters
.QuerySecurity
.SecurityInformation
,
42 &IoStack
->Parameters
.QuerySecurity
.Length
,
43 &Fcb
->SecurityDescriptor
);
44 if (Status
== STATUS_BUFFER_TOO_SMALL
)
46 Irp
->IoStatus
.Information
= IoStack
->Parameters
.QuerySecurity
.Length
;
47 Status
= STATUS_BUFFER_OVERFLOW
;
55 NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
58 NODE_TYPE_CODE NodeTypeCode
;
59 PIO_STACK_LOCATION IoStack
;
64 PSECURITY_DESCRIPTOR OldSecurityDescriptor
;
65 PSECURITY_DESCRIPTOR TempSecurityDescriptor
;
66 PSECURITY_DESCRIPTOR NewSecurityDescriptor
;
69 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
71 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
,
75 if (!NodeTypeCode
) return STATUS_PIPE_DISCONNECTED
;
76 if (NodeTypeCode
!= NPFS_NTC_CCB
) return STATUS_INVALID_PARAMETER
;
78 OldSecurityDescriptor
= TempSecurityDescriptor
= Fcb
->SecurityDescriptor
;
79 Status
= SeSetSecurityDescriptorInfo(NULL
,
80 &IoStack
->Parameters
.SetSecurity
.SecurityInformation
,
81 IoStack
->Parameters
.SetSecurity
.SecurityDescriptor
,
82 &TempSecurityDescriptor
,
84 IoGetFileObjectGenericMapping());
85 if (!NT_SUCCESS(Status
)) return Status
;
87 Status
= ObLogSecurityDescriptor(TempSecurityDescriptor
, &NewSecurityDescriptor
, TRUE
);
88 ExFreePool(TempSecurityDescriptor
);
90 if (!NT_SUCCESS(Status
)) return Status
;
92 Fcb
->SecurityDescriptor
= NewSecurityDescriptor
;
93 ObDereferenceSecurityDescriptor(OldSecurityDescriptor
, 1);
99 NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
105 FsRtlEnterFileSystem();
106 NpAcquireExclusiveVcb();
108 Status
= NpCommonQuerySecurityInfo(DeviceObject
, Irp
);
111 FsRtlExitFileSystem();
113 if (Status
!= STATUS_PENDING
)
115 Irp
->IoStatus
.Status
= Status
;
116 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);
124 NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
130 FsRtlEnterFileSystem();
131 NpAcquireExclusiveVcb();
133 Status
= NpCommonSetSecurityInfo(DeviceObject
, Irp
);
136 FsRtlExitFileSystem();
138 if (Status
!= STATUS_PENDING
)
140 Irp
->IoStatus
.Status
= Status
;
141 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);