2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/fs/np/finfo.c
5 * PURPOSE: Named pipe filesystem
6 * PROGRAMMER: Eric Kohl
9 /* INCLUDES ******************************************************************/
16 /* FUNCTIONS *****************************************************************/
20 NpfsSetPipeInformation(PDEVICE_OBJECT DeviceObject
,
22 PFILE_PIPE_INFORMATION Info
,
26 PFILE_PIPE_INFORMATION Request
;
27 DPRINT("NpfsSetPipeInformation()\n");
29 /* Get the Pipe and data */
31 Request
= (PFILE_PIPE_INFORMATION
)Info
;
33 if ((Fcb
->PipeType
== FILE_PIPE_BYTE_STREAM_TYPE
) && (Request
->ReadMode
== FILE_PIPE_MESSAGE_MODE
))
35 DPRINT("Cannot change readmode to message type on a byte type pipe!\n");
36 return STATUS_ACCESS_DENIED
;
40 if (Ccb
->PipeEnd
== FILE_PIPE_CLIENT_END
)
42 Fcb
->ClientReadMode
= Request
->ReadMode
;
46 Fcb
->ServerReadMode
= Request
->ReadMode
;
49 Fcb
->CompletionMode
= Request
->CompletionMode
;
52 return STATUS_SUCCESS
;
57 NpfsSetPipeRemoteInformation(PDEVICE_OBJECT DeviceObject
,
59 PFILE_PIPE_INFORMATION Info
,
63 PFILE_PIPE_REMOTE_INFORMATION Request
;
64 DPRINT("NpfsSetPipeRemoteInformation()\n");
66 /* Get the Pipe and data */
68 Request
= (PFILE_PIPE_REMOTE_INFORMATION
)Info
;
70 /* Set the Settings */
71 Fcb
->TimeOut
= Request
->CollectDataTime
;
72 Fcb
->InboundQuota
= Request
->MaximumCollectionCount
;
75 return STATUS_SUCCESS
;
80 NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject
,
82 PFILE_PIPE_INFORMATION Info
,
86 ULONG ConnectionSideReadMode
;
87 DPRINT("NpfsQueryPipeInformation()\n");
93 RtlZeroMemory(Info
, sizeof(FILE_PIPE_INFORMATION
));
96 if (Ccb
->PipeEnd
== FILE_PIPE_CLIENT_END
) ConnectionSideReadMode
=Ccb
->Fcb
->ClientReadMode
;
97 else ConnectionSideReadMode
= Ccb
->Fcb
->ServerReadMode
;
100 Info
->CompletionMode
= Fcb
->CompletionMode
;
101 Info
->ReadMode
= ConnectionSideReadMode
;
104 *BufferLength
-= sizeof(FILE_PIPE_INFORMATION
);
105 return STATUS_SUCCESS
;
110 NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject
,
112 PFILE_PIPE_REMOTE_INFORMATION Info
,
116 DPRINT("NpfsQueryPipeRemoteInformation()\n");
122 RtlZeroMemory(Info
, sizeof(FILE_PIPE_REMOTE_INFORMATION
));
125 Info
->MaximumCollectionCount
= Fcb
->InboundQuota
;
126 Info
->CollectDataTime
= Fcb
->TimeOut
;
129 *BufferLength
-= sizeof(FILE_PIPE_REMOTE_INFORMATION
);
130 return STATUS_SUCCESS
;
135 NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject
,
137 PFILE_PIPE_LOCAL_INFORMATION Info
,
142 DPRINT("NpfsQueryLocalPipeInformation()\n");
147 sizeof(FILE_PIPE_LOCAL_INFORMATION
));
149 Info
->NamedPipeType
= Fcb
->PipeType
;
150 Info
->NamedPipeConfiguration
= Fcb
->PipeConfiguration
;
151 Info
->MaximumInstances
= Fcb
->MaximumInstances
;
152 Info
->CurrentInstances
= Fcb
->CurrentInstances
;
153 Info
->InboundQuota
= Fcb
->InboundQuota
;
154 Info
->OutboundQuota
= Fcb
->OutboundQuota
;
155 Info
->NamedPipeState
= Ccb
->PipeState
;
156 Info
->NamedPipeEnd
= Ccb
->PipeEnd
;
158 if (Ccb
->PipeEnd
== FILE_PIPE_SERVER_END
)
160 Info
->ReadDataAvailable
= Ccb
->ReadDataAvailable
;
161 Info
->WriteQuotaAvailable
= Ccb
->WriteQuotaAvailable
;
163 else if (Ccb
->OtherSide
!= NULL
)
165 Info
->ReadDataAvailable
= Ccb
->OtherSide
->ReadDataAvailable
;
166 Info
->WriteQuotaAvailable
= Ccb
->OtherSide
->WriteQuotaAvailable
;
169 *BufferLength
-= sizeof(FILE_PIPE_LOCAL_INFORMATION
);
170 return STATUS_SUCCESS
;
175 NpfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
178 PIO_STACK_LOCATION IoStack
;
179 FILE_INFORMATION_CLASS FileInformationClass
;
180 PFILE_OBJECT FileObject
;
181 PNPFS_DEVICE_EXTENSION DeviceExtension
;
188 DPRINT("NpfsQueryInformation(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
190 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
191 FileInformationClass
= IoStack
->Parameters
.QueryFile
.FileInformationClass
;
192 DeviceExtension
= DeviceObject
->DeviceExtension
;
193 FileObject
= IoStack
->FileObject
;
194 Ccb
= (PNPFS_CCB
)FileObject
->FsContext2
;
197 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
198 BufferLength
= IoStack
->Parameters
.QueryFile
.Length
;
200 DPRINT("Pipe name: %wZ\n", &Fcb
->PipeName
);
201 DPRINT("FileInformationClass %d\n", FileInformationClass
);
202 DPRINT("SystemBuffer %p\n", SystemBuffer
);
203 DPRINT("BufferLength %lu\n", BufferLength
);
205 switch (FileInformationClass
)
207 case FilePipeInformation
:
208 Status
= NpfsQueryPipeInformation(DeviceObject
,
214 case FilePipeLocalInformation
:
215 Status
= NpfsQueryLocalPipeInformation(DeviceObject
,
221 case FilePipeRemoteInformation
:
222 Status
= NpfsQueryPipeRemoteInformation(DeviceObject
,
229 Status
= STATUS_NOT_SUPPORTED
;
232 Irp
->IoStatus
.Status
= Status
;
233 if (NT_SUCCESS(Status
))
234 Irp
->IoStatus
.Information
=
235 IoStack
->Parameters
.QueryFile
.Length
- BufferLength
;
237 Irp
->IoStatus
.Information
= 0;
238 IoCompleteRequest (Irp
, IO_NO_INCREMENT
);
245 NpfsSetInformation(PDEVICE_OBJECT DeviceObject
,
248 PIO_STACK_LOCATION IoStack
;
249 FILE_INFORMATION_CLASS FileInformationClass
;
250 PFILE_OBJECT FileObject
;
257 DPRINT("NpfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
259 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
260 FileInformationClass
= IoStack
->Parameters
.QueryFile
.FileInformationClass
;
261 FileObject
= IoStack
->FileObject
;
262 Ccb
= (PNPFS_CCB
)FileObject
->FsContext2
;
265 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
266 BufferLength
= IoStack
->Parameters
.QueryFile
.Length
;
268 DPRINT("Pipe name: %wZ\n", &Fcb
->PipeName
);
269 DPRINT("FileInformationClass %d\n", FileInformationClass
);
270 DPRINT("SystemBuffer %p\n", SystemBuffer
);
271 DPRINT("BufferLength %lu\n", BufferLength
);
273 switch (FileInformationClass
)
275 case FilePipeInformation
:
276 /* Call the handler */
277 Status
= NpfsSetPipeInformation(DeviceObject
,
283 case FilePipeLocalInformation
:
284 Status
= STATUS_NOT_IMPLEMENTED
;
287 case FilePipeRemoteInformation
:
288 /* Call the handler */
289 Status
= NpfsSetPipeRemoteInformation(DeviceObject
,
295 Status
= STATUS_NOT_SUPPORTED
;
298 Irp
->IoStatus
.Status
= Status
;
299 Irp
->IoStatus
.Information
= 0;
300 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);