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 *****************************************************************/
33 #include <internal/debug.h>
35 /* 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
++;
89 IoCheckShareAccess(IN ACCESS_MASK DesiredAccess
,
90 IN ULONG DesiredShareAccess
,
91 IN PFILE_OBJECT FileObject
,
92 IN PSHARE_ACCESS ShareAccess
,
100 BOOLEAN SharedDelete
;
102 ReadAccess
= (DesiredAccess
& (FILE_READ_DATA
| FILE_EXECUTE
));
103 WriteAccess
= (DesiredAccess
& (FILE_WRITE_DATA
| FILE_APPEND_DATA
));
104 DeleteAccess
= (DesiredAccess
& DELETE
);
106 FileObject
->ReadAccess
= ReadAccess
;
107 FileObject
->WriteAccess
= WriteAccess
;
108 FileObject
->DeleteAccess
= DeleteAccess
;
110 if (!ReadAccess
&& !WriteAccess
&& !DeleteAccess
)
112 return(STATUS_SUCCESS
);
115 SharedRead
= (DesiredShareAccess
& FILE_SHARE_READ
);
116 SharedWrite
= (DesiredShareAccess
& FILE_SHARE_WRITE
);
117 SharedDelete
= (DesiredShareAccess
& FILE_SHARE_DELETE
);
119 FileObject
->SharedRead
= SharedRead
;
120 FileObject
->SharedWrite
= SharedWrite
;
121 FileObject
->SharedDelete
= SharedDelete
;
125 if (ShareAccess
->SharedRead
< ShareAccess
->OpenCount
)
126 return(STATUS_SHARING_VIOLATION
);
131 if (ShareAccess
->SharedWrite
< ShareAccess
->OpenCount
)
132 return(STATUS_SHARING_VIOLATION
);
137 if (ShareAccess
->SharedDelete
< ShareAccess
->OpenCount
)
138 return(STATUS_SHARING_VIOLATION
);
141 if (ShareAccess
->Readers
!= 0)
143 if (SharedRead
== FALSE
)
144 return(STATUS_SHARING_VIOLATION
);
147 if (ShareAccess
->Writers
!= 0)
149 if (SharedWrite
== FALSE
)
150 return(STATUS_SHARING_VIOLATION
);
153 if (ShareAccess
->Deleters
!= 0)
155 if (SharedDelete
== FALSE
)
156 return(STATUS_SHARING_VIOLATION
);
161 ShareAccess
->OpenCount
++;
163 if (ReadAccess
== TRUE
)
164 ShareAccess
->Readers
++;
166 if (WriteAccess
== TRUE
)
167 ShareAccess
->Writers
++;
169 if (DeleteAccess
== TRUE
)
170 ShareAccess
->Deleters
++;
172 if (SharedRead
== TRUE
)
173 ShareAccess
->SharedRead
++;
175 if (SharedWrite
== TRUE
)
176 ShareAccess
->SharedWrite
++;
178 if (SharedDelete
== TRUE
)
179 ShareAccess
->SharedDelete
++;
182 return(STATUS_SUCCESS
);
190 IoRemoveShareAccess(IN PFILE_OBJECT FileObject
,
191 IN PSHARE_ACCESS ShareAccess
)
193 if ((FileObject
->ReadAccess
== FALSE
) &&
194 (FileObject
->WriteAccess
== FALSE
) &&
195 (FileObject
->DeleteAccess
== FALSE
))
200 ShareAccess
->OpenCount
--;
202 if (FileObject
->ReadAccess
== TRUE
)
204 ShareAccess
->Readers
--;
207 if (FileObject
->WriteAccess
== TRUE
)
209 ShareAccess
->Writers
--;
212 if (FileObject
->DeleteAccess
== TRUE
)
214 ShareAccess
->Deleters
--;
217 if (FileObject
->SharedRead
== TRUE
)
219 ShareAccess
->SharedRead
--;
222 if (FileObject
->SharedWrite
== TRUE
)
224 ShareAccess
->SharedWrite
--;
227 if (FileObject
->SharedDelete
== TRUE
)
229 ShareAccess
->SharedDelete
--;
238 IoSetShareAccess(IN ACCESS_MASK DesiredAccess
,
239 IN ULONG DesiredShareAccess
,
240 IN PFILE_OBJECT FileObject
,
241 OUT PSHARE_ACCESS ShareAccess
)
245 BOOLEAN DeleteAccess
;
248 BOOLEAN SharedDelete
;
250 ReadAccess
= (DesiredAccess
& (FILE_READ_DATA
| FILE_EXECUTE
));
251 WriteAccess
= (DesiredAccess
& (FILE_WRITE_DATA
| FILE_APPEND_DATA
));
252 DeleteAccess
= (DesiredAccess
& DELETE
);
254 FileObject
->ReadAccess
= ReadAccess
;
255 FileObject
->WriteAccess
= WriteAccess
;
256 FileObject
->DeleteAccess
= DeleteAccess
;
258 if (!ReadAccess
&& !WriteAccess
&& !DeleteAccess
)
260 FileObject
->SharedRead
= FALSE
;
261 FileObject
->SharedWrite
= FALSE
;
262 FileObject
->SharedDelete
= FALSE
;
264 ShareAccess
->OpenCount
= 0;
265 ShareAccess
->Readers
= 0;
266 ShareAccess
->Writers
= 0;
267 ShareAccess
->Deleters
= 0;
269 ShareAccess
->SharedRead
= 0;
270 ShareAccess
->SharedWrite
= 0;
271 ShareAccess
->SharedDelete
= 0;
275 SharedRead
= (DesiredShareAccess
& FILE_SHARE_READ
);
276 SharedWrite
= (DesiredShareAccess
& FILE_SHARE_WRITE
);
277 SharedDelete
= (DesiredShareAccess
& FILE_SHARE_DELETE
);
279 FileObject
->SharedRead
= SharedRead
;
280 FileObject
->SharedWrite
= SharedWrite
;
281 FileObject
->SharedDelete
= SharedDelete
;
283 ShareAccess
->OpenCount
= 1;
284 ShareAccess
->Readers
= (ReadAccess
) ? 1 : 0;
285 ShareAccess
->Writers
= (WriteAccess
) ? 1 : 0;
286 ShareAccess
->Deleters
= (DeleteAccess
) ? 1 : 0;
288 ShareAccess
->SharedRead
= (SharedRead
) ? 1 : 0;
289 ShareAccess
->SharedWrite
= (SharedWrite
) ? 1 : 0;
290 ShareAccess
->SharedDelete
= (SharedDelete
) ? 1 : 0;
299 IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess
,
300 IN ACCESS_MASK GrantedAccess
)
302 RtlMapGenericMask(DesiredAccess
,
303 IoFileObjectType
->Mapping
);
304 if ((*DesiredAccess
& GrantedAccess
) != GrantedAccess
)
305 return(STATUS_ACCESS_DENIED
);
307 return(STATUS_SUCCESS
);
315 IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer
,
317 OUT PULONG ErrorOffset
)
320 return(STATUS_NOT_IMPLEMENTED
);
328 IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess
,
329 IN UCHAR MajorFunction
,
330 IN UCHAR MinorFunction
,
331 IN ULONG IoControlCode
,
332 IN PVOID ExtraData OPTIONAL
,
333 IN PVOID ExtraData2 OPTIONAL
)
336 return(STATUS_NOT_IMPLEMENTED
);
344 IoSetInformation(IN PFILE_OBJECT FileObject
,
345 IN FILE_INFORMATION_CLASS FileInformationClass
,
347 OUT PVOID FileInformation
)
350 return(STATUS_NOT_IMPLEMENTED
);
358 IoFastQueryNetworkAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes
,
359 IN ACCESS_MASK DesiredAccess
,
360 IN ULONG OpenOptions
,
361 OUT PIO_STATUS_BLOCK IoStatus
,
362 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
)