PfSnTraceGetLogEntry
__int64 __fastcall PfSnTraceGetLogEntry(__int64 a1, unsigned int a2, _QWORD *a3){
__int64 v6;
signed __int32 v7;
unsigned int v8;
VOID **v10;
unsigned __int64 v11;
VOID ***v12;
if( (signed __int32)(a2 + _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), a2)) > *(_DWORD *)(a1 + 340) )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), -a2);
if( !_InterlockedCompareExchange((volatile signed __int32 *)(a1 + 400), 3, 0) )
ExQueueWorkItem((PWORK_QUEUE_ITEM)(a1 + 368), DelayedWorkQueue);
return(unsigned int)-1073741431;
}
else
{
v6 = *(_QWORD *)(a1 + 96);
v7 = a2 + _InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 16), a2);
v8 = 0;
while( v7 > 0 )
{
if( v7 <= *(_DWORD *)(v6 + 20) )
{
*a3 = v6 + 16i64 * (int)(v7 - a2) + 24;
return v8;
}
_InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 16), -a2);
v10 = PfSnTraceBufferAllocate();
if( !v10 )
{
v8 = -1073741670;
goto LABEL_19;
}
v11 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 128));
if( *(_QWORD *)(a1 + 96) == v6 )
{
v12 = *(VOID ****)(a1 + 112);
if( *v12 != (VOID **)(a1 + 104) )
__fastfail(3u);
v10[1] = v12;
*v10 = (VOID *)(a1 + 104);
*v12 = v10;
*(_QWORD *)(a1 + 112) = v10;
++*(_DWORD *)(a1 + 120);
*(_QWORD *)(a1 + 96) = v10;
KxReleaseSpinLock((UINT64 *)(a1 + 128));
__writecr8(v11);
}
else
{
KxReleaseSpinLock((UINT64 *)(a1 + 128));
__writecr8(v11);
ExFreePoolWithTag(v10, 0);
}
v6 = *(_QWORD *)(a1 + 96);
v7 = a2 + _InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 16), a2);
}
v8 = -1073741675;
LABEL_19:
_InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), -a2);
}
return v8;
}Referenced by:
MiCompleteProtoPteFault
PfSnCheckLogSequenceNumber
PfSnLogHelper
PfSnLogIdentifier
PfSnLogPageFaultCommon
PfSnLogStreamDelete
PfSnTraceTimerRoutine