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 /* FUNCTIONS ******************************************************************/
17 NpCommonQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
20 NODE_TYPE_CODE NodeTypeCode
;
21 PIO_STACK_LOCATION IoStack
;
28 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
30 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
,
34 if (!NodeTypeCode
) return STATUS_PIPE_DISCONNECTED
;
35 if (NodeTypeCode
!= NPFS_NTC_CCB
) return STATUS_INVALID_PARAMETER
;
37 Status
= SeQuerySecurityDescriptorInfo(&IoStack
->Parameters
.QuerySecurity
.SecurityInformation
,
39 &IoStack
->Parameters
.QuerySecurity
.Length
,
40 &Fcb
->SecurityDescriptor
);
41 if (Status
== STATUS_BUFFER_TOO_SMALL
)
43 Irp
->IoStatus
.Information
= IoStack
->Parameters
.QuerySecurity
.Length
;
44 Status
= STATUS_BUFFER_OVERFLOW
;
52 NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
55 NODE_TYPE_CODE NodeTypeCode
;
56 PIO_STACK_LOCATION IoStack
;
61 PVOID CachedSecurityDescriptor
, SecurityDescriptor
;
64 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
66 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
,
70 if (!NodeTypeCode
) return STATUS_PIPE_DISCONNECTED
;
71 if (NodeTypeCode
!= NPFS_NTC_CCB
) return STATUS_INVALID_PARAMETER
;
73 Status
= SeSetSecurityDescriptorInfo(NULL
,
74 &IoStack
->Parameters
.SetSecurity
.SecurityInformation
,
75 IoStack
->Parameters
.SetSecurity
.SecurityDescriptor
,
78 IoGetFileObjectGenericMapping());
79 if (!NT_SUCCESS(Status
)) return Status
;
81 Status
= ObLogSecurityDescriptor(SecurityDescriptor
, &CachedSecurityDescriptor
, TRUE
);
82 ExFreePool(SecurityDescriptor
);
84 if (!NT_SUCCESS(Status
)) return Status
;
86 Fcb
->SecurityDescriptor
= CachedSecurityDescriptor
;
87 ObDereferenceSecurityDescriptor(SecurityDescriptor
, 1);
93 NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
99 FsRtlEnterFileSystem();
100 NpAcquireExclusiveVcb();
102 Status
= NpCommonQuerySecurityInfo(DeviceObject
, Irp
);
105 FsRtlExitFileSystem();
107 if (Status
!= STATUS_PENDING
)
109 Irp
->IoStatus
.Status
= Status
;
110 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);
118 NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
124 FsRtlEnterFileSystem();
125 NpAcquireExclusiveVcb();
127 Status
= NpCommonQuerySecurityInfo(DeviceObject
, Irp
);
130 FsRtlExitFileSystem();
132 if (Status
!= STATUS_PENDING
)
134 Irp
->IoStatus
.Status
= Status
;
135 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);