Add missing processor architecture cases
[reactos.git] / reactos / ntoskrnl / io / share.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/share.c
6 * PURPOSE: No purpose listed.
7 *
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ntoskrnl.h>
14 #define NDEBUG
15 #include <internal/debug.h>
16
17 /* FUNCTIONS *****************************************************************/
18
19 /*
20 * @implemented
21 */
22 VOID STDCALL
23 IoUpdateShareAccess(PFILE_OBJECT FileObject,
24 PSHARE_ACCESS ShareAccess)
25 {
26 PAGED_CODE();
27
28 if (FileObject->ReadAccess ||
29 FileObject->WriteAccess ||
30 FileObject->DeleteAccess)
31 {
32 ShareAccess->OpenCount++;
33
34 ShareAccess->Readers += FileObject->ReadAccess;
35 ShareAccess->Writers += FileObject->WriteAccess;
36 ShareAccess->Deleters += FileObject->DeleteAccess;
37 ShareAccess->SharedRead += FileObject->SharedRead;
38 ShareAccess->SharedWrite += FileObject->SharedWrite;
39 ShareAccess->SharedDelete += FileObject->SharedDelete;
40 }
41 }
42
43
44 /*
45 * @implemented
46 */
47 NTSTATUS STDCALL
48 IoCheckShareAccess(IN ACCESS_MASK DesiredAccess,
49 IN ULONG DesiredShareAccess,
50 IN PFILE_OBJECT FileObject,
51 IN PSHARE_ACCESS ShareAccess,
52 IN BOOLEAN Update)
53 {
54 BOOLEAN ReadAccess;
55 BOOLEAN WriteAccess;
56 BOOLEAN DeleteAccess;
57 BOOLEAN SharedRead;
58 BOOLEAN SharedWrite;
59 BOOLEAN SharedDelete;
60
61 PAGED_CODE();
62
63 ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
64 WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
65 DeleteAccess = (DesiredAccess & DELETE) != 0;
66
67 FileObject->ReadAccess = ReadAccess;
68 FileObject->WriteAccess = WriteAccess;
69 FileObject->DeleteAccess = DeleteAccess;
70
71 if (ReadAccess || WriteAccess || DeleteAccess)
72 {
73 SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
74 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
75 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
76
77 FileObject->SharedRead = SharedRead;
78 FileObject->SharedWrite = SharedWrite;
79 FileObject->SharedDelete = SharedDelete;
80
81 if ((ReadAccess && (ShareAccess->SharedRead < ShareAccess->OpenCount)) ||
82 (WriteAccess && (ShareAccess->SharedWrite < ShareAccess->OpenCount)) ||
83 (DeleteAccess && (ShareAccess->SharedDelete < ShareAccess->OpenCount)) ||
84 ((ShareAccess->Readers != 0) && !SharedRead) ||
85 ((ShareAccess->Writers != 0) && !SharedWrite) ||
86 ((ShareAccess->Deleters != 0) && !SharedDelete))
87 {
88 return(STATUS_SHARING_VIOLATION);
89 }
90
91 if (Update)
92 {
93 ShareAccess->OpenCount++;
94
95 ShareAccess->Readers += ReadAccess;
96 ShareAccess->Writers += WriteAccess;
97 ShareAccess->Deleters += DeleteAccess;
98 ShareAccess->SharedRead += SharedRead;
99 ShareAccess->SharedWrite += SharedWrite;
100 ShareAccess->SharedDelete += SharedDelete;
101 }
102 }
103
104 return(STATUS_SUCCESS);
105 }
106
107
108 /*
109 * @implemented
110 */
111 VOID STDCALL
112 IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
113 IN PSHARE_ACCESS ShareAccess)
114 {
115 PAGED_CODE();
116
117 if (FileObject->ReadAccess ||
118 FileObject->WriteAccess ||
119 FileObject->DeleteAccess)
120 {
121 ShareAccess->OpenCount--;
122
123 ShareAccess->Readers -= FileObject->ReadAccess;
124 ShareAccess->Writers -= FileObject->WriteAccess;
125 ShareAccess->Deleters -= FileObject->DeleteAccess;
126 ShareAccess->SharedRead -= FileObject->SharedRead;
127 ShareAccess->SharedWrite -= FileObject->SharedWrite;
128 ShareAccess->SharedDelete -= FileObject->SharedDelete;
129 }
130 }
131
132
133 /*
134 * @implemented
135 */
136 VOID STDCALL
137 IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
138 IN ULONG DesiredShareAccess,
139 IN PFILE_OBJECT FileObject,
140 OUT PSHARE_ACCESS ShareAccess)
141 {
142 BOOLEAN ReadAccess;
143 BOOLEAN WriteAccess;
144 BOOLEAN DeleteAccess;
145 BOOLEAN SharedRead;
146 BOOLEAN SharedWrite;
147 BOOLEAN SharedDelete;
148
149 PAGED_CODE();
150
151 ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
152 WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
153 DeleteAccess = (DesiredAccess & DELETE) != 0;
154
155 FileObject->ReadAccess = ReadAccess;
156 FileObject->WriteAccess = WriteAccess;
157 FileObject->DeleteAccess = DeleteAccess;
158
159 if (!ReadAccess && !WriteAccess && !DeleteAccess)
160 {
161 ShareAccess->OpenCount = 0;
162 ShareAccess->Readers = 0;
163 ShareAccess->Writers = 0;
164 ShareAccess->Deleters = 0;
165
166 ShareAccess->SharedRead = 0;
167 ShareAccess->SharedWrite = 0;
168 ShareAccess->SharedDelete = 0;
169 }
170 else
171 {
172 SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
173 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
174 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
175
176 FileObject->SharedRead = SharedRead;
177 FileObject->SharedWrite = SharedWrite;
178 FileObject->SharedDelete = SharedDelete;
179
180 ShareAccess->OpenCount = 1;
181 ShareAccess->Readers = ReadAccess;
182 ShareAccess->Writers = WriteAccess;
183 ShareAccess->Deleters = DeleteAccess;
184
185 ShareAccess->SharedRead = SharedRead;
186 ShareAccess->SharedWrite = SharedWrite;
187 ShareAccess->SharedDelete = SharedDelete;
188 }
189 }
190
191
192 /*
193 * @implemented
194 */
195 NTSTATUS STDCALL
196 IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess,
197 IN ACCESS_MASK GrantedAccess)
198 {
199 PAGED_CODE();
200
201 RtlMapGenericMask(DesiredAccess,
202 &IoFileObjectType->TypeInfo.GenericMapping);
203
204 if ((~(*DesiredAccess) & GrantedAccess) != 0)
205 return STATUS_ACCESS_DENIED;
206 else
207 return STATUS_SUCCESS;
208 }
209
210
211 /*
212 * @unimplemented
213 */
214 NTSTATUS STDCALL
215 IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer,
216 IN ULONG EaLength,
217 OUT PULONG ErrorOffset)
218 {
219 UNIMPLEMENTED;
220 return(STATUS_NOT_IMPLEMENTED);
221 }
222
223
224 /*
225 * @unimplemented
226 */
227 NTSTATUS STDCALL
228 IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess,
229 IN UCHAR MajorFunction,
230 IN UCHAR MinorFunction,
231 IN ULONG IoControlCode,
232 IN PVOID ExtraData OPTIONAL,
233 IN PVOID ExtraData2 OPTIONAL)
234 {
235 UNIMPLEMENTED;
236 return(STATUS_NOT_IMPLEMENTED);
237 }
238
239
240 /*
241 * @unimplemented
242 */
243 NTSTATUS STDCALL
244 IoSetInformation(IN PFILE_OBJECT FileObject,
245 IN FILE_INFORMATION_CLASS FileInformationClass,
246 IN ULONG Length,
247 IN PVOID FileInformation)
248 {
249 IO_STATUS_BLOCK IoStatusBlock;
250 PIRP Irp;
251 PDEVICE_OBJECT DeviceObject;
252 PIO_STACK_LOCATION StackPtr;
253 NTSTATUS Status;
254
255 ASSERT(FileInformation != NULL);
256
257 if (FileInformationClass == FileCompletionInformation)
258 {
259 return STATUS_NOT_IMPLEMENTED;
260 }
261
262
263
264 Status = ObReferenceObjectByPointer(FileObject,
265 0, /* FIXME - depends on the information class */
266 IoFileObjectType,
267 KernelMode);
268 if (!NT_SUCCESS(Status))
269 {
270 return(Status);
271 }
272
273 DPRINT("FileObject 0x%p\n", FileObject);
274
275 DeviceObject = FileObject->DeviceObject;
276
277 Irp = IoAllocateIrp(DeviceObject->StackSize,
278 TRUE);
279 if (Irp == NULL)
280 {
281 ObDereferenceObject(FileObject);
282 return STATUS_INSUFFICIENT_RESOURCES;
283 }
284
285 /* Trigger FileObject/Event dereferencing */
286 Irp->Tail.Overlay.OriginalFileObject = FileObject;
287 Irp->RequestorMode = KernelMode;
288 Irp->AssociatedIrp.SystemBuffer = FileInformation;
289 Irp->UserIosb = &IoStatusBlock;
290 Irp->UserEvent = &FileObject->Event;
291 Irp->Tail.Overlay.Thread = PsGetCurrentThread();
292 KeResetEvent( &FileObject->Event );
293
294 StackPtr = IoGetNextIrpStackLocation(Irp);
295 StackPtr->MajorFunction = IRP_MJ_SET_INFORMATION;
296 StackPtr->MinorFunction = 0;
297 StackPtr->Flags = 0;
298 StackPtr->Control = 0;
299 StackPtr->DeviceObject = DeviceObject;
300 StackPtr->FileObject = FileObject;
301 StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;
302 StackPtr->Parameters.SetFile.Length = Length;
303
304 Status = IoCallDriver(FileObject->DeviceObject, Irp);
305 if (Status==STATUS_PENDING)
306 {
307 KeWaitForSingleObject(&FileObject->Event,
308 Executive,
309 KernelMode,
310 FileObject->Flags & FO_ALERTABLE_IO,
311 NULL);
312 Status = IoStatusBlock.Status;
313 }
314
315 return Status;
316 }
317
318
319 /*
320 * @unimplemented
321 */
322 BOOLEAN STDCALL
323 IoFastQueryNetworkAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
324 IN ACCESS_MASK DesiredAccess,
325 IN ULONG OpenOptions,
326 OUT PIO_STATUS_BLOCK IoStatus,
327 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer)
328 {
329 UNIMPLEMENTED;
330 return(FALSE);
331 }
332
333 /* EOF */