PfSnPrefetchSectionsCleanup

VOID __stdcall PfSnPrefetchSectionsCleanup(
        _PFSN_PREFETCH_HEADER *PrefetchHeader,
        UINT64 NumReadLists,
        UINT64 NumWorkItems,
        _EPROCESS *Process){
  _WORK_QUEUE_ITEM *v4; 
  int v5; 
  int v6; 
  __int64 v8; 
  int v10; 
  int v11; 
  _QWORD *p_WorkerRoutine; 
  unsigned __int64 PushLock[2]; 
  __int128 v14; 
  __int128 v15; 

  v4 = (_WORK_QUEUE_ITEM *)*((_QWORD *)PrefetchHeader + 11);
  v5 = NumReadLists;
  v6 = NumWorkItems;
  v8 = (unsigned int)NumWorkItems;
  memset(v4, 0i64, 48 * NumWorkItems);
  *(_OWORD *)PushLock = 0i64;
  v14 = 0i64;
  v15 = 0i64;
  ExInitializePushLock(PushLock);
  PushLock[1] = (unsigned __int64)PrefetchHeader;
  LODWORD(v15) = v5;
  *(_QWORD *)&v14 = Process;
  KeQueryPriorityThread((_ETHREAD *)KeGetCurrentThread());
  v11 = v10;
  if( v6 )
  {
    p_WorkerRoutine = &v4->WorkerRoutine;
    do
    {
      p_WorkerRoutine[2] = PushLock;
      *(p_WorkerRoutine - 2) = 0i64;
      *p_WorkerRoutine = PfSnSectionInfoCleanupWorkItem;
      p_WorkerRoutine[1] = v4;
      ExAcquireRundownProtection((_EX_RUNDOWN_REF *)PushLock);
      ExQueueWorkItem(v4, (_WORK_QUEUE_TYPE)(v11 + 32));
      v4 = (_WORK_QUEUE_ITEM *)((char *)v4 + 48);
      p_WorkerRoutine += 6;
      --v8;
    }
    while( v8 );
  }
  ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)PushLock);
}

Referenced by:

PfSnPrefetchSections