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 PVOID CachedSecurityDescriptor
, SecurityDescriptor
;
67 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
69 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
,
73 if (!NodeTypeCode
) return STATUS_PIPE_DISCONNECTED
;
74 if (NodeTypeCode
!= NPFS_NTC_CCB
) return STATUS_INVALID_PARAMETER
;
76 Status
= SeSetSecurityDescriptorInfo(NULL
,
77 &IoStack
->Parameters
.SetSecurity
.SecurityInformation
,
78 IoStack
->Parameters
.SetSecurity
.SecurityDescriptor
,
81 IoGetFileObjectGenericMapping());
82 if (!NT_SUCCESS(Status
)) return Status
;
84 Status
= ObLogSecurityDescriptor(SecurityDescriptor
, &CachedSecurityDescriptor
, TRUE
);
85 ExFreePool(SecurityDescriptor
);
87 if (!NT_SUCCESS(Status
)) return Status
;
89 Fcb
->SecurityDescriptor
= CachedSecurityDescriptor
;
90 ObDereferenceSecurityDescriptor(SecurityDescriptor
, 1);
96 NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
102 FsRtlEnterFileSystem();
103 NpAcquireExclusiveVcb();
105 Status
= NpCommonQuerySecurityInfo(DeviceObject
, Irp
);
108 FsRtlExitFileSystem();
110 if (Status
!= STATUS_PENDING
)
112 Irp
->IoStatus
.Status
= Status
;
113 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);
121 NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject
,
127 FsRtlEnterFileSystem();
128 NpAcquireExclusiveVcb();
130 Status
= NpCommonQuerySecurityInfo(DeviceObject
, Irp
);
133 FsRtlExitFileSystem();
135 if (Status
!= STATUS_PENDING
)
137 Irp
->IoStatus
.Status
= Status
;
138 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);