Reverted latest changes.
[reactos.git] / reactos / drivers / fs / np / finfo.c
1 /* $Id: finfo.c,v 1.5 2002/09/08 10:22:11 chorns Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/fs/np/finfo.c
6 * PURPOSE: Named pipe filesystem
7 * PROGRAMMER: Eric Kohl <ekohl@rz-online.de>
8 */
9
10 /* INCLUDES ******************************************************************/
11
12 #include <ddk/ntddk.h>
13 #include "npfs.h"
14
15 #define NDEBUG
16 #include <debug.h>
17
18
19
20
21 /* FUNCTIONS *****************************************************************/
22
23 static NTSTATUS
24 NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject,
25 PNPFS_FCB Fcb,
26 PFILE_PIPE_INFORMATION Info,
27 PULONG BufferLength)
28 {
29 PNPFS_PIPE Pipe;
30
31 DPRINT("NpfsQueryPipeInformation()\n");
32
33 Pipe = Fcb->Pipe;
34
35 RtlZeroMemory(Info,
36 sizeof(FILE_PIPE_INFORMATION));
37
38 // Info->PipeMode =
39 // Info->CompletionMode =
40
41 *BufferLength -= sizeof(FILE_PIPE_INFORMATION);
42 return(STATUS_SUCCESS);
43 }
44
45
46 static NTSTATUS
47 NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject,
48 PNPFS_FCB Fcb,
49 PFILE_PIPE_LOCAL_INFORMATION Info,
50 PULONG BufferLength)
51 {
52 PNPFS_PIPE Pipe;
53
54 DPRINT("NpfsQueryLocalPipeInformation()\n");
55
56 Pipe = Fcb->Pipe;
57
58 RtlZeroMemory(Info,
59 sizeof(FILE_PIPE_LOCAL_INFORMATION));
60
61 Info->NamedPipeType = Pipe->PipeType;
62 Info->NamedPipeConfiguration = Pipe->PipeConfiguration;
63 Info->MaximumInstances = Pipe->MaximumInstances;
64 Info->CurrentInstances = Pipe->CurrentInstances;
65 Info->InboundQuota = Pipe->InboundQuota;
66 Info->OutboundQuota = Pipe->OutboundQuota;
67 Info->NamedPipeState = Fcb->PipeState;
68 Info->NamedPipeEnd = Fcb->PipeEnd;
69
70 if (Fcb->PipeEnd == FILE_PIPE_SERVER_END)
71 {
72 Info->ReadDataAvailable = Fcb->ReadDataAvailable;
73 Info->WriteQuotaAvailable = Fcb->WriteQuotaAvailable;
74 }
75 else if (Fcb->OtherSide != NULL)
76 {
77 Info->ReadDataAvailable = Fcb->OtherSide->ReadDataAvailable;
78 Info->WriteQuotaAvailable = Fcb->OtherSide->WriteQuotaAvailable;
79 }
80
81 *BufferLength -= sizeof(FILE_PIPE_LOCAL_INFORMATION);
82 return(STATUS_SUCCESS);
83 }
84
85
86 NTSTATUS STDCALL
87 NpfsQueryInformation(PDEVICE_OBJECT DeviceObject,
88 PIRP Irp)
89 {
90 PIO_STACK_LOCATION IoStack;
91 FILE_INFORMATION_CLASS FileInformationClass;
92 PFILE_OBJECT FileObject;
93 PNPFS_DEVICE_EXTENSION DeviceExtension;
94 PNPFS_FCB Fcb;
95 PNPFS_PIPE Pipe;
96 PVOID SystemBuffer;
97 ULONG BufferLength;
98 NTSTATUS Status;
99
100 DPRINT("NpfsQueryInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
101
102 IoStack = IoGetCurrentIrpStackLocation (Irp);
103 FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
104 DeviceExtension = DeviceObject->DeviceExtension;
105 FileObject = IoStack->FileObject;
106 Fcb = (PNPFS_FCB)FileObject->FsContext;
107 Pipe = Fcb->Pipe;
108
109 SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
110 BufferLength = IoStack->Parameters.QueryFile.Length;
111
112 DPRINT("Pipe name: %wZ\n", &Pipe->PipeName);
113 DPRINT("FileInformationClass %d\n", FileInformationClass);
114 DPRINT("SystemBuffer %p\n", SystemBuffer);
115 DPRINT("BufferLength %lu\n", BufferLength);
116
117 switch (FileInformationClass)
118 {
119 case FilePipeInformation:
120 Status = NpfsQueryPipeInformation(DeviceObject,
121 Fcb,
122 SystemBuffer,
123 &BufferLength);
124 break;
125
126 case FilePipeLocalInformation:
127 Status = NpfsQueryLocalPipeInformation(DeviceObject,
128 Fcb,
129 SystemBuffer,
130 &BufferLength);
131 break;
132
133 case FilePipeRemoteInformation:
134 Status = STATUS_NOT_IMPLEMENTED;
135 break;
136
137 default:
138 Status = STATUS_NOT_SUPPORTED;
139 }
140
141 Irp->IoStatus.Status = Status;
142 if (NT_SUCCESS(Status))
143 Irp->IoStatus.Information =
144 IoStack->Parameters.QueryFile.Length - BufferLength;
145 else
146 Irp->IoStatus.Information = 0;
147 IoCompleteRequest (Irp, IO_NO_INCREMENT);
148
149 return(Status);
150 }
151
152
153 NTSTATUS STDCALL
154 NpfsSetInformation(PDEVICE_OBJECT DeviceObject,
155 PIRP Irp)
156 {
157 PIO_STACK_LOCATION IoStack;
158 FILE_INFORMATION_CLASS FileInformationClass;
159 PFILE_OBJECT FileObject;
160 PNPFS_FCB Fcb;
161 PNPFS_PIPE Pipe;
162 PVOID SystemBuffer;
163 ULONG BufferLength;
164 NTSTATUS Status;
165
166 DPRINT("NpfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
167
168 IoStack = IoGetCurrentIrpStackLocation (Irp);
169 FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
170 FileObject = IoStack->FileObject;
171 Fcb = (PNPFS_FCB)FileObject->FsContext;
172 Pipe = Fcb->Pipe;
173
174 SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
175 BufferLength = IoStack->Parameters.QueryFile.Length;
176
177 DPRINT("Pipe name: %wZ\n", &Pipe->PipeName);
178 DPRINT("FileInformationClass %d\n", FileInformationClass);
179 DPRINT("SystemBuffer %p\n", SystemBuffer);
180 DPRINT("BufferLength %lu\n", BufferLength);
181
182 switch (FileInformationClass)
183 {
184 case FilePipeInformation:
185 Status = STATUS_NOT_IMPLEMENTED;
186 break;
187 case FilePipeLocalInformation:
188 Status = STATUS_NOT_IMPLEMENTED;
189 break;
190 case FilePipeRemoteInformation:
191 Status = STATUS_NOT_IMPLEMENTED;
192 break;
193 default:
194 Status = STATUS_NOT_SUPPORTED;
195 }
196
197 Irp->IoStatus.Status = Status;
198 Irp->IoStatus.Information = 0;
199 IoCompleteRequest(Irp,
200 IO_NO_INCREMENT);
201
202 return(Status);
203 }
204
205 /* EOF */