PfTCleanup

VOID __fastcall PfTCleanup(INT64 a1, INT64 a2){
  char v3; 
  __int64 v4; 
  UINT64 v5; 
  PSLIST_ENTRY v6; 
  PSLIST_ENTRY v7; 
  UINT64 v8; 
  struct _DMA_ADAPTER *v9; 
  PLARGE_INTEGER Timeout; 
  LIST_ENTRY FreeList; 
  FreeList.Blink = &FreeList;
  v3 = 0;
  FreeList.Flink = &FreeList;
  if( KeGetCurrentThread() == *(struct _KTHREAD **)(a1 + 104) )
    v3 = 1;
  PfTAccessTracingCleanup(a1, a2, 1);
  ExAcquireFastMutex((FAST_MUTEX *)(a1 + 560));
  *(_DWORD *)(a1 + 540) = 0;
  *(_DWORD *)(a1 + 548) = 0;
  PfTTraceListTrim(0, 0, (__int64)&FreeList);
  PfTTraceListTrim(1, 0, (__int64)&FreeList);
  *(_DWORD *)(a1 + 552) = 0;
  PfTAccessTracingCleanup(a1, v4, 2);
  KeReleaseGuardedMutex((_FAST_MUTEX *)(a1 + 560));
  PfTTraceListFree(&FreeList);
  *(_DWORD *)(a1 + 496) = 0;
  v6 = RtlpInterlockedFlushSList((PSLIST_HEADER)(a1 + 480));
  while( v6 )
  {
    v7 = v6;
    LODWORD(Timeout) = 1;
    v6 = v6->Next;
    PfFbBufferListInsertInFree(
      (SLIST_ENTRY *)(a1 + 352),
      v7,
      (unsigned int)(LODWORD(v7[2].Next) - (_DWORD)v7),
      *((unsigned int *)&v7[2].Next + 3),
      (INT64)Timeout);
  }
  PfFbBufferListShutdown((EX_RUNDOWN_REF *)(a1 + 224), v5);
  PfFbBufferListShutdown((EX_RUNDOWN_REF *)(a1 + 352), v8);
  if( !v3 && *(_QWORD *)(a1 + 104) )
  {
    KeSetEvent((PRKEVENT)(a1 + 200), 0);
    KeWaitForSingleObject(*(PVOID *)(a1 + 104), Executive, 0, 0, 0i64);
    HalPutDmaAdapter(*(PADAPTER_OBJECT *)(a1 + 104));
    *(_QWORD *)(a1 + 104) = 0i64;
  }
  PfTCleanupBuffers((INT64)&qword_140C4F918);
  PfTCleanupBuffers((INT64)&qword_140C4F940);
  PfFbBufferListCleanup(a1 + 224);
  PfFbBufferListCleanup(a1 + 352);
  v9 = *(struct _DMA_ADAPTER **)(a1 + 616);
  if( v9 )
  {
    HalPutDmaAdapter(v9);
    *(_QWORD *)(a1 + 616) = 0i64;
  }
  *(_DWORD *)(a1 + 8) = 0;
}

Referenced by:

PfSetSuperfetchInformation
PfTStart
PfpParametersPropagate