--- /dev/null
+/*
+ * PROJECT: ReactOS Named Pipe FileSystem
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: drivers/filesystems/npfs/seinfo.c
+ * PURPOSE: Pipes Security Information
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "npfs.h"
+
+// File ID number for NPFS bugchecking support
+#define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_SEINFO)
+
+/* FUNCTIONS ******************************************************************/
+
+NTSTATUS
+NTAPI
+NpCommonQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NODE_TYPE_CODE NodeTypeCode;
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+ PNP_FCB Fcb;
+ PNP_CCB Ccb;
+ ULONG NamedPipeEnd;
+ PAGED_CODE();
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
+ (PVOID*)&Fcb,
+ &Ccb,
+ &NamedPipeEnd);
+ if (!NodeTypeCode) return STATUS_PIPE_DISCONNECTED;
+ if (NodeTypeCode != NPFS_NTC_CCB) return STATUS_INVALID_PARAMETER;
+
+ Status = SeQuerySecurityDescriptorInfo(&IoStack->Parameters.QuerySecurity.SecurityInformation,
+ Irp->UserBuffer,
+ &IoStack->Parameters.QuerySecurity.Length,
+ &Fcb->SecurityDescriptor);
+ if (Status == STATUS_BUFFER_TOO_SMALL)
+ {
+ Irp->IoStatus.Information = IoStack->Parameters.QuerySecurity.Length;
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NODE_TYPE_CODE NodeTypeCode;
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+ PNP_FCB Fcb;
+ PNP_CCB Ccb;
+ ULONG NamedPipeEnd;
+ PSECURITY_DESCRIPTOR OldSecurityDescriptor;
+ PSECURITY_DESCRIPTOR TempSecurityDescriptor;
+ PSECURITY_DESCRIPTOR NewSecurityDescriptor;
+ PAGED_CODE();
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
+ (PVOID*)&Fcb,
+ &Ccb,
+ &NamedPipeEnd);
+ if (!NodeTypeCode) return STATUS_PIPE_DISCONNECTED;
+ if (NodeTypeCode != NPFS_NTC_CCB) return STATUS_INVALID_PARAMETER;
+
+ OldSecurityDescriptor = TempSecurityDescriptor = Fcb->SecurityDescriptor;
+ Status = SeSetSecurityDescriptorInfo(NULL,
+ &IoStack->Parameters.SetSecurity.SecurityInformation,
+ IoStack->Parameters.SetSecurity.SecurityDescriptor,
+ &TempSecurityDescriptor,
+ TRUE,
+ IoGetFileObjectGenericMapping());
+ if (!NT_SUCCESS(Status)) return Status;
+
+ Status = ObLogSecurityDescriptor(TempSecurityDescriptor, &NewSecurityDescriptor, 1);
+ ASSERT(TempSecurityDescriptor != OldSecurityDescriptor);
+ ExFreePoolWithTag(TempSecurityDescriptor, 0);
+
+ if (!NT_SUCCESS(Status)) return Status;
+
+ Fcb->SecurityDescriptor = NewSecurityDescriptor;
+ ObDereferenceSecurityDescriptor(OldSecurityDescriptor, 1);
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ PAGED_CODE();
+
+ FsRtlEnterFileSystem();
+ NpAcquireExclusiveVcb();
+
+ Status = NpCommonQuerySecurityInfo(DeviceObject, Irp);
+
+ NpReleaseVcb();
+ FsRtlExitFileSystem();
+
+ if (Status != STATUS_PENDING)
+ {
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
+ }
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ PAGED_CODE();
+
+ FsRtlEnterFileSystem();
+ NpAcquireExclusiveVcb();
+
+ Status = NpCommonSetSecurityInfo(DeviceObject, Irp);
+
+ NpReleaseVcb();
+ FsRtlExitFileSystem();
+
+ if (Status != STATUS_PENDING)
+ {
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
+ }
+
+ return Status;
+}
+
+/* EOF */