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.