IopWaitAndAcquireFileObjectLock
INT64 __stdcall IopWaitAndAcquireFileObjectLock(PVOID Object, INT64 a2){
UINT8 v2;
_BYTE *v3;
_BYTE *v4;
UINT8 v5;
INT8 v6;
NTSTATUS v8;
_BYTE *v9;
UINT64 Flags;
void *Thread[5];
INT64 BoostPriority;
__int64 v14;
v4 = v3;
v5 = v2;
v6 = a2;
_InterlockedIncrement((volatile signed __int32 *)Object + 28);
do
{
if( !*((_DWORD *)Object + 29) && !_InterlockedExchange((volatile __int32 *)Object + 29, 1) )
{
if( v4 )
v4[26] |= 1u;
ObfReferenceObject(Object);
_InterlockedDecrement((volatile signed __int32 *)Object + 28);
return 0;
}
if( v4 )
KeAbPreWait(v4);
v8 = IopWaitForLockAlertable((char *)Object + 128, v6, v5);
if( v4 )
{
LODWORD(v9) = KeAbPreAcquire((char *)Object + 128, v4, 0i64);
v4 = v9;
}
}
while( v8 >= 0 );
_InterlockedDecrement((volatile signed __int32 *)Object + 28);
if( !*((_DWORD *)Object + 29) && *((_DWORD *)Object + 28) )
{
LOBYTE(Flags) = 0;
LODWORD(BoostPriority) = *((char *)KeGetCurrentThread() + 195);
KeSetEventBoostPriorityEx(
(_KEVENT *)((char *)Object + 128),
(_KTHREAD **)Thread,
&BoostPriority,
(char *)Object + 128,
Flags);
}
if( v4 )
KeAbPostReleaseEx((char *)Object + 128, v4);
*(_BYTE *)v14 = 1;
KeLeaveCriticalRegion();
return(unsigned int)v8;
}Referenced by:
BuildQueryDirectoryIrp
IoSetInformation
IopCloseFile
IopGetSetSecurityObject
IopQueryXxxInformation
IopSetEaOrQuotaInformationFile
IopXxxControlFile
NtFlushBuffersFileEx
NtLockFile
NtNotifyChangeDirectoryFileEx
NtQueryEaFile
NtQueryInformationFile
NtQueryQuotaInformationFile
NtQueryVolumeInformationFile
NtReadFile
NtReadFileScatter
NtSetEaFile
NtSetInformationFile
NtSetVolumeInformationFile
NtUnlockFile
NtWriteFile
NtWriteFileGather