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 *****************************************************************/
39 IoUpdateShareAccess(PFILE_OBJECT FileObject,
40 PSHARE_ACCESS ShareAccess)
42 if ((FileObject->ReadAccess == FALSE) &&
43 (FileObject->WriteAccess == FALSE) &&
44 (FileObject->DeleteAccess == FALSE))
49 ShareAccess->OpenCount++;
51 if (FileObject->ReadAccess == TRUE)
53 ShareAccess->Readers++;
56 if (FileObject->WriteAccess == TRUE)
58 ShareAccess->Writers++;
61 if (FileObject->DeleteAccess == TRUE)
63 ShareAccess->Deleters++;
66 if (FileObject->SharedRead == TRUE)
68 ShareAccess->SharedRead++;
71 if (FileObject->SharedWrite == TRUE)
73 ShareAccess->SharedWrite++;
76 if (FileObject->SharedDelete == TRUE)
78 ShareAccess->SharedDelete++;
83 IoCheckShareAccess(IN ACCESS_MASK DesiredAccess,
84 IN ULONG DesiredShareAccess,
85 IN PFILE_OBJECT FileObject,
86 IN PSHARE_ACCESS ShareAccess,
96 ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
97 WriteAccess = (DesiredAccess & (FILE_READ_DATA | FILE_APPEND_DATA));
98 DeleteAccess = (DesiredAccess & DELETE);
100 FileObject->ReadAccess = ReadAccess;
101 FileObject->WriteAccess = WriteAccess;
102 FileObject->DeleteAccess = DeleteAccess;
104 if (!ReadAccess && !WriteAccess && !DeleteAccess)
106 return(STATUS_SUCCESS);
109 SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
110 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
111 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
113 FileObject->SharedRead = SharedRead;
114 FileObject->SharedWrite = SharedWrite;
115 FileObject->SharedDelete = SharedDelete;
119 if (ShareAccess->SharedRead < ShareAccess->OpenCount)
120 return(STATUS_SHARING_VIOLATION);
125 if (ShareAccess->SharedWrite < ShareAccess->OpenCount)
126 return(STATUS_SHARING_VIOLATION);
131 if (ShareAccess->SharedDelete < ShareAccess->OpenCount)
132 return(STATUS_SHARING_VIOLATION);
135 if (ShareAccess->Readers != 0)
137 if (SharedRead == FALSE)
138 return(STATUS_SHARING_VIOLATION);
141 if (ShareAccess->Writers != 0)
143 if (SharedWrite == FALSE)
144 return(STATUS_SHARING_VIOLATION);
147 if (ShareAccess->Deleters != 0)
149 if (SharedDelete == FALSE)
150 return(STATUS_SHARING_VIOLATION);
155 ShareAccess->OpenCount++;
157 if (ReadAccess == TRUE)
158 ShareAccess->Readers++;
160 if (WriteAccess == TRUE)
161 ShareAccess->Writers++;
163 if (DeleteAccess == TRUE)
164 ShareAccess->Deleters++;
166 if (SharedRead == TRUE)
167 ShareAccess->SharedRead++;
169 if (SharedWrite == TRUE)
170 ShareAccess->SharedWrite++;
172 if (SharedDelete == TRUE)
173 ShareAccess->SharedDelete++;
176 return(STATUS_SUCCESS);
181 IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
182 IN PSHARE_ACCESS ShareAccess)
184 if ((FileObject->ReadAccess == FALSE) &&
185 (FileObject->WriteAccess == FALSE) &&
186 (FileObject->DeleteAccess == FALSE))
191 ShareAccess->OpenCount--;
193 if (FileObject->ReadAccess == TRUE)
195 ShareAccess->Readers--;
198 if (FileObject->WriteAccess == TRUE)
200 ShareAccess->Writers--;
203 if (FileObject->DeleteAccess == TRUE)
205 ShareAccess->Deleters--;
208 if (FileObject->SharedRead == TRUE)
210 ShareAccess->SharedRead--;
213 if (FileObject->SharedWrite == TRUE)
215 ShareAccess->SharedWrite--;
218 if (FileObject->SharedDelete == TRUE)
220 ShareAccess->SharedDelete--;
226 IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
227 IN ULONG DesiredShareAccess,
228 IN PFILE_OBJECT FileObject,
229 OUT PSHARE_ACCESS ShareAccess)
233 BOOLEAN DeleteAccess;
236 BOOLEAN SharedDelete;
238 ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
239 WriteAccess = (DesiredAccess & (FILE_READ_DATA | FILE_APPEND_DATA));
240 DeleteAccess = (DesiredAccess & DELETE);
242 FileObject->ReadAccess = ReadAccess;
243 FileObject->WriteAccess = WriteAccess;
244 FileObject->DeleteAccess = DeleteAccess;
246 if (!ReadAccess && !WriteAccess && !DeleteAccess)
248 FileObject->SharedRead = FALSE;
249 FileObject->SharedWrite = FALSE;
250 FileObject->SharedDelete = FALSE;
252 ShareAccess->OpenCount = 0;
253 ShareAccess->Readers = 0;
254 ShareAccess->Writers = 0;
255 ShareAccess->Deleters = 0;
257 ShareAccess->SharedRead = 0;
258 ShareAccess->SharedWrite = 0;
259 ShareAccess->SharedDelete = 0;
263 SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
264 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
265 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
267 FileObject->SharedRead = SharedRead;
268 FileObject->SharedWrite = SharedWrite;
269 FileObject->SharedDelete = SharedDelete;
271 ShareAccess->OpenCount = 1;
272 ShareAccess->Readers = (ReadAccess) ? 1 : 0;
273 ShareAccess->Writers = (WriteAccess) ? 1 : 0;
274 ShareAccess->Deleters = (DeleteAccess) ? 1 : 0;
276 ShareAccess->SharedRead = (SharedRead) ? 1 : 0;
277 ShareAccess->SharedWrite = (SharedWrite) ? 1 : 0;
278 ShareAccess->SharedDelete = (SharedDelete) ? 1 : 0;
285 IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess,
286 IN ACCESS_MASK GrantedAccess)
288 RtlMapGenericMask(DesiredAccess,
289 IoFileObjectType->Mapping);
290 if ((*DesiredAccess & GrantedAccess) != GrantedAccess)
291 return(STATUS_ACCESS_DENIED);
293 return(STATUS_SUCCESS);
298 IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer,
300 OUT PULONG ErrorOffset)
303 return(STATUS_NOT_IMPLEMENTED);
308 IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess,
309 IN UCHAR MajorFunction,
310 IN UCHAR MinorFunction,
311 IN ULONG IoControlCode,
312 IN PFILE_INFORMATION_CLASS FileInformationClass OPTIONAL,
313 IN PFS_INFORMATION_CLASS FsInformationClass OPTIONAL)
316 return(STATUS_NOT_IMPLEMENTED);
321 IoSetInformation(IN PFILE_OBJECT FileObject,
322 IN FILE_INFORMATION_CLASS FileInformationClass,
324 OUT PVOID FileInformation)
327 return(STATUS_NOT_IMPLEMENTED);
332 IoFastQueryNetworkAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
333 IN ACCESS_MASK DesiredAccess,
334 IN ULONG OpenOptions,
335 OUT PIO_STATUS_BLOCK IoStatus,
336 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer)
342 #endif /* LIBCAPTIVE */