PfSnAsyncPrefetchWorker

VOID __fastcall PfSnAsyncPrefetchWorker(VOID *P){
  __int64 v1; 
  int v3; 
  int v4; 
  unsigned int v5; 
  NTSTATUS DefaultPagePriority; 
  unsigned __int64 v7; 
  __int64 v8; 
  VOID **PoolWithTag; 
  int v10; 
  unsigned int v11; 
  __int64 v12; 
  __int64 v13; 
  int PrefetchAsync[4]; 
  _PFSN_PREFETCH_HEADER PrefetchHeader[32]; 
  _KAPC_STATE ApcState; 

  v1 = *((_QWORD *)P + 26);
  PrefetchAsync[0] = 0;
  v3 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  v4 = 0;
  memset(PrefetchHeader, 0i64, sizeof(PrefetchHeader));
  v5 = *((_DWORD *)P + 59);
  *(_QWORD *)&PrefetchHeader[8] = &PrefetchHeader[6];
  *(_QWORD *)PrefetchHeader = v1;
  *(_QWORD *)&PrefetchHeader[6] = &PrefetchHeader[6];
  *(_QWORD *)&PrefetchHeader[12] = &PrefetchHeader[10];
  *(_QWORD *)&PrefetchHeader[10] = &PrefetchHeader[10];
  PfSnLogAsyncWorker(v1, PfSnEvt_AsyncWorker_Start);
  if( (*((_DWORD *)P + 60) & 1) != 0 )
  {
    PfSnPowerBoost((_EX_RUNDOWN_REF *)P + 5, 1i64);
    v4 = 1;
  }
  KiStackAttachProcess(*((PVOID *)P + 27), 0i64, &ApcState);
  DefaultPagePriority = MmGetDefaultPagePriority();
  if( v5 <= DefaultPagePriority - 1 )
  {
    PrefetchHeader[24] = v5;
    PrefetchHeader[25] = v5;
  }
  else
  {
    PrefetchHeader[24] = DefaultPagePriority - 1;
    PrefetchHeader[25] = DefaultPagePriority;
  }
  if( PfSnPreallocatePrefetchHeader(PrefetchHeader) >= 0 )
  {
    LODWORD(v7) = MmGetAvailablePagesBelowPriority((unsigned int)(PrefetchHeader[25] + 1));
    v8 = v7 < 0xF00 ? 0i64 : v7 - 3840;
    *(_QWORD *)&PrefetchHeader[26] = v8;
    if( v8 )
    {
      PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x90ui64, 1129539152i64);
      *(_QWORD *)&PrefetchHeader[2] = PoolWithTag;
      if( PoolWithTag )
      {
        PfpPrefetchSharedInitialize(PoolWithTag);
        *(_QWORD *)(*(_QWORD *)&PrefetchHeader[2] + 32i64) = PrefetchHeader;
        *(_DWORD *)(*(_QWORD *)&PrefetchHeader[2] + 60i64) = 250;
        *(_DWORD *)(*(_QWORD *)&PrefetchHeader[2] + 56i64) = 15;
        if( PfpPrefetchSharedStart(*(VOID **)&PrefetchHeader[2]) >= 0
          && PfSnOpenVolumesForPrefetch(PrefetchHeader, PrefetchAsync) >= 0 )
        {
          v10 = PrefetchAsync[0];
          if( *(_DWORD *)(v1 + 80) == 1 )
          {
            v10 = PrefetchAsync[0] | 1;
            PrefetchAsync[0] |= 1u;
          }
          if( (dword_140C4FFF0 & 4) != 0 )
          {
            v11 = 0;
            v10 &= ~2u;
            PrefetchAsync[0] = v10;
          }
          else
          {
            if( (v10 & 1) != 0 )
              v11 = *(_DWORD *)(v1 + 124);
            else
              v11 = 1;
            if( 1 << v11 != 1
              && PfSnAsyncPrefetchStep((PFSN_ASYNC_CONTEXT *)P, PrefetchHeader, (unsigned int)((1 << v11) - 1)) < 0 )
            {
              goto LABEL_21;
            }
            ExReleaseRundownProtection(*((_EX_RUNDOWN_REF **)P + 4));
            v3 = 1;
            PfSnLogAsyncWorker(v1, PfSnEvt_SyncPrefetchingDone_Info);
          }
          if( v11 < *(_DWORD *)(v1 + 124) && (v10 & 2) == 0 )
          {
            _InterlockedExchange((volatile __int32 *)(*((_QWORD *)P + 27) + 2272i64), 5000);
            while( v11 < *(_DWORD *)(v1 + 124)
                 && PfSnAsyncPrefetchStep((PFSN_ASYNC_CONTEXT *)P, PrefetchHeader, (unsigned int)(1 << v11)) >= 0 )
              ++v11;
          }
        }
      }
    }
  }
LABEL_21:
  _InterlockedExchange((volatile __int32 *)(*((_QWORD *)P + 27) + 2272i64), 0);
  v12 = *((_QWORD *)P + 28);
  if( v12 )
  {
    *(_QWORD *)(v12 + 472) = *(_QWORD *)&PrefetchHeader[28];
    v13 = *((_QWORD *)P + 28);
    *(_QWORD *)&PrefetchHeader[28] = 0i64;
    *(_DWORD *)(v13 + 480) = PrefetchHeader[30];
  }
  PfSnCleanupPrefetchHeader(PrefetchHeader);
  _InterlockedDecrement(dword_140C501F0);
  if( v4 )
    PfSnPowerBoost((_EX_RUNDOWN_REF *)P + 5, 0i64);
  KiUnstackDetachProcess(&ApcState, 0i64);
  if( !v3 )
  {
    ExReleaseRundownProtection(*((_EX_RUNDOWN_REF **)P + 4));
    PfSnLogAsyncWorker(v1, PfSnEvt_SyncPrefetchingDone_Info);
  }
  PfSnLogAsyncWorker(v1, PfSnEvt_AsyncWorker_Stop);
  PfSnAsyncContextCleanup(P);
  ExFreePoolWithTag(P, 0);
}

Referenced by:

No references.