[uxtheme]
[reactos.git] / reactos / drivers / filesystems / msfs / finfo.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/filesystems/msfs/finfo.c
5 * PURPOSE: Mailslot filesystem
6 * PROGRAMMER: Eric Kohl
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include "msfs.h"
12
13 #define NDEBUG
14 #include <debug.h>
15
16 #undef MAILSLOT_NO_MESSAGE
17 #undef MAILSLOT_WAIT_FOREVER
18 #define MAILSLOT_NO_MESSAGE MAXULONG
19 #define MAILSLOT_WAIT_FOREVER MAXULONG
20
21
22 /* FUNCTIONS *****************************************************************/
23
24 static NTSTATUS
25 MsfsQueryMailslotInformation(PMSFS_FCB Fcb,
26 PFILE_MAILSLOT_QUERY_INFORMATION Buffer,
27 PULONG BufferLength)
28 {
29 KIRQL oldIrql;
30
31 if (*BufferLength < sizeof(FILE_MAILSLOT_QUERY_INFORMATION))
32 return STATUS_BUFFER_OVERFLOW;
33
34 Buffer->MaximumMessageSize = Fcb->MaxMessageSize;
35 Buffer->ReadTimeout = Fcb->TimeOut;
36
37 KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
38 Buffer->MessagesAvailable = Fcb->MessageCount;
39 if (Fcb->MessageCount == 0)
40 {
41 Buffer->NextMessageSize = MAILSLOT_NO_MESSAGE;
42 }
43 else
44 {
45 PMSFS_MESSAGE Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink,
46 MSFS_MESSAGE,
47 MessageListEntry);
48 Buffer->NextMessageSize = Message->Size;
49 }
50 KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
51
52 *BufferLength -= sizeof(FILE_MAILSLOT_QUERY_INFORMATION);
53
54 return STATUS_SUCCESS;
55 }
56
57
58 static NTSTATUS
59 MsfsSetMailslotInformation(PMSFS_FCB Fcb,
60 PFILE_MAILSLOT_SET_INFORMATION Buffer,
61 PULONG BufferLength)
62 {
63 if (*BufferLength < sizeof(FILE_MAILSLOT_SET_INFORMATION))
64 return STATUS_BUFFER_OVERFLOW;
65
66 Fcb->TimeOut = *Buffer->ReadTimeout;
67
68 return STATUS_SUCCESS;
69 }
70
71
72 NTSTATUS DEFAULTAPI
73 MsfsQueryInformation(PDEVICE_OBJECT DeviceObject,
74 PIRP Irp)
75 {
76 PIO_STACK_LOCATION IoStack;
77 FILE_INFORMATION_CLASS FileInformationClass;
78 PFILE_OBJECT FileObject;
79 PMSFS_FCB Fcb;
80 PMSFS_CCB Ccb;
81 PVOID SystemBuffer;
82 ULONG BufferLength;
83 NTSTATUS Status;
84
85 DPRINT("MsfsQueryInformation(DeviceObject %p Irp %p)\n",
86 DeviceObject, Irp);
87
88 IoStack = IoGetCurrentIrpStackLocation (Irp);
89 FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
90 FileObject = IoStack->FileObject;
91 Fcb = (PMSFS_FCB)FileObject->FsContext;
92 Ccb = (PMSFS_CCB)FileObject->FsContext2;
93
94 DPRINT("Mailslot name: %wZ\n", &Fcb->Name);
95
96 /* querying information is not permitted on client side */
97 if (Fcb->ServerCcb != Ccb)
98 {
99 Status = STATUS_ACCESS_DENIED;
100
101 Irp->IoStatus.Status = Status;
102 Irp->IoStatus.Information = 0;
103
104 IoCompleteRequest(Irp, IO_NO_INCREMENT);
105
106 return Status;
107 }
108
109 SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
110 BufferLength = IoStack->Parameters.QueryFile.Length;
111
112 switch (FileInformationClass)
113 {
114 case FileMailslotQueryInformation:
115 Status = MsfsQueryMailslotInformation(Fcb,
116 SystemBuffer,
117 &BufferLength);
118 break;
119
120 default:
121 Status = STATUS_NOT_IMPLEMENTED;
122 }
123
124 Irp->IoStatus.Status = Status;
125 if (NT_SUCCESS(Status))
126 Irp->IoStatus.Information =
127 IoStack->Parameters.QueryFile.Length - BufferLength;
128 else
129 Irp->IoStatus.Information = 0;
130 IoCompleteRequest(Irp, IO_NO_INCREMENT);
131
132 return Status;
133 }
134
135
136 NTSTATUS DEFAULTAPI
137 MsfsSetInformation(PDEVICE_OBJECT DeviceObject,
138 PIRP Irp)
139 {
140 PIO_STACK_LOCATION IoStack;
141 FILE_INFORMATION_CLASS FileInformationClass;
142 PFILE_OBJECT FileObject;
143 PMSFS_FCB Fcb;
144 PMSFS_CCB Ccb;
145 PVOID SystemBuffer;
146 ULONG BufferLength;
147 NTSTATUS Status;
148
149 DPRINT("MsfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
150
151 IoStack = IoGetCurrentIrpStackLocation (Irp);
152 FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
153 FileObject = IoStack->FileObject;
154 Fcb = (PMSFS_FCB)FileObject->FsContext;
155 Ccb = (PMSFS_CCB)FileObject->FsContext2;
156
157 DPRINT("Mailslot name: %wZ\n", &Fcb->Name);
158
159 /* setting information is not permitted on client side */
160 if (Fcb->ServerCcb != Ccb)
161 {
162 Status = STATUS_ACCESS_DENIED;
163
164 Irp->IoStatus.Status = Status;
165 Irp->IoStatus.Information = 0;
166
167 IoCompleteRequest(Irp, IO_NO_INCREMENT);
168
169 return Status;
170 }
171
172 SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
173 BufferLength = IoStack->Parameters.QueryFile.Length;
174
175 DPRINT("FileInformationClass %d\n", FileInformationClass);
176 DPRINT("SystemBuffer %p\n", SystemBuffer);
177
178 switch (FileInformationClass)
179 {
180 case FileMailslotSetInformation:
181 Status = MsfsSetMailslotInformation(Fcb,
182 SystemBuffer,
183 &BufferLength);
184 break;
185
186 default:
187 Status = STATUS_NOT_IMPLEMENTED;
188 }
189
190 Irp->IoStatus.Status = Status;
191 Irp->IoStatus.Information = 0;
192 IoCompleteRequest(Irp, IO_NO_INCREMENT);
193
194 return Status;
195 }
196
197 /* EOF */