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.