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
;
34 Fcb
->ReadMode
= Request
->ReadMode
;
35 Fcb
->CompletionMode
= Request
->CompletionMode
;
38 return STATUS_SUCCESS
;
43 NpfsSetPipeRemoteInformation(PDEVICE_OBJECT DeviceObject
,
45 PFILE_PIPE_INFORMATION Info
,
49 PFILE_PIPE_REMOTE_INFORMATION Request
;
50 DPRINT("NpfsSetPipeRemoteInformation()\n");
52 /* Get the Pipe and data */
54 Request
= (PFILE_PIPE_REMOTE_INFORMATION
)Info
;
56 /* Set the Settings */
57 Fcb
->TimeOut
= Request
->CollectDataTime
;
58 Fcb
->InboundQuota
= Request
->MaximumCollectionCount
;
61 return STATUS_SUCCESS
;
66 NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject
,
68 PFILE_PIPE_INFORMATION Info
,
72 DPRINT("NpfsQueryPipeInformation()\n");
78 RtlZeroMemory(Info
, sizeof(FILE_PIPE_INFORMATION
));
81 Info
->CompletionMode
= Fcb
->CompletionMode
;
82 Info
->ReadMode
= Fcb
->ReadMode
;
85 *BufferLength
-= sizeof(FILE_PIPE_INFORMATION
);
86 return STATUS_SUCCESS
;
91 NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject
,
93 PFILE_PIPE_REMOTE_INFORMATION Info
,
97 DPRINT("NpfsQueryPipeRemoteInformation()\n");
103 RtlZeroMemory(Info
, sizeof(FILE_PIPE_REMOTE_INFORMATION
));
106 Info
->MaximumCollectionCount
= Fcb
->InboundQuota
;
107 Info
->CollectDataTime
= Fcb
->TimeOut
;
110 *BufferLength
-= sizeof(FILE_PIPE_REMOTE_INFORMATION
);
111 return STATUS_SUCCESS
;
116 NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject
,
118 PFILE_PIPE_LOCAL_INFORMATION Info
,
123 DPRINT("NpfsQueryLocalPipeInformation()\n");
128 sizeof(FILE_PIPE_LOCAL_INFORMATION
));
130 Info
->NamedPipeType
= Fcb
->PipeType
;
131 Info
->NamedPipeConfiguration
= Fcb
->PipeConfiguration
;
132 Info
->MaximumInstances
= Fcb
->MaximumInstances
;
133 Info
->CurrentInstances
= Fcb
->CurrentInstances
;
134 Info
->InboundQuota
= Fcb
->InboundQuota
;
135 Info
->OutboundQuota
= Fcb
->OutboundQuota
;
136 Info
->NamedPipeState
= Ccb
->PipeState
;
137 Info
->NamedPipeEnd
= Ccb
->PipeEnd
;
139 if (Ccb
->PipeEnd
== FILE_PIPE_SERVER_END
)
141 Info
->ReadDataAvailable
= Ccb
->ReadDataAvailable
;
142 Info
->WriteQuotaAvailable
= Ccb
->WriteQuotaAvailable
;
144 else if (Ccb
->OtherSide
!= NULL
)
146 Info
->ReadDataAvailable
= Ccb
->OtherSide
->ReadDataAvailable
;
147 Info
->WriteQuotaAvailable
= Ccb
->OtherSide
->WriteQuotaAvailable
;
150 *BufferLength
-= sizeof(FILE_PIPE_LOCAL_INFORMATION
);
151 return STATUS_SUCCESS
;
156 NpfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
159 PIO_STACK_LOCATION IoStack
;
160 FILE_INFORMATION_CLASS FileInformationClass
;
161 PFILE_OBJECT FileObject
;
162 PNPFS_DEVICE_EXTENSION DeviceExtension
;
169 DPRINT("NpfsQueryInformation(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
171 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
172 FileInformationClass
= IoStack
->Parameters
.QueryFile
.FileInformationClass
;
173 DeviceExtension
= DeviceObject
->DeviceExtension
;
174 FileObject
= IoStack
->FileObject
;
175 Ccb
= (PNPFS_CCB
)FileObject
->FsContext2
;
178 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
179 BufferLength
= IoStack
->Parameters
.QueryFile
.Length
;
181 DPRINT("Pipe name: %wZ\n", &Fcb
->PipeName
);
182 DPRINT("FileInformationClass %d\n", FileInformationClass
);
183 DPRINT("SystemBuffer %p\n", SystemBuffer
);
184 DPRINT("BufferLength %lu\n", BufferLength
);
186 switch (FileInformationClass
)
188 case FilePipeInformation
:
189 Status
= NpfsQueryPipeInformation(DeviceObject
,
195 case FilePipeLocalInformation
:
196 Status
= NpfsQueryLocalPipeInformation(DeviceObject
,
202 case FilePipeRemoteInformation
:
203 Status
= NpfsQueryPipeRemoteInformation(DeviceObject
,
210 Status
= STATUS_NOT_SUPPORTED
;
213 Irp
->IoStatus
.Status
= Status
;
214 if (NT_SUCCESS(Status
))
215 Irp
->IoStatus
.Information
=
216 IoStack
->Parameters
.QueryFile
.Length
- BufferLength
;
218 Irp
->IoStatus
.Information
= 0;
219 IoCompleteRequest (Irp
, IO_NO_INCREMENT
);
226 NpfsSetInformation(PDEVICE_OBJECT DeviceObject
,
229 PIO_STACK_LOCATION IoStack
;
230 FILE_INFORMATION_CLASS FileInformationClass
;
231 PFILE_OBJECT FileObject
;
238 DPRINT("NpfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
240 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
241 FileInformationClass
= IoStack
->Parameters
.QueryFile
.FileInformationClass
;
242 FileObject
= IoStack
->FileObject
;
243 Ccb
= (PNPFS_CCB
)FileObject
->FsContext2
;
246 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
247 BufferLength
= IoStack
->Parameters
.QueryFile
.Length
;
249 DPRINT("Pipe name: %wZ\n", &Fcb
->PipeName
);
250 DPRINT("FileInformationClass %d\n", FileInformationClass
);
251 DPRINT("SystemBuffer %p\n", SystemBuffer
);
252 DPRINT("BufferLength %lu\n", BufferLength
);
254 switch (FileInformationClass
)
256 case FilePipeInformation
:
257 /* Call the handler */
258 Status
= NpfsSetPipeInformation(DeviceObject
,
264 case FilePipeLocalInformation
:
265 Status
= STATUS_NOT_IMPLEMENTED
;
268 case FilePipeRemoteInformation
:
269 /* Call the handler */
270 Status
= NpfsSetPipeRemoteInformation(DeviceObject
,
276 Status
= STATUS_NOT_SUPPORTED
;
279 Irp
->IoStatus
.Status
= Status
;
280 Irp
->IoStatus
.Information
= 0;
281 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);