PfSnAsyncPrefetchWorker

VOID __fastcall PfSnAsyncPrefetchWorker(PVOID P){
  INT64 v1; 
  int v3; 
  int v4; 
  unsigned int v5; 
  EVENT_DESCRIPTOR *v6; 
  int DefaultPagePriority; 
  UINT64 AvailablePagesBelowPriority; 
  __int64 v9; 
  _QWORD *PoolWithTag; 
  EVENT_DESCRIPTOR *v11; 
  int v12; 
  unsigned int v13; 
  EVENT_DESCRIPTOR *v14; 
  __int64 v15; 
  __int64 v16; 
  EVENT_DESCRIPTOR *v17; 
  EVENT_DESCRIPTOR *v18; 
  INT64 v19[2]; 
  INT64 result; 
  _QWORD *v21; 
  __int64 v22[2]; 
  __int64 v23[7]; 
  unsigned int v24; 
  unsigned int v25; 
  __int64 v26; 
  __int64 v27; 
  int v28; 
  _KAPC_STATE ApcState; 
  v1 = *((_QWORD *)P + 26);
  LODWORD(v19[0]) = 0;
  v3 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  v4 = 0;
  memset((INT64)&result, 0i64);
  v5 = *((_DWORD *)P + 59);
  v22[1] = (__int64)v22;
  result = v1;
  v22[0] = (__int64)v22;
  v23[1] = (__int64)v23;
  v23[0] = (__int64)v23;
  PfSnLogAsyncWorker(v1, (INT64 *)&PfSnEvt_AsyncWorker_Start, v6);
  if( (*((_DWORD *)P + 60) & 1) != 0 )
  {
    PfSnPowerBoost((PEX_RUNDOWN_REF)P + 5, 1i64);
    v4 = 1;
  }
  KiStackAttachProcess(*((_KPROCESS **)P + 27), 0i64, &ApcState);
  DefaultPagePriority = MmGetDefaultPagePriority();
  if( v5 <= DefaultPagePriority - 1 )
  {
    v24 = v5;
    v25 = v5;
  }
  else
  {
    v24 = DefaultPagePriority - 1;
    v25 = DefaultPagePriority;
  }
  if( (int)PfSnPreallocatePrefetchHeader(&result) >= 0 )
  {
    AvailablePagesBelowPriority = MmGetAvailablePagesBelowPriority(v25 + 1);
    v9 = AvailablePagesBelowPriority < 0xF00 ? 0i64 : AvailablePagesBelowPriority - 3840;
    v26 = v9;
    if( v9 )
    {
      PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x90ui64, 0x43536650ui64);
      v21 = PoolWithTag;
      if( PoolWithTag )
      {
        PfpPrefetchSharedInitialize(PoolWithTag);
        v21[4] = &result;
        *((_DWORD *)v21 + 15) = 250;
        *((_DWORD *)v21 + 14) = 15;
        if( (int)PfpPrefetchSharedStart(v21) >= 0 && (int)PfSnOpenVolumesForPrefetch(&result, (INT64)v19, v11) >= 0 )
        {
          v12 = v19[0];
          if( *(_DWORD *)(v1 + 80) == 1 )
          {
            v12 = LODWORD(v19[0]) | 1;
            LODWORD(v19[0]) |= 1u;
          }
          if( (dword_140C4FFF0 & 4) != 0 )
          {
            v13 = 0;
            v12 &= ~2u;
            LODWORD(v19[0]) = v12;
          }
          else
          {
            if( (v12 & 1) != 0 )
              v13 = *(_DWORD *)(v1 + 124);
            else
              v13 = 1;
            if( 1 << v13 != 1
              && (int)PfSnAsyncPrefetchStep((INT64)P, &result, (EVENT_DESCRIPTOR *)(unsigned int)((1 << v13) - 1)) < 0 )
            {
              goto LABEL_21;
            }
            ExReleaseRundownProtection(*((PEX_RUNDOWN_REF *)P + 4));
            v3 = 1;
            PfSnLogAsyncWorker(v1, (INT64 *)&PfSnEvt_SyncPrefetchingDone_Info, v14);
          }
          if( v13 < *(_DWORD *)(v1 + 124) && (v12 & 2) == 0 )
          {
            _InterlockedExchange((volatile __int32 *)(*((_QWORD *)P + 27) + 2272i64), 5000);
            while( v13 < *(_DWORD *)(v1 + 124)
                 && (int)PfSnAsyncPrefetchStep((INT64)P, &result, (EVENT_DESCRIPTOR *)(unsigned int)(1 << v13)) >= 0 )
              ++v13;
          }
        }
      }
    }
  }
LABEL_21:
  _InterlockedExchange((volatile __int32 *)(*((_QWORD *)P + 27) + 2272i64), 0);
  v15 = *((_QWORD *)P + 28);
  if( v15 )
  {
    *(_QWORD *)(v15 + 472) = v27;
    v16 = *((_QWORD *)P + 28);
    v27 = 0i64;
    *(_DWORD *)(v16 + 480) = v28;
  }
  PfSnCleanupPrefetchHeader(&result);
  _InterlockedDecrement(&dword_140C501F0);
  if( v4 )
    PfSnPowerBoost((PEX_RUNDOWN_REF)P + 5, 0i64);
  KiUnstackDetachProcess(&ApcState, 0i64);
  if( !v3 )
  {
    ExReleaseRundownProtection(*((PEX_RUNDOWN_REF *)P + 4));
    PfSnLogAsyncWorker(v1, (INT64 *)&PfSnEvt_SyncPrefetchingDone_Info, v18);
  }
  PfSnLogAsyncWorker(v1, (INT64 *)&PfSnEvt_AsyncWorker_Stop, v17);
  PfSnAsyncContextCleanup(P);
  ExFreePoolWithTag(P, 0);
}

Referenced by:

No references.