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++;
84 IoCheckShareAccess(IN ACCESS_MASK DesiredAccess,
85 IN ULONG DesiredShareAccess,
86 IN PFILE_OBJECT FileObject,
87 IN PSHARE_ACCESS ShareAccess,
97 ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
98 WriteAccess = (DesiredAccess & (FILE_READ_DATA | FILE_APPEND_DATA));
99 DeleteAccess = (DesiredAccess & DELETE);
101 FileObject->ReadAccess = ReadAccess;
102 FileObject->WriteAccess = WriteAccess;
103 FileObject->DeleteAccess = DeleteAccess;
105 if (!ReadAccess && !WriteAccess && !DeleteAccess)
107 return(STATUS_SUCCESS);
110 SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
111 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
112 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
114 FileObject->SharedRead = SharedRead;
115 FileObject->SharedWrite = SharedWrite;
116 FileObject->SharedDelete = SharedDelete;
120 if (ShareAccess->SharedRead < ShareAccess->OpenCount)
121 return(STATUS_SHARING_VIOLATION);
126 if (ShareAccess->SharedWrite < ShareAccess->OpenCount)
127 return(STATUS_SHARING_VIOLATION);
132 if (ShareAccess->SharedDelete < ShareAccess->OpenCount)
133 return(STATUS_SHARING_VIOLATION);
136 if (ShareAccess->Readers != 0)
138 if (SharedRead == FALSE)
139 return(STATUS_SHARING_VIOLATION);
142 if (ShareAccess->Writers != 0)
144 if (SharedWrite == FALSE)
145 return(STATUS_SHARING_VIOLATION);
148 if (ShareAccess->Deleters != 0)
150 if (SharedDelete == FALSE)
151 return(STATUS_SHARING_VIOLATION);
156 ShareAccess->OpenCount++;
158 if (ReadAccess == TRUE)
159 ShareAccess->Readers++;
161 if (WriteAccess == TRUE)
162 ShareAccess->Writers++;
164 if (DeleteAccess == TRUE)
165 ShareAccess->Deleters++;
167 if (SharedRead == TRUE)
168 ShareAccess->SharedRead++;
170 if (SharedWrite == TRUE)
171 ShareAccess->SharedWrite++;
173 if (SharedDelete == TRUE)
174 ShareAccess->SharedDelete++;
177 return(STATUS_SUCCESS);
182 IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
183 IN PSHARE_ACCESS ShareAccess)
185 if ((FileObject->ReadAccess == FALSE) &&
186 (FileObject->WriteAccess == FALSE) &&
187 (FileObject->DeleteAccess == FALSE))
192 ShareAccess->OpenCount--;
194 if (FileObject->ReadAccess == TRUE)
196 ShareAccess->Readers--;
199 if (FileObject->WriteAccess == TRUE)
201 ShareAccess->Writers--;
204 if (FileObject->DeleteAccess == TRUE)
206 ShareAccess->Deleters--;
209 if (FileObject->SharedRead == TRUE)
211 ShareAccess->SharedRead--;
214 if (FileObject->SharedWrite == TRUE)
216 ShareAccess->SharedWrite--;
219 if (FileObject->SharedDelete == TRUE)
221 ShareAccess->SharedDelete--;
227 IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
228 IN ULONG DesiredShareAccess,
229 IN PFILE_OBJECT FileObject,
230 OUT PSHARE_ACCESS ShareAccess)
234 BOOLEAN DeleteAccess;
237 BOOLEAN SharedDelete;
239 ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
240 WriteAccess = (DesiredAccess & (FILE_READ_DATA | FILE_APPEND_DATA));
241 DeleteAccess = (DesiredAccess & DELETE);
243 FileObject->ReadAccess = ReadAccess;
244 FileObject->WriteAccess = WriteAccess;
245 FileObject->DeleteAccess = DeleteAccess;
247 if (!ReadAccess && !WriteAccess && !DeleteAccess)
249 FileObject->SharedRead = FALSE;
250 FileObject->SharedWrite = FALSE;
251 FileObject->SharedDelete = FALSE;
253 ShareAccess->OpenCount = 0;
254 ShareAccess->Readers = 0;
255 ShareAccess->Writers = 0;
256 ShareAccess->Deleters = 0;
258 ShareAccess->SharedRead = 0;
259 ShareAccess->SharedWrite = 0;
260 ShareAccess->SharedDelete = 0;
264 SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
265 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
266 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
268 FileObject->SharedRead = SharedRead;
269 FileObject->SharedWrite = SharedWrite;
270 FileObject->SharedDelete = SharedDelete;
272 ShareAccess->OpenCount = 1;
273 ShareAccess->Readers = (ReadAccess) ? 1 : 0;
274 ShareAccess->Writers = (WriteAccess) ? 1 : 0;
275 ShareAccess->Deleters = (DeleteAccess) ? 1 : 0;
277 ShareAccess->SharedRead = (SharedRead) ? 1 : 0;
278 ShareAccess->SharedWrite = (SharedWrite) ? 1 : 0;
279 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)