- fixed access rights and shared access checks in IoSetShareAccess()
- remove obsolete checks in IoCheckShareAccess() and
IoUpdateShareAccess() to simplify them
Modified: trunk/reactos/ntoskrnl/io/share.c
_____
Modified: trunk/reactos/ntoskrnl/io/share.c
--- trunk/reactos/ntoskrnl/io/share.c 2005-03-20 13:53:54 UTC (rev
14222)
+++ trunk/reactos/ntoskrnl/io/share.c 2005-03-20 15:54:22 UTC (rev
14223)
@@ -22,44 +22,21 @@
IoUpdateShareAccess(PFILE_OBJECT FileObject,
PSHARE_ACCESS ShareAccess)
{
- if ((FileObject->ReadAccess == FALSE) &&
- (FileObject->WriteAccess == FALSE) &&
- (FileObject->DeleteAccess == FALSE))
+ PAGED_CODE();
+
+ if (FileObject->ReadAccess ||
+ FileObject->WriteAccess ||
+ FileObject->DeleteAccess)
{
- return;
- }
+ ShareAccess->OpenCount++;
- ShareAccess->OpenCount++;
-
- if (FileObject->ReadAccess == TRUE)
- {
- ShareAccess->Readers++;
+ ShareAccess->Readers += FileObject->ReadAccess;
+ ShareAccess->Writers += FileObject->WriteAccess;
+ ShareAccess->Deleters += FileObject->DeleteAccess;
+ ShareAccess->SharedRead += FileObject->SharedRead;
+ ShareAccess->SharedWrite += FileObject->SharedWrite;
+ ShareAccess->SharedDelete += FileObject->SharedDelete;
}
-
- if (FileObject->WriteAccess == TRUE)
- {
- ShareAccess->Writers++;
- }
-
- if (FileObject->DeleteAccess == TRUE)
- {
- ShareAccess->Deleters++;
- }
-
- if (FileObject->SharedRead == TRUE)
- {
- ShareAccess->SharedRead++;
- }
-
- if (FileObject->SharedWrite == TRUE)
- {
- ShareAccess->SharedWrite++;
- }
-
- if (FileObject->SharedDelete == TRUE)
- {
- ShareAccess->SharedDelete++;
- }
}
@@ -79,87 +56,50 @@
BOOLEAN SharedRead;
BOOLEAN SharedWrite;
BOOLEAN SharedDelete;
+
+ PAGED_CODE();
- ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
- WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA));
- DeleteAccess = (DesiredAccess & DELETE);
+ ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
+ WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA))
!= 0;
+ DeleteAccess = (DesiredAccess & DELETE) != 0;
FileObject->ReadAccess = ReadAccess;
FileObject->WriteAccess = WriteAccess;
FileObject->DeleteAccess = DeleteAccess;
- if (!ReadAccess && !WriteAccess && !DeleteAccess)
+ if (ReadAccess || WriteAccess || DeleteAccess)
{
- return(STATUS_SUCCESS);
- }
+ SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
+ SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
+ SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
- SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
- SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
- SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
+ FileObject->SharedRead = SharedRead;
+ FileObject->SharedWrite = SharedWrite;
+ FileObject->SharedDelete = SharedDelete;
- FileObject->SharedRead = SharedRead;
- FileObject->SharedWrite = SharedWrite;
- FileObject->SharedDelete = SharedDelete;
+ if ((ReadAccess && (ShareAccess->SharedRead <
ShareAccess->OpenCount)) ||
+ (WriteAccess && (ShareAccess->SharedWrite <
ShareAccess->OpenCount)) ||
+ (DeleteAccess && (ShareAccess->SharedDelete <
ShareAccess->OpenCount)) ||
+ ((ShareAccess->Readers != 0) && !SharedRead) ||
+ ((ShareAccess->Writers != 0) && !SharedWrite) ||
+ ((ShareAccess->Deleters != 0) && !SharedDelete))
+ {
+ return(STATUS_SHARING_VIOLATION);
+ }
- if (ReadAccess)
- {
- if (ShareAccess->SharedRead < ShareAccess->OpenCount)
- return(STATUS_SHARING_VIOLATION);
- }
+ if (Update)
+ {
+ ShareAccess->OpenCount++;
- if (WriteAccess)
- {
- if (ShareAccess->SharedWrite < ShareAccess->OpenCount)
- return(STATUS_SHARING_VIOLATION);
+ ShareAccess->Readers += ReadAccess;
+ ShareAccess->Writers += WriteAccess;
+ ShareAccess->Deleters += DeleteAccess;
+ ShareAccess->SharedRead += SharedRead;
+ ShareAccess->SharedWrite += SharedWrite;
+ ShareAccess->SharedDelete += SharedDelete;
+ }
}
- if (DeleteAccess)
- {
- if (ShareAccess->SharedDelete < ShareAccess->OpenCount)
- return(STATUS_SHARING_VIOLATION);
- }
-
- if (ShareAccess->Readers != 0)
- {
- if (SharedRead == FALSE)
- return(STATUS_SHARING_VIOLATION);
- }
-
- if (ShareAccess->Writers != 0)
- {
- if (SharedWrite == FALSE)
- return(STATUS_SHARING_VIOLATION);
- }
-
- if (ShareAccess->Deleters != 0)
- {
- if (SharedDelete == FALSE)
- return(STATUS_SHARING_VIOLATION);
- }
-
- if (Update == TRUE)
- {
- ShareAccess->OpenCount++;
-
- if (ReadAccess == TRUE)
- ShareAccess->Readers++;
-
- if (WriteAccess == TRUE)
- ShareAccess->Writers++;
-
- if (DeleteAccess == TRUE)
- ShareAccess->Deleters++;
-
- if (SharedRead == TRUE)
- ShareAccess->SharedRead++;
-
- if (SharedWrite == TRUE)
- ShareAccess->SharedWrite++;
-
- if (SharedDelete == TRUE)
- ShareAccess->SharedDelete++;
- }
-
return(STATUS_SUCCESS);
}
@@ -171,44 +111,21 @@
IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
IN PSHARE_ACCESS ShareAccess)
{
- if ((FileObject->ReadAccess == FALSE) &&
- (FileObject->WriteAccess == FALSE) &&
- (FileObject->DeleteAccess == FALSE))
- {
- return;
- }
+ PAGED_CODE();
- ShareAccess->OpenCount--;
-
- if (FileObject->ReadAccess == TRUE)
+ if (FileObject->ReadAccess ||
+ FileObject->WriteAccess ||
+ FileObject->DeleteAccess)
{
- ShareAccess->Readers--;
- }
+ ShareAccess->OpenCount--;
- if (FileObject->WriteAccess == TRUE)
- {
- ShareAccess->Writers--;
+ ShareAccess->Readers -= FileObject->ReadAccess;
+ ShareAccess->Writers -= FileObject->WriteAccess;
+ ShareAccess->Deleters -= FileObject->DeleteAccess;
+ ShareAccess->SharedRead -= FileObject->SharedRead;
+ ShareAccess->SharedWrite -= FileObject->SharedWrite;
+ ShareAccess->SharedDelete -= FileObject->SharedDelete;
}
-
- if (FileObject->DeleteAccess == TRUE)
- {
- ShareAccess->Deleters--;
- }
-
- if (FileObject->SharedRead == TRUE)
- {
- ShareAccess->SharedRead--;
- }
-
- if (FileObject->SharedWrite == TRUE)
- {
- ShareAccess->SharedWrite--;
- }
-
- if (FileObject->SharedDelete == TRUE)
- {
- ShareAccess->SharedDelete--;
- }
}
@@ -227,10 +144,12 @@
BOOLEAN SharedRead;
BOOLEAN SharedWrite;
BOOLEAN SharedDelete;
+
+ PAGED_CODE();
- ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
- WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA));
- DeleteAccess = (DesiredAccess & DELETE);
+ ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
+ WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA))
!= 0;
+ DeleteAccess = (DesiredAccess & DELETE) != 0;
FileObject->ReadAccess = ReadAccess;
FileObject->WriteAccess = WriteAccess;
@@ -238,10 +157,6 @@
if (!ReadAccess && !WriteAccess && !DeleteAccess)
{
- FileObject->SharedRead = FALSE;
- FileObject->SharedWrite = FALSE;
- FileObject->SharedDelete = FALSE;
-
ShareAccess->OpenCount = 0;
ShareAccess->Readers = 0;
ShareAccess->Writers = 0;
@@ -253,22 +168,22 @@
}
else
{
- SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
- SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
- SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
+ SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
+ SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
+ SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
FileObject->SharedRead = SharedRead;
FileObject->SharedWrite = SharedWrite;
FileObject->SharedDelete = SharedDelete;
ShareAccess->OpenCount = 1;
- ShareAccess->Readers = (ReadAccess) ? 1 : 0;
- ShareAccess->Writers = (WriteAccess) ? 1 : 0;
- ShareAccess->Deleters = (DeleteAccess) ? 1 : 0;
+ ShareAccess->Readers = ReadAccess;
+ ShareAccess->Writers = WriteAccess;
+ ShareAccess->Deleters = DeleteAccess;
- ShareAccess->SharedRead = (SharedRead) ? 1 : 0;
- ShareAccess->SharedWrite = (SharedWrite) ? 1 : 0;
- ShareAccess->SharedDelete = (SharedDelete) ? 1 : 0;
+ ShareAccess->SharedRead = SharedRead;
+ ShareAccess->SharedWrite = SharedWrite;
+ ShareAccess->SharedDelete = SharedDelete;
}
}
@@ -346,7 +261,7 @@
Status = ObReferenceObjectByPointer(FileObject,
- FILE_WRITE_ATTRIBUTES,
+ 0, /* FIXME - depends on the
information class */
IoFileObjectType,
KernelMode);
if (!NT_SUCCESS(Status))
Show replies by date