PfpPrefetchRequestPerform

__int64 __fastcall PfpPrefetchRequestPerform(__int64 a1){
  char PreviousMode; 
  VOID **PoolWithTag; 
  NTSTATUS v4; 
  PF_PHASED_SCENARIO_TYPE v5; 
  unsigned int v6; 
  size_t v7; 
  VOID **v8; 
  unsigned int i; 
  char *v10; 
  __int64 v11; 
  char *v12; 
  bool v13; 
  unsigned int v14; 
  NTSTATUS v15; 
  bool v16; 
  NTSTATUS v18; 
  _KEVENT *v19; 
  int v20; 
  unsigned int j; 
  __int64 v22; 
  char *v23; 
  NTSTATUS v24; 
  __int64 v25; 
  unsigned int k; 
  _QWORD *v27; 
  UINT64 LockHeld; 
  INT64 v29[3]; 
  __int64 v30; 
  _PFP_PREFETCH_CONTEXT v31[2]; 
  PVOID v32[27]; 

  v30 = 0i64;
  *(_OWORD *)&v29[1] = 0i64;
  memset(v32, 0i64, sizeof(v32));
  *(_QWORD *)v31 = a1;
  KeInitializeEvent((INT64)&v29[1], 0, 0);
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  KeGetCurrentThread()->PreviousMode = 0;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x90ui64, 1129539152i64);
  v32[4] = PoolWithTag;
  if( !PoolWithTag )
  {
    v4 = -1073741670;
    goto LABEL_28;
  }
  PfpPrefetchSharedInitialize(PoolWithTag);
  *((_QWORD *)v32[4] + 3) = v31;
  if( (*(_DWORD *)(*(_QWORD *)v31 + 80i64) & 4) != 0 )
  {
    *((_DWORD *)v32[4] + 15) = 60000;
    *((_DWORD *)v32[4] + 14) = 150;
  }
  else
  {
    *((_DWORD *)v32[4] + 15) = 250;
    *((_DWORD *)v32[4] + 14) = 15;
  }
  v4 = PfpPrefetchSharedStart(v32[4]);
  if( v4 >= 0 )
  {
    v5 = *(unsigned __int8 *)(*(_QWORD *)v31 + 81i64);
    if( *(_BYTE *)(*(_QWORD *)v31 + 81i64) )
    {
      _InterlockedAdd(&PfKernelGlobals.ScenarioPrefetchCount, 1u);
      v19 = (_KEVENT *)&v29[1];
      LODWORD(LockHeld) = 0;
      if( *(_QWORD *)(*(_QWORD *)v31 + 72i64) )
        v19 = *(_KEVENT **)(*(_QWORD *)v31 + 72i64);
      v4 = PfpScenCtxPrefetchAbortSet(&ScenCtx, v5, v19, 0i64, LockHeld);
      if( v4 < 0 )
        goto LABEL_26;
      if( !*(_QWORD *)(*(_QWORD *)v31 + 72i64) )
        *(_QWORD *)(*(_QWORD *)v31 + 72i64) = &v29[1];
    }
    v6 = *(_DWORD *)(a1 + 8) << 6;
    if( v6 )
    {
      v7 = *(_DWORD *)(a1 + 8) << 6;
      v8 = ExAllocatePoolWithTag(1ui64, v6, 1213621840i64);
      v32[1] = v8;
      if( !v8 )
        goto LABEL_45;
      memset(v8, 0i64, v7);
      for( i = 0; i < *(_DWORD *)(a1 + 8); *(_QWORD *)&v12[v11 + 56] |= 0x200000000ui64 )
      {
        v10 = (char *)v32[1];
        v11 = i++;
        v11 <<= 6;
        *(_OWORD *)((char *)v32[1] + v11) = 0i64;
        *(_OWORD *)&v10[v11 + 16] = 0i64;
        *(_QWORD *)&v10[v11 + 24] |= 0x200000000ui64;
        v12 = (char *)v32[1];
        *(_OWORD *)((char *)v32[1] + v11 + 32) = 0i64;
        *(_OWORD *)&v12[v11 + 48] = 0i64;
      }
    }
    v13 = (*(_DWORD *)(*(_QWORD *)v31 + 80i64) & 4) != 0;
    LODWORD(v32[3]) = v13 ? 16 : 768;
    v32[2] = ExAllocatePoolWithTag(1ui64, (-(__int64)v13 & 0xFFFFFFFFFFFFE880ui64) + 6160, 1347249744i64);
    if( v32[2] )
    {
      if( (*(_DWORD *)(*(_QWORD *)v31 + 80i64) & 4) != 0 || (v20 = *(_DWORD *)(*(_QWORD *)v31 + 12i64)) == 0 )
      {
LABEL_12:
        PfpPrefetchRequestPatchOffsets(a1);
        if( !*(_WORD *)(a1 + 30) && *(_WORD *)(a1 + 28) )
          *(_WORD *)(a1 + 30) = *(_WORD *)(a1 + 28) - 1;
        if( *(_DWORD *)(a1 + 20) )
        {
          v18 = PfpPrefetchPrivatePages(v31);
          v4 = v18;
          if( v18 == -1073741248 || v18 == -1073741670 || v18 == -1073741801 )
            goto LABEL_26;
        }
        v14 = 0;
        if( *(_DWORD *)(a1 + 8) )
        {
          do
          {
            if( PfpVolumeOpenAndVerify(
                   (_PFP_PREFETCH_CONTEXT_SHARED *)v32[4],
                   (_OWORD *)v32[1] + 4 * (unsigned __int64)v14,
                   *(_QWORD *)(a1 + 32) + 40i64 * v14) >= 0 )
            {
              v4 = PfpVolumePrefetchMetadata(v31, v14);
              if( v4 == -1073741248 )
                goto LABEL_26;
            }
          }
          while( ++v14 < *(_DWORD *)(a1 + 8) );
        }
        if( (*(_DWORD *)(*(_QWORD *)v31 + 80i64) & 4) != 0 )
        {
          v15 = PfpPrefetchFilesTrickle(v31);
          v16 = v15 == -1073741248;
LABEL_22:
          v4 = v15;
          if( !v16 && v15 != -1073741670 && v15 != -1073741801 )
            v4 = 0;
          goto LABEL_26;
        }
        v24 = PfpPrefetchFiles(v31, 0);
        v4 = v24;
        if( v24 != -1073741248 && v24 != -1073741670 && v24 != -1073741801 )
        {
          if( !(unsigned int)PfpCheckPrefetchAbort(v31) )
          {
            v15 = PfpPrefetchFiles(v31, 1u);
            v16 = v15 == -1073741248;
            goto LABEL_22;
          }
          v4 = -1073741248;
        }
LABEL_26:
        if( v5 )
        {
          _InterlockedDecrement(&PfKernelGlobals.ScenarioPrefetchCount);
          LODWORD(LockHeld) = 0;
          PfpScenCtxPrefetchAbortSet(&ScenCtx, v5, 0i64, 1ui64, LockHeld);
        }
        goto LABEL_28;
      }
      v32[0] = ExAllocatePoolWithTag(1ui64, (unsigned int)(32 * v20), 1749444176i64);
      if( v32[0] )
      {
        for( j = 0; j < *(_DWORD *)(*(_QWORD *)v31 + 12i64); *((_QWORD *)v23 + 3) |= 0x200000000ui64 )
        {
          v22 = 32i64 * j++;
          v23 = (char *)v32[0] + v22;
          *(_OWORD *)v23 = 0i64;
          *((_OWORD *)v23 + 1) = 0i64;
        }
        goto LABEL_12;
      }
    }
LABEL_45:
    v4 = -1073741670;
    goto LABEL_26;
  }
LABEL_28:
  if( v32[0] )
  {
    v25 = *(_QWORD *)v31;
    for( k = 0; k < *(_DWORD *)(v25 + 12); ++k )
    {
      v27 = (char *)v32[0] + 32 * k;
      if( (v27[3] & 0x400000000i64) != 0 )
      {
        PfpOpenHandleClose(v27, (__int64)v32[4]);
        v25 = *(_QWORD *)v31;
      }
    }
    ExFreePoolWithTag(v32[0], 0);
  }
  PfpPrefetchVolumesCleanup(v31);
  if( v32[2] )
    ExFreePoolWithTag(v32[2], 0);
  if( v32[4] )
  {
    PfpPrefetchSharedCleanup(v32[4]);
    PfpPrefetchSharedDeref((_PFP_PREFETCH_CONTEXT_SHARED *)v32[4]);
  }
  KeGetCurrentThread()->PreviousMode = PreviousMode;
  return(unsigned int)v4;
}

Referenced by:

PfpPrefetchRequest