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