1 /* $Id: share.c,v 1.5 2002/01/21 11:42:04 ekohl Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/share.c
7 * PROGRAMMER: David Welch (welch@mcmail.com)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
16 #include <internal/debug.h>
18 /* FUNCTIONS *****************************************************************/
21 IoUpdateShareAccess(PFILE_OBJECT FileObject
,
22 PSHARE_ACCESS ShareAccess
)
24 if ((FileObject
->ReadAccess
== FALSE
) &&
25 (FileObject
->WriteAccess
== FALSE
) &&
26 (FileObject
->DeleteAccess
== FALSE
))
31 ShareAccess
->OpenCount
++;
33 if (FileObject
->ReadAccess
== TRUE
)
35 ShareAccess
->Readers
++;
38 if (FileObject
->WriteAccess
== TRUE
)
40 ShareAccess
->Writers
++;
43 if (FileObject
->DeleteAccess
== TRUE
)
45 ShareAccess
->Deleters
++;
48 if (FileObject
->SharedRead
== TRUE
)
50 ShareAccess
->SharedRead
++;
53 if (FileObject
->SharedWrite
== TRUE
)
55 ShareAccess
->SharedWrite
++;
58 if (FileObject
->SharedDelete
== TRUE
)
60 ShareAccess
->SharedDelete
++;
66 IoCheckShareAccess(ACCESS_MASK DesiredAccess
,
67 ULONG DesiredShareAccess
,
68 PFILE_OBJECT FileObject
,
69 PSHARE_ACCESS ShareAccess
,
79 ReadAccess
= (DesiredAccess
& (FILE_READ_DATA
| FILE_EXECUTE
));
80 WriteAccess
= (DesiredAccess
& (FILE_READ_DATA
| FILE_APPEND_DATA
));
81 DeleteAccess
= (DesiredAccess
& DELETE
);
83 FileObject
->ReadAccess
= ReadAccess
;
84 FileObject
->WriteAccess
= WriteAccess
;
85 FileObject
->DeleteAccess
= DeleteAccess
;
87 if (!ReadAccess
&& !WriteAccess
&& !DeleteAccess
)
89 return (STATUS_SUCCESS
);
92 SharedRead
= (DesiredShareAccess
& FILE_SHARE_READ
);
93 SharedWrite
= (DesiredShareAccess
& FILE_SHARE_WRITE
);
94 SharedDelete
= (DesiredShareAccess
& FILE_SHARE_DELETE
);
96 FileObject
->SharedRead
= SharedRead
;
97 FileObject
->SharedWrite
= SharedWrite
;
98 FileObject
->SharedDelete
= SharedDelete
;
102 if (ShareAccess
->SharedRead
< ShareAccess
->OpenCount
)
103 return (STATUS_SHARING_VIOLATION
);
108 if (ShareAccess
->SharedWrite
< ShareAccess
->OpenCount
)
109 return (STATUS_SHARING_VIOLATION
);
114 if (ShareAccess
->SharedDelete
< ShareAccess
->OpenCount
)
115 return (STATUS_SHARING_VIOLATION
);
118 if (ShareAccess
->Readers
!= 0)
120 if (SharedRead
== FALSE
)
121 return (STATUS_SHARING_VIOLATION
);
124 if (ShareAccess
->Writers
!= 0)
126 if (SharedWrite
== FALSE
)
127 return (STATUS_SHARING_VIOLATION
);
130 if (ShareAccess
->Deleters
!= 0)
132 if (SharedDelete
== FALSE
)
133 return (STATUS_SHARING_VIOLATION
);
138 ShareAccess
->OpenCount
++;
140 if (ReadAccess
== TRUE
)
141 ShareAccess
->Readers
++;
143 if (WriteAccess
== TRUE
)
144 ShareAccess
->Writers
++;
146 if (DeleteAccess
== TRUE
)
147 ShareAccess
->Deleters
++;
149 if (SharedRead
== TRUE
)
150 ShareAccess
->SharedRead
++;
152 if (SharedWrite
== TRUE
)
153 ShareAccess
->SharedWrite
++;
155 if (SharedDelete
== TRUE
)
156 ShareAccess
->SharedDelete
++;
159 return (STATUS_SUCCESS
);
164 IoRemoveShareAccess(PFILE_OBJECT FileObject
,
165 PSHARE_ACCESS ShareAccess
)
167 if ((FileObject
->ReadAccess
== FALSE
) &&
168 (FileObject
->WriteAccess
== FALSE
) &&
169 (FileObject
->DeleteAccess
== FALSE
))
174 ShareAccess
->OpenCount
--;
176 if (FileObject
->ReadAccess
== TRUE
)
178 ShareAccess
->Readers
--;
181 if (FileObject
->WriteAccess
== TRUE
)
183 ShareAccess
->Writers
--;
186 if (FileObject
->DeleteAccess
== TRUE
)
188 ShareAccess
->Deleters
--;
191 if (FileObject
->SharedRead
== TRUE
)
193 ShareAccess
->SharedRead
--;
196 if (FileObject
->SharedWrite
== TRUE
)
198 ShareAccess
->SharedWrite
--;
201 if (FileObject
->SharedDelete
== TRUE
)
203 ShareAccess
->SharedDelete
--;
209 IoSetShareAccess(ACCESS_MASK DesiredAccess
,
210 ULONG DesiredShareAccess
,
211 PFILE_OBJECT FileObject
,
212 PSHARE_ACCESS ShareAccess
)
216 BOOLEAN DeleteAccess
;
219 BOOLEAN SharedDelete
;
221 ReadAccess
= (DesiredAccess
& (FILE_READ_DATA
| FILE_EXECUTE
));
222 WriteAccess
= (DesiredAccess
& (FILE_READ_DATA
| FILE_APPEND_DATA
));
223 DeleteAccess
= (DesiredAccess
& DELETE
);
225 FileObject
->ReadAccess
= ReadAccess
;
226 FileObject
->WriteAccess
= WriteAccess
;
227 FileObject
->DeleteAccess
= DeleteAccess
;
229 if (!ReadAccess
&& !WriteAccess
&& !DeleteAccess
)
231 FileObject
->SharedRead
= FALSE
;
232 FileObject
->SharedWrite
= FALSE
;
233 FileObject
->SharedDelete
= FALSE
;
235 ShareAccess
->OpenCount
= 0;
236 ShareAccess
->Readers
= 0;
237 ShareAccess
->Writers
= 0;
238 ShareAccess
->Deleters
= 0;
240 ShareAccess
->SharedRead
= 0;
241 ShareAccess
->SharedWrite
= 0;
242 ShareAccess
->SharedDelete
= 0;
246 SharedRead
= (DesiredShareAccess
& FILE_SHARE_READ
);
247 SharedWrite
= (DesiredShareAccess
& FILE_SHARE_WRITE
);
248 SharedDelete
= (DesiredShareAccess
& FILE_SHARE_DELETE
);
250 FileObject
->SharedRead
= SharedRead
;
251 FileObject
->SharedWrite
= SharedWrite
;
252 FileObject
->SharedDelete
= SharedDelete
;
254 ShareAccess
->OpenCount
= 1;
255 ShareAccess
->Readers
= (ReadAccess
) ? 1 : 0;
256 ShareAccess
->Writers
= (WriteAccess
) ? 1 : 0;
257 ShareAccess
->Deleters
= (DeleteAccess
) ? 1 : 0;
259 ShareAccess
->SharedRead
= (SharedRead
) ? 1 : 0;
260 ShareAccess
->SharedWrite
= (SharedWrite
) ? 1 : 0;
261 ShareAccess
->SharedDelete
= (SharedDelete
) ? 1 : 0;
267 IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess
,
268 IN ACCESS_MASK GrantedAccess
)
271 return(STATUS_NOT_IMPLEMENTED
);
276 IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer
,
278 OUT PULONG ErrorOffset
)
281 return(STATUS_NOT_IMPLEMENTED
);
286 IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess
,
287 IN UCHAR MajorFunction
,
288 IN UCHAR MinorFunction
,
289 IN ULONG IoControlCode
,
290 IN PFILE_INFORMATION_CLASS FileInformationClass OPTIONAL
,
291 IN PFS_INFORMATION_CLASS FsInformationClass OPTIONAL
)
294 return(STATUS_NOT_IMPLEMENTED
);
299 IoSetInformation(IN PFILE_OBJECT FileObject
,
300 IN FILE_INFORMATION_CLASS FileInformationClass
,
302 OUT PVOID FileInformation
)
305 return(STATUS_NOT_IMPLEMENTED
);
310 IoFastQueryNetworkAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes
,
311 IN ACCESS_MASK DesiredAccess
,
312 IN ULONG OpenOptions
,
313 OUT PIO_STATUS_BLOCK IoStatus
,
314 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
)