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