PfpFlushBuffers

UINT8 __stdcall PfpFlushBuffers(){
  _MM_PAGE_ACCESS_INFO_HEADER *v0; 
  _MM_PAGE_ACCESS_INFO *v1; 
  _MM_PAGE_ACCESS_INFO_HEADER *v2; 
  _MM_PAGE_ACCESS_INFO_HEADER *Next; 
  _MM_PAGE_ACCESS_INFO_HEADER **v4; 
  _MM_PAGE_ACCESS_INFO_HEADER *v5; 
  _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; 
  _MM_PAGE_ACCESS_INFO *PageEntry; 
  unsigned __int64 FileOffset; 
  __int64 v18; 
  unsigned __int64 *v19; 
  unsigned __int64 v20; 
  _MM_PAGE_ACCESS_INFO_HEADER *v21; 
  NTSTATUS v22; 
  __int128 v23; 
  __int128 v24; 
  __int128 v25; 
  __int64 Src; 
  int v27; 
  __int64 v28; 
  int v29; 

  v23 = 0i64;
  DWORD2(v23) = 1;
  v0 = 0i64;
  v25 = 0i64;
  v1 = 0i64;
  v2 = 0i64;
  v24 = 0i64;
  v22 = PfpFlushEventBuffers();
  if( v22 < 0 )
    return 0;
  RtlpInterlockedFlushSList();
  if( !Next )
  {
LABEL_16:
    v14 = v22;
    goto LABEL_17;
  }
  do
  {
    v4 = (_MM_PAGE_ACCESS_INFO_HEADER **)Next;
    v5 = v0;
    Next = (_MM_PAGE_ACCESS_INFO_HEADER *)Next->Link.Next;
    *v4 = v0;
    v0 = (_MM_PAGE_ACCESS_INFO_HEADER *)v4;
  }
  while( Next );
  while( 1 )
  {
    v6 = v0;
    v28 = 0i64;
    v7 = v0;
    v0 = v5;
    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
      || (*((_QWORD *)&v24 + 1) = v6->EmptySequenceNumber,
          *(_QWORD *)&v24 = 94215i64,
          PfpCopyEvent(&v24),
          v6->Type > MmCcReadAheadType) )
    {
      PageEntry = v6->PageEntry;
      if( (unsigned __int64 *)PageEntry <= v6->FileEntry )
      {
        while( 1 )
        {
          FileOffset = PageEntry->FileOffset;
          v22 = 0;
          v18 = PfTAcquireLogEntry((_PFP_BUFFER_MANAGER *)&stru_140C4DB30 + 319, &v22, 1);
          if( !v18 )
            break;
          v19 = (unsigned __int64 *)(16i64 * (unsigned int)v22 + ((v18 + 31) & 0xFFFFFFFFFFFFFFF8ui64));
          v20 = *v19 & 0xFFFFFFFFFFFC6007ui64;
          v19[1] = FileOffset;
          *v19 = v20 | 0x6007;
          ++PageEntry;
          v22 = 0;
          if( (unsigned __int64 *)PageEntry > v6->FileEntry )
            goto LABEL_13;
        }
        v22 = -1073741670;
        v6->PageEntry = PageEntry;
      }
      goto LABEL_12;
    }
    Process = (__int64)v6->Process;
    FirstFileEntry = (__int64)v6->FirstFileEntry;
    if( Process == 1 )
    {
      Process = v6->SessionId + 1;
    }
    else if( Process && !(unsigned int)PfpIsProcessInfoPresent(v6->Process) )
    {
      goto LABEL_14;
    }
    v2 = v6 + 1;
    v1 = (_MM_PAGE_ACCESS_INFO *)&v6[1];
    if( (_MM_PAGE_ACCESS_INFO *)&v6[1] < v6->PageEntry )
      break;
LABEL_12:
    if( v22 < 0 )
    {
      v14 = v22;
      goto LABEL_28;
    }
LABEL_13:
    EmptyTime = (unsigned int)v6->EmptyTime;
    EmptyTime_high = HIDWORD(v6->EmptyTime);
    *(_QWORD *)&v25 = 147463i64;
    *((_QWORD *)&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, 0);
    if( !v5 )
      goto LABEL_16;
    v5 = (_MM_PAGE_ACCESS_INFO_HEADER *)v5->Link.Next;
  }
  while( PfpLogPageAccess(Process, v1, &v23, FirstFileEntry, 0) )
  {
    if( ++v1 >= v6->PageEntry )
      goto LABEL_12;
  }
  v14 = -1073741432;
LABEL_28:
  if( v6->Type <= MmCcReadAheadType )
  {
    memmove(v2, v1, (LODWORD(v6->PageEntry) - (_DWORD)v1) & 0xFFFFFFF8);
    v6->PageEntry -= ((char *)v1 - (char *)v2) >> 3;
  }
  PfpReturnAccessBuffer(v6);
LABEL_17:
  if( v14 >= 0 )
    return 1;
  while( v0 )
  {
    v21 = v0;
    v0 = (_MM_PAGE_ACCESS_INFO_HEADER *)v0->Link.Next;
    PfpReturnAccessBuffer(v21);
  }
  return 0;
}

Referenced by:

PfTLoggingWorker