PfSnPrefetchSections

__int64 __fastcall PfSnPrefetchSections(__int64 *a1, WORK_QUEUE_TYPE a2, EVENT_DESCRIPTOR *a3, __int64 a4, __int64 a5){
  int v5; 
  __int64 *v6; 
  __int64 v7; 
  WORK_QUEUE_TYPE v8; 
  __int64 v9; 
  unsigned int v10; 
  __int64 v11; 
  unsigned int v12; 
  INT64 v13; 
  int v14; 
  unsigned int *v15; 
  WORK_QUEUE_TYPE v16; 
  __int64 v17; 
  INT64 v18; 
  EVENT_DESCRIPTOR *v19; 
  NTSTATUS v20; 
  unsigned int v21; 
  __int64 v23; 
  char v24; 
  __int16 v25; 
  int v26; 
  __int16 v27; 
  int v28; 
  WORK_QUEUE_TYPE QueueType; 
  unsigned int v30; 
  int v31; 
  WORK_QUEUE_TYPE v32; 
  int v33; 
  WORK_QUEUE_TYPE v34; 
  unsigned int v35; 
  UINT64 v36; 
  KSPIN_LOCK SpinLock[2]; 
  UINT64 NumberOfLists[2]; 
  __int128 v39; 
  __int64 *v40; 
  _READ_LIST **ReadLists; 
  __int64 v42; 
  EVENT_DATA_DESCRIPTOR UserData; 
  __int64 v44; 
  int v45; 
  int v46; 
  __int64 v47; 
  __int64 v48; 
  __int64 v49; 
  __int64 v50; 
  int *v51; 
  __int64 v52; 
  WORK_QUEUE_TYPE *p_QueueType; 
  __int64 v54; 
  char *v55; 
  __int64 v56; 
  EVENT_DATA_DESCRIPTOR v57; 
  __int64 v58; 
  int v59; 
  int v60; 
  __int64 v61; 
  __int64 v62; 
  __int64 v63; 
  __int64 v64; 
  int *v65; 
  __int64 v66; 
  int *v67; 
  __int64 v68; 
  __int16 *v69; 
  __int64 v70; 
  __int64 *v71; 
  __int64 v72; 
  int *v73; 
  __int64 v74; 
  v5 = 0;
  v40 = a1;
  v32 = a2;
  v6 = a1;
  v30 = 0;
  v7 = -1i64;
  v28 = (int)a3;
  v8 = a2;
  v36 = a5;
  v9 = *a1;
  v10 = 0;
  v24 = 0;
  v11 = v9;
  QueueType = a2;
  v31 = (int)a3;
  *(_OWORD *)SpinLock = 0i64;
  *(_OWORD *)NumberOfLists = 0i64;
  v39 = 0i64;
  if( v9 && RegHandle && EtwEventEnabled(RegHandle, (EVENT_DESCRIPTOR *)&PfSnEvt_PrefetchSections_Start, a3) )
  {
    v23 = -1i64;
    do
      ++v23;
    while( *(_WORD *)(v9 + 16 + 2 * v23) );
    LOWORD(v26) = v23;
    UserData.Ptr = (unsigned __int64)&v26;
    v45 = 2 * (unsigned __int16)v23;
    v44 = v9 + 16;
    v47 = v9 + 76;
    v49 = v9 + 80;
    v51 = &v31;
    p_QueueType = &QueueType;
    v55 = &v24;
    *(_QWORD *)&UserData.Size = 2i64;
    v46 = 0;
    v48 = 4i64;
    v50 = 4i64;
    v52 = 4i64;
    v54 = 4i64;
    v56 = 1i64;
    EtwWrite(RegHandle, (EVENT_DESCRIPTOR *)&PfSnEvt_PrefetchSections_Start, 0i64, 7ui64, &UserData);
    v11 = *v6;
  }
  if( v28 >= 1 << *(_DWORD *)(v11 + 124) )
    goto LABEL_33;
  if( v8 == CriticalWorkQueue )
    goto LABEL_8;
  if( v8 != DelayedWorkQueue )
  {
LABEL_33:
    v20 = -1073741811;
    goto LABEL_24;
  }
  v5 = 1;
LABEL_8:
  v12 = *(_DWORD *)(v9 + 88);
  ReadLists = (_READ_LIST **)v6[8];
  memset((INT64)ReadLists, 0i64);
  v13 = v6[11];
  memset(v13, 0i64);
  ExInitializePushLock((EX_RUNDOWN_REF *)SpinLock);
  NumberOfLists[0] = v36;
  SpinLock[1] = (KSPIN_LOCK)v6;
  LODWORD(v39) = v12;
  QueueType = KeQueryPriorityThread(KeGetCurrentThread()) + 32;
  if( v12 > 0x20 )
    v12 = 32;
  PfSnLogGetReadListsStart((_DEVICE_OBJECT *)v9, (PVOID)v12);
  if( v12 )
  {
    v14 = v28;
    v15 = (unsigned int *)(v13 + 44);
    v16 = QueueType;
    v17 = v12;
    do
    {
      *(v15 - 1) = v14;
      *(_QWORD *)(v15 - 3) = SpinLock;
      *v15 = v5 | *v15 & 0xFFFFFFFE;
      *(_QWORD *)(v15 - 11) = 0i64;
      *(_QWORD *)(v15 - 7) = PfSnPopulateReadList;
      *(_QWORD *)(v15 - 5) = v15 - 11;
      ExAcquireRundownProtection((PEX_RUNDOWN_REF)SpinLock);
      ExQueueWorkItem((WORK_QUEUE_ITEM *)(v15 - 11), v16);
      v15 += 12;
      --v17;
    }
    while( v17 );
    v8 = v32;
    v7 = -1i64;
    v6 = v40;
  }
  ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)SpinLock);
  PfSnLogGetReadListsStop(v9, v18, v19);
  v10 = NumberOfLists[1];
  v20 = DWORD2(v39);
  if( (SDWORD2(v39) & 0x80000000) == 0 )
  {
    v30 = DWORD1(v39);
    if( !LODWORD(NumberOfLists[1]) )
    {
      v20 = 0;
      goto LABEL_24;
    }
    if( DWORD1(v39) )
    {
      v20 = MmPrefetchPagesEx(LODWORD(NumberOfLists[1]), ReadLists, (UINT64 *)v6 + 13);
      if( v20 >= 0 && !v6[13] )
        v20 = -2147483622;
    }
    else
    {
      v20 = -1073741823;
    }
  }
  if( v10 )
  {
    v21 = v10;
    if( v10 > 0x20 )
      v21 = 32;
    PfSnPrefetchSectionsCleanup((KSPIN_LOCK)v6, v10, v21, v36);
  }
LABEL_24:
  v33 = v28;
  v42 = v30;
  v35 = v10;
  LOBYTE(v25) = 0;
  v34 = v8;
  if( v9 && RegHandle && EtwEventEnabled(RegHandle, (EVENT_DESCRIPTOR *)&PfSnEvt_PrefetchSections_Stop, a3) )
  {
    do
      ++v7;
    while( *(_WORD *)(v9 + 16 + 2 * v7) );
    v58 = v9 + 16;
    v57.Ptr = (unsigned __int64)&v27;
    v27 = v7;
    v59 = 2 * (unsigned __int16)v7;
    *(_QWORD *)&v57.Size = 2i64;
    v61 = v9 + 76;
    v63 = v9 + 80;
    v65 = &v33;
    v67 = (int *)&v34;
    v69 = &v25;
    v71 = &v42;
    v73 = (int *)&v35;
    v60 = 0;
    v62 = 4i64;
    v64 = 4i64;
    v66 = 4i64;
    v68 = 4i64;
    v70 = 1i64;
    v72 = 8i64;
    v74 = 4i64;
    EtwWrite(RegHandle, (EVENT_DESCRIPTOR *)&PfSnEvt_PrefetchSections_Stop, 0i64, 9ui64, &v57);
  }
  return(unsigned int)v20;
}

Referenced by:

PfSnAsyncPrefetchStep