mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 05:42:57 +00:00
- fixed access rights and shared access checks in IoSetShareAccess()
- remove obsolete checks in IoCheckShareAccess() and IoUpdateShareAccess() to simplify them svn path=/trunk/; revision=14223
This commit is contained in:
parent
8b9646ca2a
commit
de138c3bb4
1 changed files with 69 additions and 154 deletions
|
@ -22,43 +22,20 @@ VOID STDCALL
|
||||||
IoUpdateShareAccess(PFILE_OBJECT FileObject,
|
IoUpdateShareAccess(PFILE_OBJECT FileObject,
|
||||||
PSHARE_ACCESS ShareAccess)
|
PSHARE_ACCESS ShareAccess)
|
||||||
{
|
{
|
||||||
if ((FileObject->ReadAccess == FALSE) &&
|
PAGED_CODE();
|
||||||
(FileObject->WriteAccess == FALSE) &&
|
|
||||||
(FileObject->DeleteAccess == FALSE))
|
if (FileObject->ReadAccess ||
|
||||||
|
FileObject->WriteAccess ||
|
||||||
|
FileObject->DeleteAccess)
|
||||||
{
|
{
|
||||||
return;
|
ShareAccess->OpenCount++;
|
||||||
}
|
|
||||||
|
|
||||||
ShareAccess->OpenCount++;
|
ShareAccess->Readers += FileObject->ReadAccess;
|
||||||
|
ShareAccess->Writers += FileObject->WriteAccess;
|
||||||
if (FileObject->ReadAccess == TRUE)
|
ShareAccess->Deleters += FileObject->DeleteAccess;
|
||||||
{
|
ShareAccess->SharedRead += FileObject->SharedRead;
|
||||||
ShareAccess->Readers++;
|
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,85 +56,48 @@ IoCheckShareAccess(IN ACCESS_MASK DesiredAccess,
|
||||||
BOOLEAN SharedRead;
|
BOOLEAN SharedRead;
|
||||||
BOOLEAN SharedWrite;
|
BOOLEAN SharedWrite;
|
||||||
BOOLEAN SharedDelete;
|
BOOLEAN SharedDelete;
|
||||||
|
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
|
ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
|
||||||
WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA));
|
WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
|
||||||
DeleteAccess = (DesiredAccess & DELETE);
|
DeleteAccess = (DesiredAccess & DELETE) != 0;
|
||||||
|
|
||||||
FileObject->ReadAccess = ReadAccess;
|
FileObject->ReadAccess = ReadAccess;
|
||||||
FileObject->WriteAccess = WriteAccess;
|
FileObject->WriteAccess = WriteAccess;
|
||||||
FileObject->DeleteAccess = DeleteAccess;
|
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);
|
FileObject->SharedRead = SharedRead;
|
||||||
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
|
FileObject->SharedWrite = SharedWrite;
|
||||||
SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
|
FileObject->SharedDelete = SharedDelete;
|
||||||
|
|
||||||
FileObject->SharedRead = SharedRead;
|
if ((ReadAccess && (ShareAccess->SharedRead < ShareAccess->OpenCount)) ||
|
||||||
FileObject->SharedWrite = SharedWrite;
|
(WriteAccess && (ShareAccess->SharedWrite < ShareAccess->OpenCount)) ||
|
||||||
FileObject->SharedDelete = SharedDelete;
|
(DeleteAccess && (ShareAccess->SharedDelete < ShareAccess->OpenCount)) ||
|
||||||
|
((ShareAccess->Readers != 0) && !SharedRead) ||
|
||||||
|
((ShareAccess->Writers != 0) && !SharedWrite) ||
|
||||||
|
((ShareAccess->Deleters != 0) && !SharedDelete))
|
||||||
|
{
|
||||||
|
return(STATUS_SHARING_VIOLATION);
|
||||||
|
}
|
||||||
|
|
||||||
if (ReadAccess)
|
if (Update)
|
||||||
{
|
{
|
||||||
if (ShareAccess->SharedRead < ShareAccess->OpenCount)
|
ShareAccess->OpenCount++;
|
||||||
return(STATUS_SHARING_VIOLATION);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (WriteAccess)
|
ShareAccess->Readers += ReadAccess;
|
||||||
{
|
ShareAccess->Writers += WriteAccess;
|
||||||
if (ShareAccess->SharedWrite < ShareAccess->OpenCount)
|
ShareAccess->Deleters += DeleteAccess;
|
||||||
return(STATUS_SHARING_VIOLATION);
|
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);
|
return(STATUS_SUCCESS);
|
||||||
|
@ -171,43 +111,20 @@ VOID STDCALL
|
||||||
IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
|
IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
|
||||||
IN PSHARE_ACCESS ShareAccess)
|
IN PSHARE_ACCESS ShareAccess)
|
||||||
{
|
{
|
||||||
if ((FileObject->ReadAccess == FALSE) &&
|
PAGED_CODE();
|
||||||
(FileObject->WriteAccess == FALSE) &&
|
|
||||||
(FileObject->DeleteAccess == FALSE))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShareAccess->OpenCount--;
|
if (FileObject->ReadAccess ||
|
||||||
|
FileObject->WriteAccess ||
|
||||||
if (FileObject->ReadAccess == TRUE)
|
FileObject->DeleteAccess)
|
||||||
{
|
{
|
||||||
ShareAccess->Readers--;
|
ShareAccess->OpenCount--;
|
||||||
}
|
|
||||||
|
|
||||||
if (FileObject->WriteAccess == TRUE)
|
ShareAccess->Readers -= FileObject->ReadAccess;
|
||||||
{
|
ShareAccess->Writers -= FileObject->WriteAccess;
|
||||||
ShareAccess->Writers--;
|
ShareAccess->Deleters -= FileObject->DeleteAccess;
|
||||||
}
|
ShareAccess->SharedRead -= FileObject->SharedRead;
|
||||||
|
ShareAccess->SharedWrite -= FileObject->SharedWrite;
|
||||||
if (FileObject->DeleteAccess == TRUE)
|
ShareAccess->SharedDelete -= FileObject->SharedDelete;
|
||||||
{
|
|
||||||
ShareAccess->Deleters--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FileObject->SharedRead == TRUE)
|
|
||||||
{
|
|
||||||
ShareAccess->SharedRead--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FileObject->SharedWrite == TRUE)
|
|
||||||
{
|
|
||||||
ShareAccess->SharedWrite--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FileObject->SharedDelete == TRUE)
|
|
||||||
{
|
|
||||||
ShareAccess->SharedDelete--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,10 +144,12 @@ IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
|
||||||
BOOLEAN SharedRead;
|
BOOLEAN SharedRead;
|
||||||
BOOLEAN SharedWrite;
|
BOOLEAN SharedWrite;
|
||||||
BOOLEAN SharedDelete;
|
BOOLEAN SharedDelete;
|
||||||
|
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE));
|
ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
|
||||||
WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA));
|
WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
|
||||||
DeleteAccess = (DesiredAccess & DELETE);
|
DeleteAccess = (DesiredAccess & DELETE) != 0;
|
||||||
|
|
||||||
FileObject->ReadAccess = ReadAccess;
|
FileObject->ReadAccess = ReadAccess;
|
||||||
FileObject->WriteAccess = WriteAccess;
|
FileObject->WriteAccess = WriteAccess;
|
||||||
|
@ -238,10 +157,6 @@ IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
|
||||||
|
|
||||||
if (!ReadAccess && !WriteAccess && !DeleteAccess)
|
if (!ReadAccess && !WriteAccess && !DeleteAccess)
|
||||||
{
|
{
|
||||||
FileObject->SharedRead = FALSE;
|
|
||||||
FileObject->SharedWrite = FALSE;
|
|
||||||
FileObject->SharedDelete = FALSE;
|
|
||||||
|
|
||||||
ShareAccess->OpenCount = 0;
|
ShareAccess->OpenCount = 0;
|
||||||
ShareAccess->Readers = 0;
|
ShareAccess->Readers = 0;
|
||||||
ShareAccess->Writers = 0;
|
ShareAccess->Writers = 0;
|
||||||
|
@ -253,22 +168,22 @@ IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SharedRead = (DesiredShareAccess & FILE_SHARE_READ);
|
SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
|
||||||
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE);
|
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
|
||||||
SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE);
|
SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
|
||||||
|
|
||||||
FileObject->SharedRead = SharedRead;
|
FileObject->SharedRead = SharedRead;
|
||||||
FileObject->SharedWrite = SharedWrite;
|
FileObject->SharedWrite = SharedWrite;
|
||||||
FileObject->SharedDelete = SharedDelete;
|
FileObject->SharedDelete = SharedDelete;
|
||||||
|
|
||||||
ShareAccess->OpenCount = 1;
|
ShareAccess->OpenCount = 1;
|
||||||
ShareAccess->Readers = (ReadAccess) ? 1 : 0;
|
ShareAccess->Readers = ReadAccess;
|
||||||
ShareAccess->Writers = (WriteAccess) ? 1 : 0;
|
ShareAccess->Writers = WriteAccess;
|
||||||
ShareAccess->Deleters = (DeleteAccess) ? 1 : 0;
|
ShareAccess->Deleters = DeleteAccess;
|
||||||
|
|
||||||
ShareAccess->SharedRead = (SharedRead) ? 1 : 0;
|
ShareAccess->SharedRead = SharedRead;
|
||||||
ShareAccess->SharedWrite = (SharedWrite) ? 1 : 0;
|
ShareAccess->SharedWrite = SharedWrite;
|
||||||
ShareAccess->SharedDelete = (SharedDelete) ? 1 : 0;
|
ShareAccess->SharedDelete = SharedDelete;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,7 +261,7 @@ IoSetInformation(IN PFILE_OBJECT FileObject,
|
||||||
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByPointer(FileObject,
|
Status = ObReferenceObjectByPointer(FileObject,
|
||||||
FILE_WRITE_ATTRIBUTES,
|
0, /* FIXME - depends on the information class */
|
||||||
IoFileObjectType,
|
IoFileObjectType,
|
||||||
KernelMode);
|
KernelMode);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue