PfpPrefetchRequestPerform
INT64 __fastcall PfpPrefetchRequestPerform(INT64 rcx0){
char v2;
VOID *PoolWithTag;
int v4;
int v5;
unsigned int v6;
_OWORD *v7;
unsigned int i;
__int64 v9;
__int64 v10;
__int64 v11;
bool v12;
unsigned int v13;
int v14;
bool v15;
int v17;
_LIST_ENTRY *p_WaitListHead;
int v19;
unsigned int j;
__int64 v21;
char *v22;
int v23;
INT64 v24;
unsigned int k;
_QWORD *v26;
struct _KEVENT Event;
__int64 v28;
INT64 v29;
PVOID v30;
_OWORD *v31;
PVOID P;
__int64 v33;
INT64 a1;
v28 = 0i64;
Event.Header.WaitListHead = 0i64;
memset((INT64)&v30, 0i64);
v29 = rcx0;
KeInitializeEvent((_KEVENT *)&Event.Header.WaitListHead, NotificationEvent, 0);
v2 = *((_BYTE *)KeGetCurrentThread() + 562);
*((_BYTE *)KeGetCurrentThread() + 562) = 0;
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x90ui64, 0x43536650ui64);
a1 = (INT64)PoolWithTag;
if( !PoolWithTag )
{
v4 = -1073741670;
goto LABEL_28;
}
PfpPrefetchSharedInitialize(PoolWithTag);
*(_QWORD *)(a1 + 24) = &v29;
if( (*(_DWORD *)(v29 + 80) & 4) != 0 )
{
*(_DWORD *)(a1 + 60) = 60000;
*(_DWORD *)(a1 + 56) = 150;
}
else
{
*(_DWORD *)(a1 + 60) = 250;
*(_DWORD *)(a1 + 56) = 15;
}
v4 = PfpPrefetchSharedStart(a1);
if( v4 >= 0 )
{
v5 = *(unsigned __int8 *)(v29 + 81);
if( *(_BYTE *)(v29 + 81) )
{
_InterlockedAdd(&dword_140CEBED8, 1u);
p_WaitListHead = &Event.Header.WaitListHead;
if( *(_QWORD *)(v29 + 72) )
p_WaitListHead = *(_LIST_ENTRY **)(v29 + 72);
v4 = PfpScenCtxPrefetchAbortSet((ULONG_PTR)&qword_140C50020, v5, (__int64)p_WaitListHead, 0, 0);
if( v4 < 0 )
goto LABEL_26;
if( !*(_QWORD *)(v29 + 72) )
*(_QWORD *)(v29 + 72) = &Event.Header.WaitListHead;
}
v6 = *(_DWORD *)(rcx0 + 8) << 6;
if( v6 )
{
v7 = ExAllocatePoolWithTag(PagedPool, v6, 0x48566650ui64);
v31 = v7;
if( !v7 )
goto LABEL_45;
memset((INT64)v7, 0i64);
for( i = 0; i < *(_DWORD *)(rcx0 + 8); *(_QWORD *)(v10 + v11 + 56) |= 0x200000000ui64 )
{
v9 = (__int64)v31;
v10 = i++;
v10 <<= 6;
*(_OWORD *)((char *)v31 + v10) = 0i64;
*(_OWORD *)(v10 + v9 + 16) = 0i64;
*(_QWORD *)(v10 + v9 + 24) |= 0x200000000ui64;
v11 = (__int64)v31;
*(_OWORD *)((char *)v31 + v10 + 32) = 0i64;
*(_OWORD *)(v10 + v11 + 48) = 0i64;
}
}
v12 = (*(_DWORD *)(v29 + 80) & 4) != 0;
LODWORD(v33) = v12 ? 16 : 768;
P = ExAllocatePoolWithTag(PagedPool, (-(__int64)v12 & 0xFFFFFFFFFFFFE880ui64) + 6160, 0x504D6650ui64);
if( P )
{
if( (*(_DWORD *)(v29 + 80) & 4) != 0 || (v19 = *(_DWORD *)(v29 + 12)) == 0 )
{
LABEL_12:
PfpPrefetchRequestPatchOffsets(rcx0);
if( !*(_WORD *)(rcx0 + 30) && *(_WORD *)(rcx0 + 28) )
*(_WORD *)(rcx0 + 30) = *(_WORD *)(rcx0 + 28) - 1;
if( *(_DWORD *)(rcx0 + 20) )
{
PfpPrefetchPrivatePages();
v4 = v17;
if( v17 == -1073741248 || v17 == -1073741670 || v17 == -1073741801 )
goto LABEL_26;
}
v13 = 0;
if( *(_DWORD *)(rcx0 + 8) )
{
do
{
if( (int)PfpVolumeOpenAndVerify(a1, &v31[4 * (unsigned __int64)v13], *(_QWORD *)(rcx0 + 32) + 40i64 * v13) >= 0 )
{
v4 = PfpVolumePrefetchMetadata((INT64)&v29, v13);
if( v4 == -1073741248 )
goto LABEL_26;
}
}
while( ++v13 < *(_DWORD *)(rcx0 + 8) );
}
if( (*(_DWORD *)(v29 + 80) & 4) != 0 )
{
v14 = PfpPrefetchFilesTrickle(&v29);
v15 = v14 == -1073741248;
LABEL_22:
v4 = v14;
if( !v15 && v14 != -1073741670 && v14 != -1073741801 )
v4 = 0;
goto LABEL_26;
}
v23 = PfpPrefetchFiles(&v29, 0);
v4 = v23;
if( v23 != -1073741248 && v23 != -1073741670 && v23 != -1073741801 )
{
if( !PfpCheckPrefetchAbort(&v29) )
{
v14 = PfpPrefetchFiles(&v29, 1);
v15 = v14 == -1073741248;
goto LABEL_22;
}
v4 = -1073741248;
}
LABEL_26:
if( v5 )
{
_InterlockedDecrement(&dword_140CEBED8);
PfpScenCtxPrefetchAbortSet((ULONG_PTR)&qword_140C50020, v5, 0i64, 1, 0);
}
goto LABEL_28;
}
v30 = ExAllocatePoolWithTag(PagedPool, (unsigned int)(32 * v19), 0x68466650ui64);
if( v30 )
{
for( j = 0; j < *(_DWORD *)(v29 + 12); *((_QWORD *)v22 + 3) |= 0x200000000ui64 )
{
v21 = 32i64 * j++;
v22 = (char *)v30 + v21;
*(_OWORD *)v22 = 0i64;
*((_OWORD *)v22 + 1) = 0i64;
}
goto LABEL_12;
}
}
LABEL_45:
v4 = -1073741670;
goto LABEL_26;
}
LABEL_28:
if( v30 )
{
v24 = v29;
for( k = 0; k < *(_DWORD *)(v24 + 12); ++k )
{
v26 = (char *)v30 + 32 * k;
if( (v26[3] & 0x400000000i64) != 0 )
{
PfpOpenHandleClose(v26, a1);
v24 = v29;
}
}
ExFreePoolWithTag(v30, 0);
}
PfpPrefetchVolumesCleanup(&v29);
if( P )
ExFreePoolWithTag(P, 0);
if( a1 )
{
PfpPrefetchSharedCleanup(a1);
PfpPrefetchSharedDeref((volatile INT64 *)a1);
}
*((_BYTE *)KeGetCurrentThread() + 562) = v2;
return(unsigned int)v4;
}Referenced by:
PfpPrefetchRequest