FsRtlAcquireEofLock
VOID __stdcall FsRtlAcquireEofLock(_FSRTL_EOF_LOCK *EofLock, INT64 a2){
_ETHREAD *CurrentThread;
__int64 v3;
unsigned __int64 v5;
__int64 v6;
char v7;
__int64 v8;
NTSTATUS SessionId;
bool v10;
unsigned __int8 CurrentIrql;
__int64 v12;
unsigned __int64 v13;
unsigned __int32 v14;
__int64 AbOrphanedEntrySummary;
UINT64 a3;
volatile signed __int32 *v18;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
LODWORD(a3) = 0;
v3 = *((_QWORD *)EofLock + 3);
v18 = (volatile signed __int32 *)a2;
v5 = *(_QWORD *)(v3 + 48);
--CurrentThread->Tcb.SpecialApcDisable;
if( ++CurrentThread->Tcb.AbAllocationRegionCount != 1 )
KeBugCheckEx(0x192u, CurrentThread, (PVOID)v5, (PVOID)KeGetCurrentIrql(), 0i64);
LOBYTE(v6) = CurrentThread->Tcb.AbEntrySummary;
if( !(_BYTE)v6 )
{
if( !CurrentThread->Tcb.AbOrphanedEntrySummary )
{
v8 = 0i64;
goto LABEL_29;
}
AbOrphanedEntrySummary = CurrentThread->Tcb.AbOrphanedEntrySummary;
CurrentThread->Tcb.AbOrphanedEntrySummary = 0;
LOBYTE(v6) = AbOrphanedEntrySummary | CurrentThread->Tcb.AbEntrySummary;
}
v7 = v6;
_BitScanForward((unsigned int *)&v6, (unsigned __int8)v6);
CurrentThread->Tcb.AbEntrySummary = v7 & ~(1 << v6);
v8 = (__int64)&CurrentThread->Tcb.LockEntries[v6];
if( !v8 )
{
LABEL_29:
_interlockedbittestandset((volatile signed __int32 *)&CurrentThread->Tcb.116 + 1, 0x10u);
goto LABEL_7;
}
if( MiGetSystemRegionType(v5) == 1 )
SessionId = MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
else
SessionId = -1;
*(_DWORD *)(v8 + 40) = SessionId;
*(_QWORD *)(v8 + 32) = v5 & 0x7FFFFFFFFFFFFFFCi64;
LABEL_7:
--CurrentThread->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&CurrentThread->Tcb, (VOID *)v5, &a3);
v10 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
if( v10
&& ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
{
KiCheckForKernelApcDelivery();
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
if( !_interlockedbittestandreset((volatile signed __int32 *)v5, 0) )
ExpAcquireFastMutexContended((_FAST_MUTEX *)v5, (VOID *)v8);
if( v8 )
*(_BYTE *)(v8 + 26) |= 1u;
*(_QWORD *)(v5 + 8) = KeGetCurrentThread();
*(_DWORD *)(v5 + 48) = CurrentIrql;
if( v18 )
_InterlockedIncrement(v18);
if( *(_ETHREAD **)EofLock == CurrentThread )
{
++*((_WORD *)EofLock + 19);
}
else if( *(_QWORD *)EofLock )
{
FsRtlpWaitForIoAtEof(EofLock, (INT64 *)a2, -1i64);
}
else
{
*(_QWORD *)EofLock = CurrentThread;
*((_WORD *)EofLock + 19) = 1;
}
if( a2 )
_InterlockedIncrement((volatile signed __int32 *)a2);
v12 = *(_QWORD *)(*((_QWORD *)EofLock + 3) + 48i64);
v13 = *(unsigned __int8 *)(v12 + 48);
*(_QWORD *)(v12 + 8) = 0i64;
v14 = _InterlockedCompareExchange((volatile signed __int32 *)v12, 1, 0);
if( v14 )
ExpReleaseFastMutexContended((_FAST_MUTEX *)v12, v14);
__writecr8(v13);
KeAbPostRelease((VOID *)v12);
}Referenced by:
No references.