PfpFlushBuffers
INT64 __fastcall PfpFlushBuffers(){
_MM_PAGE_ACCESS_INFO_HEADER *v0;
UINT8 *v1;
UINT8 *v2;
INT64 result;
_MM_PAGE_ACCESS_INFO_HEADER *v4;
_MM_PAGE_ACCESS_INFO_HEADER *Next;
_MM_PAGE_ACCESS_INFO_HEADER *v6;
_MM_PAGE_ACCESS_INFO_HEADER *v7;
unsigned __int64 v8;
unsigned __int64 v9;
INT64 Process;
INT64 FirstFileEntry;
__int64 EmptyTime;
unsigned __int64 EmptyTime_high;
int v14;
unsigned __int64 *PageFrameEntry;
unsigned __int64 v16;
__int64 v17;
unsigned __int64 *v18;
unsigned __int64 v19;
struct _SLIST_ENTRY *v20;
INT64 a5;
unsigned int v22;
_BYTE a3[16];
INT64 v24[2];
INT64 v25[2];
INT64 Src;
int v27;
__int64 v28;
int v29;
*(_OWORD *)a3 = 0i64;
*(_DWORD *)&a3[8] = 1;
v0 = 0i64;
*(_OWORD *)v25 = 0i64;
v1 = 0i64;
v2 = 0i64;
*(_OWORD *)v24 = 0i64;
result = PfpFlushEventBuffers();
v22 = result;
if( (int)result < 0 )
goto LABEL_26;
result = (INT64)RtlpInterlockedFlushSList((PSLIST_HEADER)&word_140CEBEC0);
if( !result )
{
LABEL_16:
v14 = v22;
goto LABEL_17;
}
do
{
v4 = (_MM_PAGE_ACCESS_INFO_HEADER *)result;
Next = v0;
result = *(_QWORD *)result;
v4->Link.Next = &v0->Link;
v0 = v4;
}
while( result );
while( 1 )
{
v6 = v0;
v28 = 0i64;
v7 = v0;
v0 = Next;
v8 = KUSER_SHARED_DATA.TickCountMultiplier * HIDWORD(v6->EmptyTime);
v9 = (KUSER_SHARED_DATA.TickCountMultiplier * (unsigned __int64)(unsigned int)v6->EmptyTime) >> 24;
HIDWORD(v28) = dword_140C5001C
+ ((((KUSER_SHARED_DATA.TickCountMultiplier * HIDWORD(v6->CreateTime)) << 8)
+ ((KUSER_SHARED_DATA.TickCountMultiplier * (unsigned __int64)(unsigned int)v6->CreateTime) >> 24)) >> 10);
v27 = HIDWORD(v28);
v29 = dword_140C5001C + (((v8 << 8) + v9) >> 10);
Src = 163851i64;
PfpCopyEvent(&Src);
if( v6->Type > MmCcReadAheadType
|| (v24[1] = v6->EmptySequenceNumber, v24[0] = 94215i64, PfpCopyEvent(v24), v6->Type > MmCcReadAheadType) )
{
PageFrameEntry = v6->PageFrameEntry;
if( PageFrameEntry <= v6->FileEntry )
{
while( 1 )
{
v16 = *PageFrameEntry;
v22 = 0;
v17 = PfTAcquireLogEntry((__int64)&qword_140C4F918, &v22, 1);
if( !v17 )
break;
v18 = (unsigned __int64 *)(16i64 * v22 + ((v17 + 31) & 0xFFFFFFFFFFFFFFF8ui64));
v19 = *v18 & 0xFFFFFFFFFFFC6007ui64;
v18[1] = v16;
*v18 = v19 | 0x6007;
++PageFrameEntry;
v22 = 0;
if( PageFrameEntry > v6->FileEntry )
goto LABEL_13;
}
v22 = -1073741670;
v6->PageEntry = (_MM_PAGE_ACCESS_INFO *)PageFrameEntry;
}
goto LABEL_12;
}
Process = (INT64)v6->Process;
FirstFileEntry = (INT64)v6->FirstFileEntry;
if( Process == 1 )
{
Process = v6->SessionId + 1;
}
else if( Process && !PfpIsProcessInfoPresent((__int64)v6->Process) )
{
goto LABEL_14;
}
v2 = (UINT8 *)&v6[1];
v1 = (UINT8 *)&v6[1];
if( (_MM_PAGE_ACCESS_INFO *)&v6[1] < v6->PageEntry )
break;
LABEL_12:
if( (v22 & 0x80000000) != 0 )
{
v14 = v22;
goto LABEL_28;
}
LABEL_13:
EmptyTime = (unsigned int)v6->EmptyTime;
EmptyTime_high = HIDWORD(v6->EmptyTime);
v25[0] = 147463i64;
v25[1] = dword_140C5001C
+ (unsigned int)((((KUSER_SHARED_DATA.TickCountMultiplier * EmptyTime_high) << 8)
+ (((unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier * EmptyTime) >> 24)) >> 10);
PfpCopyEvent(v25);
LABEL_14:
MmFreeAccessPfnBuffer(v7, 0i64);
if( !Next )
goto LABEL_16;
Next = (_MM_PAGE_ACCESS_INFO_HEADER *)Next->Link.Next;
}
while( 1 )
{
LODWORD(a5) = 0;
if( !PfpLogPageAccess(Process, v1, a3, FirstFileEntry, a5) )
break;
v1 += 8;
if( (_MM_PAGE_ACCESS_INFO *)v1 >= v6->PageEntry )
goto LABEL_12;
}
v14 = -1073741432;
LABEL_28:
if( v6->Type <= MmCcReadAheadType )
{
memmove(v2, v1, (v6->PageEntry - (_MM_PAGE_ACCESS_INFO *)v1) & 0xFFFFFFFFFFFFFFF8ui64);
v6->PageEntry = (_MM_PAGE_ACCESS_INFO *)((char *)v6->PageEntry - 8 * ((v1 - v2) >> 3));
}
PfpReturnAccessBuffer((PSLIST_ENTRY)v6);
LABEL_17:
if( v14 >= 0 )
{
LOBYTE(result) = 1;
return result;
}
while( v0 )
{
v20 = (struct _SLIST_ENTRY *)v0;
v0 = (_MM_PAGE_ACCESS_INFO_HEADER *)v0->Link.Next;
PfpReturnAccessBuffer(v20);
}
LABEL_26:
LOBYTE(result) = 0;
return result;
}Referenced by:
PfTLoggingWorker