PfSnTraceGetLogEntry
INT64 __fastcall PfSnTraceGetLogEntry(INT64 a1, UINT64 a2, _QWORD *a3){
unsigned int v4;
__int64 v6;
int v7;
unsigned int v8;
UINT64 v10;
CHAR *v11;
unsigned __int8 v12;
unsigned __int64 v13;
CHAR **v14;
v4 = a2;
if( (int)a2 + _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), a2) > *(_DWORD *)(a1 + 340) )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), -(int)a2);
if( !_InterlockedCompareExchange((volatile signed __int32 *)(a1 + 400), 3, 0) )
ExQueueWorkItem((WORK_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 - v4) + 24;
return v8;
}
_InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 16), -v4);
v11 = PfSnTraceBufferAllocate();
if( !v11 )
{
v8 = -1073741670;
goto LABEL_19;
}
KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 128), v10);
v13 = v12;
if( *(_QWORD *)(a1 + 96) == v6 )
{
v14 = *(CHAR ***)(a1 + 112);
if( *v14 != (CHAR *)(a1 + 104) )
__fastfail(3u);
*((_QWORD *)v11 + 1) = v14;
*(_QWORD *)v11 = a1 + 104;
*v14 = v11;
*(_QWORD *)(a1 + 112) = v11;
++*(_DWORD *)(a1 + 120);
*(_QWORD *)(a1 + 96) = v11;
KxReleaseSpinLock((UINT64 *)(a1 + 128));
__writecr8(v13);
}
else
{
KxReleaseSpinLock((UINT64 *)(a1 + 128));
__writecr8(v13);
ExFreePoolWithTag(v11, 0);
}
v6 = *(_QWORD *)(a1 + 96);
v7 = v4 + _InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 16), v4);
}
v8 = -1073741675;
LABEL_19:
_InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), -v4);
}
return v8;
}Referenced by:
MiCompleteProtoPteFault
PfSnCheckLogSequenceNumber
PfSnLogHelper
PfSnLogIdentifier
PfSnLogPageFaultCommon
PfSnLogStreamDelete
PfSnTraceTimerRoutine