3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/share.c
6 * PURPOSE: No purpose listed.
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
15 #include <internal/debug.h>
17 /* FUNCTIONS *****************************************************************/
23 IoUpdateShareAccess(PFILE_OBJECT FileObject
,
24 PSHARE_ACCESS ShareAccess
)
28 if (FileObject
->ReadAccess
||
29 FileObject
->WriteAccess
||
30 FileObject
->DeleteAccess
)
32 ShareAccess
->OpenCount
++;
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
;
48 IoCheckShareAccess(IN ACCESS_MASK DesiredAccess
,
49 IN ULONG DesiredShareAccess
,
50 IN PFILE_OBJECT FileObject
,
51 IN PSHARE_ACCESS ShareAccess
,
63 ReadAccess
= (DesiredAccess
& (FILE_READ_DATA
| FILE_EXECUTE
)) != 0;
64 WriteAccess
= (DesiredAccess
& (FILE_WRITE_DATA
| FILE_APPEND_DATA
)) != 0;
65 DeleteAccess
= (DesiredAccess
& DELETE
) != 0;
67 FileObject
->ReadAccess
= ReadAccess
;
68 FileObject
->WriteAccess
= WriteAccess
;
69 FileObject
->DeleteAccess
= DeleteAccess
;
71 if (ReadAccess
|| WriteAccess
|| DeleteAccess
)
73 SharedRead
= (DesiredShareAccess
& FILE_SHARE_READ
) != 0;
74 SharedWrite
= (DesiredShareAccess
& FILE_SHARE_WRITE
) != 0;
75 SharedDelete
= (DesiredShareAccess
& FILE_SHARE_DELETE
) != 0;
77 FileObject
->SharedRead
= SharedRead
;
78 FileObject
->SharedWrite
= SharedWrite
;
79 FileObject
->SharedDelete
= SharedDelete
;
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
))
88 return(STATUS_SHARING_VIOLATION
);
93 ShareAccess
->OpenCount
++;
95 ShareAccess
->Readers
+= ReadAccess
;
96 ShareAccess
->Writers
+= WriteAccess
;
97 ShareAccess
->Deleters
+= DeleteAccess
;
98 ShareAccess
->SharedRead
+= SharedRead
;
99 ShareAccess
->SharedWrite
+= SharedWrite
;
100 ShareAccess
->SharedDelete
+= SharedDelete
;
104 return(STATUS_SUCCESS
);
112 IoRemoveShareAccess(IN PFILE_OBJECT FileObject
,
113 IN PSHARE_ACCESS ShareAccess
)
117 if (FileObject
->ReadAccess
||
118 FileObject
->WriteAccess
||
119 FileObject
->DeleteAccess
)
121 ShareAccess
->OpenCount
--;
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
;
137 IoSetShareAccess(IN ACCESS_MASK DesiredAccess
,
138 IN ULONG DesiredShareAccess
,
139 IN PFILE_OBJECT FileObject
,
140 OUT PSHARE_ACCESS ShareAccess
)
144 BOOLEAN DeleteAccess
;
147 BOOLEAN SharedDelete
;
151 ReadAccess
= (DesiredAccess
& (FILE_READ_DATA
| FILE_EXECUTE
)) != 0;
152 WriteAccess
= (DesiredAccess
& (FILE_WRITE_DATA
| FILE_APPEND_DATA
)) != 0;
153 DeleteAccess
= (DesiredAccess
& DELETE
) != 0;
155 FileObject
->ReadAccess
= ReadAccess
;
156 FileObject
->WriteAccess
= WriteAccess
;
157 FileObject
->DeleteAccess
= DeleteAccess
;
159 if (!ReadAccess
&& !WriteAccess
&& !DeleteAccess
)
161 ShareAccess
->OpenCount
= 0;
162 ShareAccess
->Readers
= 0;
163 ShareAccess
->Writers
= 0;
164 ShareAccess
->Deleters
= 0;
166 ShareAccess
->SharedRead
= 0;
167 ShareAccess
->SharedWrite
= 0;
168 ShareAccess
->SharedDelete
= 0;
172 SharedRead
= (DesiredShareAccess
& FILE_SHARE_READ
) != 0;
173 SharedWrite
= (DesiredShareAccess
& FILE_SHARE_WRITE
) != 0;
174 SharedDelete
= (DesiredShareAccess
& FILE_SHARE_DELETE
) != 0;
176 FileObject
->SharedRead
= SharedRead
;
177 FileObject
->SharedWrite
= SharedWrite
;
178 FileObject
->SharedDelete
= SharedDelete
;
180 ShareAccess
->OpenCount
= 1;
181 ShareAccess
->Readers
= ReadAccess
;
182 ShareAccess
->Writers
= WriteAccess
;
183 ShareAccess
->Deleters
= DeleteAccess
;
185 ShareAccess
->SharedRead
= SharedRead
;
186 ShareAccess
->SharedWrite
= SharedWrite
;
187 ShareAccess
->SharedDelete
= SharedDelete
;
196 IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess
,
197 IN ACCESS_MASK GrantedAccess
)
201 RtlMapGenericMask(DesiredAccess
,
202 &IoFileObjectType
->TypeInfo
.GenericMapping
);
204 if ((~(*DesiredAccess
) & GrantedAccess
) != 0)
205 return STATUS_ACCESS_DENIED
;
207 return STATUS_SUCCESS
;
215 IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer
,
217 OUT PULONG ErrorOffset
)
220 return(STATUS_NOT_IMPLEMENTED
);
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
)
236 return(STATUS_NOT_IMPLEMENTED
);
244 IoSetInformation(IN PFILE_OBJECT FileObject
,
245 IN FILE_INFORMATION_CLASS FileInformationClass
,
247 IN PVOID FileInformation
)
249 IO_STATUS_BLOCK IoStatusBlock
;
251 PDEVICE_OBJECT DeviceObject
;
252 PIO_STACK_LOCATION StackPtr
;
255 ASSERT(FileInformation
!= NULL
);
257 if (FileInformationClass
== FileCompletionInformation
)
259 return STATUS_NOT_IMPLEMENTED
;
264 Status
= ObReferenceObjectByPointer(FileObject
,
265 0, /* FIXME - depends on the information class */
268 if (!NT_SUCCESS(Status
))
273 DPRINT("FileObject 0x%p\n", FileObject
);
275 DeviceObject
= FileObject
->DeviceObject
;
277 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
281 ObDereferenceObject(FileObject
);
282 return STATUS_INSUFFICIENT_RESOURCES
;
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
);
294 StackPtr
= IoGetNextIrpStackLocation(Irp
);
295 StackPtr
->MajorFunction
= IRP_MJ_SET_INFORMATION
;
296 StackPtr
->MinorFunction
= 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
;
304 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
305 if (Status
==STATUS_PENDING
)
307 KeWaitForSingleObject(&FileObject
->Event
,
310 FileObject
->Flags
& FO_ALERTABLE_IO
,
312 Status
= IoStatusBlock
.Status
;
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
)