PfpPrefetchRequestPerform

INT64 __fastcall PfpPrefetchRequestPerform(INT64 rcx0){
  char v2; 
  VOID *PoolWithTag; 
  int v4; 
  int v5; 
  unsigned int v6; 
  _OWORD *v7; 
  unsigned int i; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  bool v12; 
  unsigned int v13; 
  int v14; 
  bool v15; 
  int v17; 
  _LIST_ENTRY *p_WaitListHead; 
  int v19; 
  unsigned int j; 
  __int64 v21; 
  char *v22; 
  int v23; 
  INT64 v24; 
  unsigned int k; 
  _QWORD *v26; 
  struct _KEVENT Event; 
  __int64 v28; 
  INT64 v29; 
  PVOID v30; 
  _OWORD *v31; 
  PVOID P; 
  __int64 v33; 
  INT64 a1; 
  v28 = 0i64;
  Event.Header.WaitListHead = 0i64;
  memset((INT64)&v30, 0i64);
  v29 = rcx0;
  KeInitializeEvent((_KEVENT *)&Event.Header.WaitListHead, NotificationEvent, 0);
  v2 = *((_BYTE *)KeGetCurrentThread() + 562);
  *((_BYTE *)KeGetCurrentThread() + 562) = 0;
  PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x90ui64, 0x43536650ui64);
  a1 = (INT64)PoolWithTag;
  if( !PoolWithTag )
  {
    v4 = -1073741670;
    goto LABEL_28;
  }
  PfpPrefetchSharedInitialize(PoolWithTag);
  *(_QWORD *)(a1 + 24) = &v29;
  if( (*(_DWORD *)(v29 + 80) & 4) != 0 )
  {
    *(_DWORD *)(a1 + 60) = 60000;
    *(_DWORD *)(a1 + 56) = 150;
  }
  else
  {
    *(_DWORD *)(a1 + 60) = 250;
    *(_DWORD *)(a1 + 56) = 15;
  }
  v4 = PfpPrefetchSharedStart(a1);
  if( v4 >= 0 )
  {
    v5 = *(unsigned __int8 *)(v29 + 81);
    if( *(_BYTE *)(v29 + 81) )
    {
      _InterlockedAdd(&dword_140CEBED8, 1u);
      p_WaitListHead = &Event.Header.WaitListHead;
      if( *(_QWORD *)(v29 + 72) )
        p_WaitListHead = *(_LIST_ENTRY **)(v29 + 72);
      v4 = PfpScenCtxPrefetchAbortSet((ULONG_PTR)&qword_140C50020, v5, (__int64)p_WaitListHead, 0, 0);
      if( v4 < 0 )
        goto LABEL_26;
      if( !*(_QWORD *)(v29 + 72) )
        *(_QWORD *)(v29 + 72) = &Event.Header.WaitListHead;
    }
    v6 = *(_DWORD *)(rcx0 + 8) << 6;
    if( v6 )
    {
      v7 = ExAllocatePoolWithTag(PagedPool, v6, 0x48566650ui64);
      v31 = v7;
      if( !v7 )
        goto LABEL_45;
      memset((INT64)v7, 0i64);
      for( i = 0; i < *(_DWORD *)(rcx0 + 8); *(_QWORD *)(v10 + v11 + 56) |= 0x200000000ui64 )
      {
        v9 = (__int64)v31;
        v10 = i++;
        v10 <<= 6;
        *(_OWORD *)((char *)v31 + v10) = 0i64;
        *(_OWORD *)(v10 + v9 + 16) = 0i64;
        *(_QWORD *)(v10 + v9 + 24) |= 0x200000000ui64;
        v11 = (__int64)v31;
        *(_OWORD *)((char *)v31 + v10 + 32) = 0i64;
        *(_OWORD *)(v10 + v11 + 48) = 0i64;
      }
    }
    v12 = (*(_DWORD *)(v29 + 80) & 4) != 0;
    LODWORD(v33) = v12 ? 16 : 768;
    P = ExAllocatePoolWithTag(PagedPool, (-(__int64)v12 & 0xFFFFFFFFFFFFE880ui64) + 6160, 0x504D6650ui64);
    if( P )
    {
      if( (*(_DWORD *)(v29 + 80) & 4) != 0 || (v19 = *(_DWORD *)(v29 + 12)) == 0 )
      {
LABEL_12:
        PfpPrefetchRequestPatchOffsets(rcx0);
        if( !*(_WORD *)(rcx0 + 30) && *(_WORD *)(rcx0 + 28) )
          *(_WORD *)(rcx0 + 30) = *(_WORD *)(rcx0 + 28) - 1;
        if( *(_DWORD *)(rcx0 + 20) )
        {
          PfpPrefetchPrivatePages();
          v4 = v17;
          if( v17 == -1073741248 || v17 == -1073741670 || v17 == -1073741801 )
            goto LABEL_26;
        }
        v13 = 0;
        if( *(_DWORD *)(rcx0 + 8) )
        {
          do
          {
            if( (int)PfpVolumeOpenAndVerify(a1, &v31[4 * (unsigned __int64)v13], *(_QWORD *)(rcx0 + 32) + 40i64 * v13) >= 0 )
            {
              v4 = PfpVolumePrefetchMetadata((INT64)&v29, v13);
              if( v4 == -1073741248 )
                goto LABEL_26;
            }
          }
          while( ++v13 < *(_DWORD *)(rcx0 + 8) );
        }
        if( (*(_DWORD *)(v29 + 80) & 4) != 0 )
        {
          v14 = PfpPrefetchFilesTrickle(&v29);
          v15 = v14 == -1073741248;
LABEL_22:
          v4 = v14;
          if( !v15 && v14 != -1073741670 && v14 != -1073741801 )
            v4 = 0;
          goto LABEL_26;
        }
        v23 = PfpPrefetchFiles(&v29, 0);
        v4 = v23;
        if( v23 != -1073741248 && v23 != -1073741670 && v23 != -1073741801 )
        {
          if( !PfpCheckPrefetchAbort(&v29) )
          {
            v14 = PfpPrefetchFiles(&v29, 1);
            v15 = v14 == -1073741248;
            goto LABEL_22;
          }
          v4 = -1073741248;
        }
LABEL_26:
        if( v5 )
        {
          _InterlockedDecrement(&dword_140CEBED8);
          PfpScenCtxPrefetchAbortSet((ULONG_PTR)&qword_140C50020, v5, 0i64, 1, 0);
        }
        goto LABEL_28;
      }
      v30 = ExAllocatePoolWithTag(PagedPool, (unsigned int)(32 * v19), 0x68466650ui64);
      if( v30 )
      {
        for( j = 0; j < *(_DWORD *)(v29 + 12); *((_QWORD *)v22 + 3) |= 0x200000000ui64 )
        {
          v21 = 32i64 * j++;
          v22 = (char *)v30 + v21;
          *(_OWORD *)v22 = 0i64;
          *((_OWORD *)v22 + 1) = 0i64;
        }
        goto LABEL_12;
      }
    }
LABEL_45:
    v4 = -1073741670;
    goto LABEL_26;
  }
LABEL_28:
  if( v30 )
  {
    v24 = v29;
    for( k = 0; k < *(_DWORD *)(v24 + 12); ++k )
    {
      v26 = (char *)v30 + 32 * k;
      if( (v26[3] & 0x400000000i64) != 0 )
      {
        PfpOpenHandleClose(v26, a1);
        v24 = v29;
      }
    }
    ExFreePoolWithTag(v30, 0);
  }
  PfpPrefetchVolumesCleanup(&v29);
  if( P )
    ExFreePoolWithTag(P, 0);
  if( a1 )
  {
    PfpPrefetchSharedCleanup(a1);
    PfpPrefetchSharedDeref((volatile INT64 *)a1);
  }
  *((_BYTE *)KeGetCurrentThread() + 562) = v2;
  return(unsigned int)v4;
}

Referenced by:

PfpPrefetchRequest