3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * COPYRIGHT: See COPYING in the top level directory
22 * PROJECT: ReactOS kernel
23 * FILE: ntoskrnl/io/share.c
25 * PROGRAMMER: David Welch (welch@mcmail.com)
30 /* INCLUDES *****************************************************************/
32 #include <ddk/ntddk.h>
34 #include <internal/debug.h>
36 /* FUNCTIONS *****************************************************************/
41 IoUpdateShareAccess(PFILE_OBJECT FileObject,
42 PSHARE_ACCESS ShareAccess)
44 if ((FileObject->ReadAccess == FALSE) &&
45 (FileObject->WriteAccess == FALSE) &&
46 (FileObject->DeleteAccess == FALSE))
51 ShareAccess->OpenCount++;
53 if (FileObject->ReadAccess == TRUE)
55 ShareAccess->Readers++;
58 if (FileObject->WriteAccess == TRUE)
60 ShareAccess->Writers++;
63 if (FileObject->DeleteAccess == TRUE)
65 ShareAccess->Deleters++;
68 if (FileObject->SharedRead == TRUE)
70 ShareAccess->SharedRead++;
73 if (FileObject->SharedWrite == TRUE)
75 ShareAccess->SharedWrite++;
78 if (FileObject->SharedDelete == TRUE)
80 ShareAccess->SharedDelete++;
86 IoCheckShareAccess(IN ACCESS_MASK DesiredAccess,
87 IN ULONG DesiredShareAccess,
88 IN PFILE_OBJECT FileObject,
89 IN PSHARE_ACCESS ShareAccess,
99 ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
100 WriteAccess = (DesiredAccess & (FILE_READ_DATA | FILE_APPEND_DATA));
101 DeleteAccess = (DesiredAccess & DELETE);
103 FileObject->ReadAccess = ReadAccess;
104 FileObject->WriteAccess = WriteAccess;
105 FileObject->DeleteAccess = DeleteAccess;
107 if (!ReadAccess && !WriteAccess && !DeleteAccess)
109 return(STATUS_SUCCESS);
112 SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
113 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
114 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
116 FileObject->SharedRead = SharedRead;
117 FileObject->SharedWrite = SharedWrite;
118 FileObject->SharedDelete = SharedDelete;
122 if (ShareAccess->SharedRead < ShareAccess->OpenCount)
123 return(STATUS_SHARING_VIOLATION);
128 if (ShareAccess->SharedWrite < ShareAccess->OpenCount)
129 return(STATUS_SHARING_VIOLATION);
134 if (ShareAccess->SharedDelete < ShareAccess->OpenCount)
135 return(STATUS_SHARING_VIOLATION);
138 if (ShareAccess->Readers != 0)
140 if (SharedRead == FALSE)
141 return(STATUS_SHARING_VIOLATION);
144 if (ShareAccess->Writers != 0)
146 if (SharedWrite == FALSE)
147 return(STATUS_SHARING_VIOLATION);
150 if (ShareAccess->Deleters != 0)
152 if (SharedDelete == FALSE)
153 return(STATUS_SHARING_VIOLATION);
158 ShareAccess->OpenCount++;
160 if (ReadAccess == TRUE)
161 ShareAccess->Readers++;
163 if (WriteAccess == TRUE)
164 ShareAccess->Writers++;
166 if (DeleteAccess == TRUE)
167 ShareAccess->Deleters++;
169 if (SharedRead == TRUE)
170 ShareAccess->SharedRead++;
172 if (SharedWrite == TRUE)
173 ShareAccess->SharedWrite++;
175 if (SharedDelete == TRUE)
176 ShareAccess->SharedDelete++;
179 return(STATUS_SUCCESS);
182 #endif /* LIBCAPTIVE */
185 IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
186 IN PSHARE_ACCESS ShareAccess)
188 if ((FileObject->ReadAccess == FALSE) &&
189 (FileObject->WriteAccess == FALSE) &&
190 (FileObject->DeleteAccess == FALSE))
195 ShareAccess->OpenCount--;
197 if (FileObject->ReadAccess == TRUE)
199 ShareAccess->Readers--;
202 if (FileObject->WriteAccess == TRUE)
204 ShareAccess->Writers--;
207 if (FileObject->DeleteAccess == TRUE)
209 ShareAccess->Deleters--;
212 if (FileObject->SharedRead == TRUE)
214 ShareAccess->SharedRead--;
217 if (FileObject->SharedWrite == TRUE)
219 ShareAccess->SharedWrite--;
222 if (FileObject->SharedDelete == TRUE)
224 ShareAccess->SharedDelete--;
230 IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
231 IN ULONG DesiredShareAccess,
232 IN PFILE_OBJECT FileObject,
233 OUT PSHARE_ACCESS ShareAccess)
237 BOOLEAN DeleteAccess;
240 BOOLEAN SharedDelete;
242 ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
243 WriteAccess = (DesiredAccess & (FILE_READ_DATA | FILE_APPEND_DATA));
244 DeleteAccess = (DesiredAccess & DELETE);
246 FileObject->ReadAccess = ReadAccess;
247 FileObject->WriteAccess = WriteAccess;
248 FileObject->DeleteAccess = DeleteAccess;
250 if (!ReadAccess && !WriteAccess && !DeleteAccess)
252 FileObject->SharedRead = FALSE;
253 FileObject->SharedWrite = FALSE;
254 FileObject->SharedDelete = FALSE;
256 ShareAccess->OpenCount = 0;
257 ShareAccess->Readers = 0;
258 ShareAccess->Writers = 0;
259 ShareAccess->Deleters = 0;
261 ShareAccess->SharedRead = 0;
262 ShareAccess->SharedWrite = 0;
263 ShareAccess->SharedDelete = 0;
267 SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
268 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
269 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
271 FileObject->SharedRead = SharedRead;
272 FileObject->SharedWrite = SharedWrite;
273 FileObject->SharedDelete = SharedDelete;
275 ShareAccess->OpenCount = 1;
276 ShareAccess->Readers = (ReadAccess) ? 1 : 0;
277 ShareAccess->Writers = (WriteAccess) ? 1 : 0;
278 ShareAccess->Deleters = (DeleteAccess) ? 1 : 0;
280 ShareAccess->SharedRead = (SharedRead) ? 1 : 0;
281 ShareAccess->SharedWrite = (SharedWrite) ? 1 : 0;
282 ShareAccess->SharedDelete = (SharedDelete) ? 1 : 0;
289 IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess,
290 IN ACCESS_MASK GrantedAccess)
292 RtlMapGenericMask(DesiredAccess,
293 IoFileObjectType->Mapping);
294 if ((*DesiredAccess & GrantedAccess) != GrantedAccess)
295 return(STATUS_ACCESS_DENIED);
297 return(STATUS_SUCCESS);
302 IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer,
304 OUT PULONG ErrorOffset)
307 return(STATUS_NOT_IMPLEMENTED);
312 IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess,
313 IN UCHAR MajorFunction,
314 IN UCHAR MinorFunction,
315 IN ULONG IoControlCode,
316 IN PFILE_INFORMATION_CLASS FileInformationClass OPTIONAL,
317 IN PFS_INFORMATION_CLASS FsInformationClass OPTIONAL)
320 return(STATUS_NOT_IMPLEMENTED);
325 IoSetInformation(IN PFILE_OBJECT FileObject,
326 IN FILE_INFORMATION_CLASS FileInformationClass,
328 OUT PVOID FileInformation)
331 return(STATUS_NOT_IMPLEMENTED);
336 IoFastQueryNetworkAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
337 IN ACCESS_MASK DesiredAccess,
338 IN ULONG OpenOptions,
339 OUT PIO_STATUS_BLOCK IoStatus,
340 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer)
346 #endif /* LIBCAPTIVE */