PfSnPrefetchSections
__int64 __fastcall PfSnPrefetchSections(__int64 *a1, WORK_QUEUE_TYPE a2, EVENT_DESCRIPTOR *a3, __int64 a4, __int64 a5){
int v5;
__int64 *v6;
__int64 v7;
WORK_QUEUE_TYPE v8;
__int64 v9;
unsigned int v10;
__int64 v11;
unsigned int v12;
INT64 v13;
int v14;
unsigned int *v15;
WORK_QUEUE_TYPE v16;
__int64 v17;
INT64 v18;
EVENT_DESCRIPTOR *v19;
NTSTATUS v20;
unsigned int v21;
__int64 v23;
char v24;
__int16 v25;
int v26;
__int16 v27;
int v28;
WORK_QUEUE_TYPE QueueType;
unsigned int v30;
int v31;
WORK_QUEUE_TYPE v32;
int v33;
WORK_QUEUE_TYPE v34;
unsigned int v35;
UINT64 v36;
KSPIN_LOCK SpinLock[2];
UINT64 NumberOfLists[2];
__int128 v39;
__int64 *v40;
_READ_LIST **ReadLists;
__int64 v42;
EVENT_DATA_DESCRIPTOR UserData;
__int64 v44;
int v45;
int v46;
__int64 v47;
__int64 v48;
__int64 v49;
__int64 v50;
int *v51;
__int64 v52;
WORK_QUEUE_TYPE *p_QueueType;
__int64 v54;
char *v55;
__int64 v56;
EVENT_DATA_DESCRIPTOR v57;
__int64 v58;
int v59;
int v60;
__int64 v61;
__int64 v62;
__int64 v63;
__int64 v64;
int *v65;
__int64 v66;
int *v67;
__int64 v68;
__int16 *v69;
__int64 v70;
__int64 *v71;
__int64 v72;
int *v73;
__int64 v74;
v5 = 0;
v40 = a1;
v32 = a2;
v6 = a1;
v30 = 0;
v7 = -1i64;
v28 = (int)a3;
v8 = a2;
v36 = a5;
v9 = *a1;
v10 = 0;
v24 = 0;
v11 = v9;
QueueType = a2;
v31 = (int)a3;
*(_OWORD *)SpinLock = 0i64;
*(_OWORD *)NumberOfLists = 0i64;
v39 = 0i64;
if( v9 && RegHandle && EtwEventEnabled(RegHandle, (EVENT_DESCRIPTOR *)&PfSnEvt_PrefetchSections_Start, a3) )
{
v23 = -1i64;
do
++v23;
while( *(_WORD *)(v9 + 16 + 2 * v23) );
LOWORD(v26) = v23;
UserData.Ptr = (unsigned __int64)&v26;
v45 = 2 * (unsigned __int16)v23;
v44 = v9 + 16;
v47 = v9 + 76;
v49 = v9 + 80;
v51 = &v31;
p_QueueType = &QueueType;
v55 = &v24;
*(_QWORD *)&UserData.Size = 2i64;
v46 = 0;
v48 = 4i64;
v50 = 4i64;
v52 = 4i64;
v54 = 4i64;
v56 = 1i64;
EtwWrite(RegHandle, (EVENT_DESCRIPTOR *)&PfSnEvt_PrefetchSections_Start, 0i64, 7ui64, &UserData);
v11 = *v6;
}
if( v28 >= 1 << *(_DWORD *)(v11 + 124) )
goto LABEL_33;
if( v8 == CriticalWorkQueue )
goto LABEL_8;
if( v8 != DelayedWorkQueue )
{
LABEL_33:
v20 = -1073741811;
goto LABEL_24;
}
v5 = 1;
LABEL_8:
v12 = *(_DWORD *)(v9 + 88);
ReadLists = (_READ_LIST **)v6[8];
memset((INT64)ReadLists, 0i64);
v13 = v6[11];
memset(v13, 0i64);
ExInitializePushLock((EX_RUNDOWN_REF *)SpinLock);
NumberOfLists[0] = v36;
SpinLock[1] = (KSPIN_LOCK)v6;
LODWORD(v39) = v12;
QueueType = KeQueryPriorityThread(KeGetCurrentThread()) + 32;
if( v12 > 0x20 )
v12 = 32;
PfSnLogGetReadListsStart((_DEVICE_OBJECT *)v9, (PVOID)v12);
if( v12 )
{
v14 = v28;
v15 = (unsigned int *)(v13 + 44);
v16 = QueueType;
v17 = v12;
do
{
*(v15 - 1) = v14;
*(_QWORD *)(v15 - 3) = SpinLock;
*v15 = v5 | *v15 & 0xFFFFFFFE;
*(_QWORD *)(v15 - 11) = 0i64;
*(_QWORD *)(v15 - 7) = PfSnPopulateReadList;
*(_QWORD *)(v15 - 5) = v15 - 11;
ExAcquireRundownProtection((PEX_RUNDOWN_REF)SpinLock);
ExQueueWorkItem((WORK_QUEUE_ITEM *)(v15 - 11), v16);
v15 += 12;
--v17;
}
while( v17 );
v8 = v32;
v7 = -1i64;
v6 = v40;
}
ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)SpinLock);
PfSnLogGetReadListsStop(v9, v18, v19);
v10 = NumberOfLists[1];
v20 = DWORD2(v39);
if( (SDWORD2(v39) & 0x80000000) == 0 )
{
v30 = DWORD1(v39);
if( !LODWORD(NumberOfLists[1]) )
{
v20 = 0;
goto LABEL_24;
}
if( DWORD1(v39) )
{
v20 = MmPrefetchPagesEx(LODWORD(NumberOfLists[1]), ReadLists, (UINT64 *)v6 + 13);
if( v20 >= 0 && !v6[13] )
v20 = -2147483622;
}
else
{
v20 = -1073741823;
}
}
if( v10 )
{
v21 = v10;
if( v10 > 0x20 )
v21 = 32;
PfSnPrefetchSectionsCleanup((KSPIN_LOCK)v6, v10, v21, v36);
}
LABEL_24:
v33 = v28;
v42 = v30;
v35 = v10;
LOBYTE(v25) = 0;
v34 = v8;
if( v9 && RegHandle && EtwEventEnabled(RegHandle, (EVENT_DESCRIPTOR *)&PfSnEvt_PrefetchSections_Stop, a3) )
{
do
++v7;
while( *(_WORD *)(v9 + 16 + 2 * v7) );
v58 = v9 + 16;
v57.Ptr = (unsigned __int64)&v27;
v27 = v7;
v59 = 2 * (unsigned __int16)v7;
*(_QWORD *)&v57.Size = 2i64;
v61 = v9 + 76;
v63 = v9 + 80;
v65 = &v33;
v67 = (int *)&v34;
v69 = &v25;
v71 = &v42;
v73 = (int *)&v35;
v60 = 0;
v62 = 4i64;
v64 = 4i64;
v66 = 4i64;
v68 = 4i64;
v70 = 1i64;
v72 = 8i64;
v74 = 4i64;
EtwWrite(RegHandle, (EVENT_DESCRIPTOR *)&PfSnEvt_PrefetchSections_Stop, 0i64, 9ui64, &v57);
}
return(unsigned int)v20;
}Referenced by:
PfSnAsyncPrefetchStep