IoSetLinkShareAccess
VOID __stdcall IoSetLinkShareAccess(
ACCESS_MASK DesiredAccess,
UINT32 DesiredShareAccess,
PFILE_OBJECT FileObject,
PSHARE_ACCESS ShareAccess,
PLINK_SHARE_ACCESS LinkShareAccess,
UINT32 IoShareAccessFlags){
ACCESS_MASK v6;
char v7;
ACCESS_MASK v8;
ACCESS_MASK v9;
_DWORD *FileObjectExtension;
bool v11;
ULONG SharedDelete;
v6 = DesiredAccess & 0x21;
v7 = DesiredShareAccess;
v8 = DesiredAccess & 6;
FileObject->ReadAccess = v6 != 0;
v9 = DesiredAccess & 0x10000;
FileObject->WriteAccess = v8 != 0;
FileObject->DeleteAccess = v9 != 0;
FileObjectExtension = FileObject->FileObjectExtension;
v11 = FileObjectExtension && (*FileObjectExtension & 1) != 0;
if( v6 || v8 || v9 )
{
FileObject->SharedWrite = (v7 & 2) != 0;
FileObject->SharedRead = v7 & 1;
FileObject->SharedDelete = (v7 & 4) != 0;
if( (IoShareAccessFlags & 0x80000000) != 0 && (v7 & 1) == 0 )
FileObject->SharedRead = 1;
if( v11 )
{
SharedDelete = 0;
*(_QWORD *)&ShareAccess->OpenCount = 0i64;
*(_QWORD *)&ShareAccess->Writers = 0i64;
*(_QWORD *)&ShareAccess->SharedRead = 0i64;
}
else
{
ShareAccess->OpenCount = 1;
ShareAccess->Readers = FileObject->ReadAccess;
ShareAccess->Writers = FileObject->WriteAccess;
ShareAccess->Deleters = FileObject->DeleteAccess;
ShareAccess->SharedRead = FileObject->SharedRead;
ShareAccess->SharedWrite = FileObject->SharedWrite;
SharedDelete = FileObject->SharedDelete;
}
ShareAccess->SharedDelete = SharedDelete;
if( LinkShareAccess && !v11 )
{
++LinkShareAccess->OpenCount;
if( (IoShareAccessFlags & 0x80u) == 0 )
LinkShareAccess->Deleters += FileObject->DeleteAccess;
LinkShareAccess->SharedDelete += FileObject->SharedDelete;
}
}
else
{
*(_QWORD *)&ShareAccess->OpenCount = 0i64;
*(_QWORD *)&ShareAccess->Writers = 0i64;
*(_QWORD *)&ShareAccess->SharedRead = 0i64;
ShareAccess->SharedDelete = 0;
}
}Referenced by:
IoSetShareAccess
IoSetShareAccessEx
RawCreate