PfSnPrefetchSections

NTSTATUS __stdcall PfSnPrefetchSections(
        PFSN_PREFETCH_HEADER *PrefetchHeader,
        PFSN_PREFETCH_TYPE PrefetchType,
        UINT64 PrefetchPhaseMask,
        _EPROCESS *Process){
  int v4; 
  PFSN_PREFETCH_HEADER *v5; 
  __int64 v6; 
  PFSN_PREFETCH_TYPE v7; 
  __int64 v8; 
  unsigned int v9; 
  __int64 v10; 
  unsigned int v11; 
  unsigned int *v12; 
  int v13; 
  int v14; 
  unsigned int *v15; 
  _WORK_QUEUE_TYPE v16; 
  __int64 v17; 
  NTSTATUS v18; 
  int v19; 
  UINT64 v20; 
  __int64 v22; 
  char v23; 
  __int16 v24; 
  int v25; 
  __int16 v26; 
  int v27; 
  _WORK_QUEUE_TYPE QueueType; 
  unsigned int v29; 
  int v30; 
  PFSN_PREFETCH_TYPE v31; 
  int v32; 
  PFSN_PREFETCH_TYPE v33; 
  unsigned int v34; 
  _EPROCESS *Processa; 
  unsigned __int64 PushLock[2]; 
  UINT64 NumberOfLists[2]; 
  __int128 v38; 
  PFSN_PREFETCH_HEADER *v39; 
  _READ_LIST **ReadLists; 
  __int64 v41; 
  _EVENT_DATA_DESCRIPTOR UserData; 
  __int64 v43; 
  int v44; 
  int v45; 
  __int64 v46; 
  __int64 v47; 
  __int64 v48; 
  __int64 v49; 
  int *v50; 
  __int64 v51; 
  _WORK_QUEUE_TYPE *p_QueueType; 
  __int64 v53; 
  char *v54; 
  __int64 v55; 
  _EVENT_DATA_DESCRIPTOR v56; 
  __int64 v57; 
  int v58; 
  int v59; 
  __int64 v60; 
  __int64 v61; 
  __int64 v62; 
  __int64 v63; 
  int *v64; 
  __int64 v65; 
  int *v66; 
  __int64 v67; 
  __int16 *v68; 
  __int64 v69; 
  __int64 *v70; 
  __int64 v71; 
  int *v72; 
  __int64 v73; 
  _EPROCESS *v74; 

  v4 = 0;
  v39 = PrefetchHeader;
  v31 = PrefetchType;
  v5 = PrefetchHeader;
  v29 = 0;
  v6 = -1i64;
  v27 = PrefetchPhaseMask;
  v7 = PrefetchType;
  Processa = v74;
  v8 = *(_QWORD *)PrefetchHeader;
  v9 = 0;
  v23 = 0;
  v10 = v8;
  QueueType = PrefetchType;
  v30 = PrefetchPhaseMask;
  *(_OWORD *)PushLock = 0i64;
  *(_OWORD *)NumberOfLists = 0i64;
  v38 = 0i64;
  if( v8 && qword_140C50288 && EtwEventEnabled(qword_140C50288, &PfSnEvt_PrefetchSections_Start) )
  {
    v22 = -1i64;
    do
      ++v22;
    while( *(_WORD *)(v8 + 16 + 2 * v22) );
    LOWORD(v25) = v22;
    UserData.Ptr = (unsigned __int64)&v25;
    v44 = 2 * (unsigned __int16)v22;
    v43 = v8 + 16;
    v46 = v8 + 76;
    v48 = v8 + 80;
    v50 = &v30;
    p_QueueType = &QueueType;
    v54 = &v23;
    *(_QWORD *)&UserData.Size = 2i64;
    v45 = 0;
    v47 = 4i64;
    v49 = 4i64;
    v51 = 4i64;
    v53 = 4i64;
    v55 = 1i64;
    EtwWrite(qword_140C50288, &PfSnEvt_PrefetchSections_Start, 0, 7u, &UserData);
    v10 = *(_QWORD *)v5;
  }
  if( v27 >= 1 << *(_DWORD *)(v10 + 124) )
    goto LABEL_33;
  if( v7 == PfSnPrefetchDataPages )
    goto LABEL_8;
  if( v7 != PfSnPrefetchImagePages )
  {
LABEL_33:
    v18 = -1073741811;
    goto LABEL_24;
  }
  v4 = 1;
LABEL_8:
  v11 = *(_DWORD *)(v8 + 88);
  ReadLists = (_READ_LIST **)*((_QWORD *)v5 + 8);
  memset(ReadLists, 0i64, 8 * v11);
  v12 = (unsigned int *)*((_QWORD *)v5 + 11);
  memset(v12, 0i64, 0x600u);
  ExInitializePushLock(PushLock);
  NumberOfLists[0] = (UINT64)Processa;
  PushLock[1] = (unsigned __int64)v5;
  LODWORD(v38) = v11;
  KeQueryPriorityThread((_ETHREAD *)KeGetCurrentThread());
  QueueType = v13 + 32;
  if( v11 > 0x20 )
    v11 = 32;
  PfSnLogGetReadListsStart(v8, v11);
  if( v11 )
  {
    v14 = v27;
    v15 = v12 + 11;
    v16 = QueueType;
    v17 = v11;
    do
    {
      *(v15 - 1) = v14;
      *(_QWORD *)(v15 - 3) = PushLock;
      *v15 = v4 | *v15 & 0xFFFFFFFE;
      *(_QWORD *)(v15 - 11) = 0i64;
      *(_QWORD *)(v15 - 7) = PfSnPopulateReadList;
      *(_QWORD *)(v15 - 5) = v15 - 11;
      ExAcquireRundownProtection((_EX_RUNDOWN_REF *)PushLock);
      ExQueueWorkItem((PWORK_QUEUE_ITEM)(v15 - 11), v16);
      v15 += 12;
      --v17;
    }
    while( v17 );
    v7 = v31;
    v6 = -1i64;
    v5 = v39;
  }
  ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)PushLock);
  PfSnLogGetReadListsStop(v8);
  v9 = NumberOfLists[1];
  v18 = DWORD2(v38);
  if( (SDWORD2(v38) & 0x80000000) == 0 )
  {
    v29 = DWORD1(v38);
    if( !LODWORD(NumberOfLists[1]) )
    {
      v18 = 0;
      goto LABEL_24;
    }
    if( DWORD1(v38) )
    {
      MmPrefetchPagesEx(LODWORD(NumberOfLists[1]), ReadLists, (UINT64 *)v5 + 13);
      v18 = v19;
      if( v19 >= 0 && !*((_QWORD *)v5 + 13) )
        v18 = -2147483622;
    }
    else
    {
      v18 = -1073741823;
    }
  }
  if( v9 )
  {
    v20 = v9;
    if( v9 > 0x20 )
      v20 = 32i64;
    PfSnPrefetchSectionsCleanup(v5, v9, v20, Processa);
  }
LABEL_24:
  v32 = v27;
  v41 = v29;
  v34 = v9;
  LOBYTE(v24) = 0;
  v33 = v7;
  if( v8 && qword_140C50288 && EtwEventEnabled(qword_140C50288, &PfSnEvt_PrefetchSections_Stop) )
  {
    do
      ++v6;
    while( *(_WORD *)(v8 + 16 + 2 * v6) );
    v57 = v8 + 16;
    v56.Ptr = (unsigned __int64)&v26;
    v26 = v6;
    v58 = 2 * (unsigned __int16)v6;
    *(_QWORD *)&v56.Size = 2i64;
    v60 = v8 + 76;
    v62 = v8 + 80;
    v64 = &v32;
    v66 = (int *)&v33;
    v68 = &v24;
    v70 = &v41;
    v72 = (int *)&v34;
    v59 = 0;
    v61 = 4i64;
    v63 = 4i64;
    v65 = 4i64;
    v67 = 4i64;
    v69 = 1i64;
    v71 = 8i64;
    v73 = 4i64;
    EtwWrite(qword_140C50288, &PfSnEvt_PrefetchSections_Stop, 0, 9u, &v56);
  }
  return v18;
}

Referenced by:

PfSnAsyncPrefetchStep