PfSnPopulateReadList
VOID __stdcall PfSnPopulateReadList(_PFSN_WORKITEM_CONTEXT *Context){
__int64 v1;
_PFSN_WORKITEM_CONTEXT *v2;
unsigned __int32 v3;
VOID **PoolWithTag;
_PFSN_PREFETCH_HEADER *v5;
void *v6;
_ERESOURCE *v7;
UINT8 v8;
_ETHREAD *CurrentThread;
NTSTATUS Event;
unsigned int *v11;
_PFSN_WORKITEM_CONTEXT v12;
int v13;
__int64 v14;
__int64 v15;
__int64 v16;
unsigned int v17;
UINT8 v18;
PF_SECTION_RECORD *v19;
__int64 v20;
unsigned int v21;
_PFSN_WORKITEM_CONTEXT v22;
int v23;
bool v24;
WCHAR *v25;
__int64 *PrefetchVolumeInfoInList;
PFSN_PREFETCH_VOLUME_INFO *v27;
char v28;
unsigned int v29;
int v30;
__int64 v31;
int v32;
int v33;
__int64 v34;
unsigned int *v35;
__int64 i;
unsigned int v37;
__int64 v38;
int v39;
int v40;
UINT64 v41;
UINT64 SectionIdx;
UINT64 ImageSection;
_BYTE NeedToCleanup[8];
UINT64 PrefetchPhaseMask;
__int64 v46;
__int64 v47;
__int64 v48;
_FILE_OBJECT *OutFileObject;
_PFSN_PREFETCH_HEADER *PrefetchHeader;
VOID *Handle;
__int64 v52;
__int64 v53;
__int64 v54;
__int64 v55;
_PFSN_WORKITEM_CONTEXT *v56;
__int64 v57;
_UNICODE_STRING DestinationString;
INT64 v59;
__int64 v60;
__int64 v61;
int v62;
int v63;
__int128 v64;
_KAPC_STATE ApcState;
v1 = *((_QWORD *)Context + 4);
v2 = Context;
v3 = 0;
memset(&ApcState, 0, sizeof(ApcState));
v56 = Context;
PoolWithTag = 0i64;
HIDWORD(v59) = 0;
DestinationString = 0i64;
v5 = *(_PFSN_PREFETCH_HEADER **)(v1 + 8);
v6 = *(void **)(v1 + 16);
PrefetchHeader = v5;
v63 = 0;
v47 = v1;
NeedToCleanup[0] = 0;
Handle = 0i64;
KiStackAttachProcess(v6, 0i64, &ApcState);
LOBYTE(v7) = 1;
PsSetCurrentThreadPrefetching(v7, v8);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
LODWORD(v59) = 48;
v60 = 0i64;
v62 = 512;
v61 = 0i64;
v64 = 0i64;
Event = NtCreateEvent((UINT64)&Handle, 0x1F0003ui64, (INT64)&v59, 0i64, 0);
if( Event >= 0 )
{
v11 = *(unsigned int **)v5;
v12 = v2[10];
OutFileObject = 0i64;
v13 = v5[25] & 7;
v14 = (__int64)v11 + v11[21];
v15 = (__int64)v11 + v11[23];
v16 = (__int64)v11 + v11[25];
v55 = v14;
v54 = *((_QWORD *)v5 + 8);
v52 = *((_QWORD *)v5 + 9);
v17 = v5[24] & 7 | (8 * (v13 | 8));
v53 = v15;
v57 = v16;
LODWORD(PrefetchPhaseMask) = v12;
v3 = _InterlockedExchangeAdd((volatile signed __int32 *)(v1 + 28), 1u);
if( v3 >= *(_DWORD *)(v1 + 32) )
goto LABEL_3;
while( 1 )
{
v19 = (PF_SECTION_RECORD *)(v14 + 32i64 * v3);
v20 = v3;
v46 = v3;
v21 = v19[5];
if( (v21 & 1) == 0 )
break;
LABEL_33:
if( NeedToCleanup[0] )
{
PfSnCleanupPrefetchSectionInfo(*((_QWORD *)v5 + 7) + 56 * v20, (__int64)v5, 1);
NeedToCleanup[0] = 0;
}
if( PoolWithTag )
{
ExFreePoolWithTag(PoolWithTag, 0);
PoolWithTag = 0i64;
}
v1 = v47;
LABEL_38:
v3 = _InterlockedExchangeAdd((volatile signed __int32 *)(v1 + 28), 1u);
if( v3 >= *(_DWORD *)(v1 + 32) )
goto LABEL_50;
v14 = v55;
v2 = v56;
v16 = v57;
}
v22 = v2[11];
NeedToCleanup[1] = 0;
v23 = v22 & 1;
if( v23 )
{
v24 = ((unsigned __int8)v12 & BYTE1(v21) & 0x7F) == 0;
}
else
{
LODWORD(v48) = 0;
v24 = !_BitScanForward((unsigned int *)&v39, (v21 >> 8) & 0x7F);
if( v24 )
v39 = 7;
v40 = v12 & (1 << v39);
LODWORD(v48) = v39;
NeedToCleanup[1] = v40 != 0;
if( ((unsigned __int8)v12 & (unsigned __int8)(v21 >> 1) & 0x7F) != 0 )
goto LABEL_10;
NeedToCleanup[1] = v40 != 0;
v24 = v40 == 0;
}
if( v24 )
{
LABEL_32:
v20 = v46;
goto LABEL_33;
}
LABEL_10:
v25 = (WCHAR *)(v16 + (unsigned int)v19[3]);
PrefetchVolumeInfoInList = PfSnFindPrefetchVolumeInfoInList(v25, (_QWORD *)v5 + 5, 0);
if( PrefetchVolumeInfoInList )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, (unsigned int)(8 * v19[2] + 24), 1280336707i64);
if( !PoolWithTag )
{
v1 = v47;
Event = -1073741670;
v5 = PrefetchHeader;
goto LABEL_53;
}
*((_DWORD *)PoolWithTag + 3) = v23;
*PoolWithTag = 0i64;
*((_DWORD *)PoolWithTag + 2) = 0;
RtlInitUnicodeString(&DestinationString, &v25[*((unsigned int *)PrefetchVolumeInfoInList + 6) + 1]);
v12 = PrefetchPhaseMask;
v27 = (PFSN_PREFETCH_VOLUME_INFO *)PrefetchVolumeInfoInList;
v5 = PrefetchHeader;
LODWORD(ImageSection) = v23;
LODWORD(SectionIdx) = v3;
LODWORD(v41) = PrefetchPhaseMask;
if( PfSnGetSectionObject(
PrefetchHeader,
v27,
&DestinationString,
v19,
v41,
SectionIdx,
ImageSection,
Handle,
&OutFileObject,
NeedToCleanup) >= 0 )
{
v28 = NeedToCleanup[1];
v29 = 0;
v30 = 1;
if( NeedToCleanup[1] )
{
v29 = 1;
PoolWithTag[(unsigned int)(*((_DWORD *)PoolWithTag + 2))++ + 2] = 0i64;
if( !OutFileObject->SectionObjectPointer->ImageSectionObject )
v30 = 0;
}
v31 = *v19;
v32 = v19[1];
v33 = 0;
v34 = (int)v31 + v32;
if( v31 < v34 )
{
v35 = (unsigned int *)(v53 + 8 * v31 + 4);
for( i = v34 - v31; i; --i )
{
v37 = *v35;
if( (*v35 & 1) == 0 )
{
if( (v37 & 8) != 0 && !v30 )
{
LABEL_21:
if( *(v35 - 1) || !v28 )
{
PoolWithTag[(unsigned int)(*((_DWORD *)PoolWithTag + 2))++ + 2] = (VOID *)((unsigned __int64)*(v35 - 1) << 9);
++v29;
}
else
{
v33 = 1;
}
goto LABEL_23;
}
if( _bittest(&v12, (v37 >> 4) & 7) )
{
if( v23 )
{
if( (v37 & 2) != 0 )
goto LABEL_21;
}
else if( (v37 & 4) != 0 )
{
goto LABEL_21;
}
}
}
LABEL_23:
v35 += 2;
}
}
if( *((_DWORD *)PoolWithTag + 2) != 1 || !v28 || !v30 || v33 )
{
v1 = v47;
PoolWithTag[2] = (VOID *)(v17 | (unsigned __int64)PoolWithTag[2]);
*PoolWithTag = OutFileObject;
v38 = (unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)(v1 + 24), 1u);
*(_QWORD *)(v54 + 8 * v38) = PoolWithTag;
PoolWithTag = 0i64;
_InterlockedExchangeAdd((volatile signed __int32 *)(v1 + 36), v29);
if( NeedToCleanup[0] )
{
*(_DWORD *)(v52 + 4 * v38) = v3;
NeedToCleanup[0] = 0;
}
else
{
*(_DWORD *)(v52 + 4 * v38) = -1;
}
goto LABEL_38;
}
}
}
else
{
v12 = PrefetchPhaseMask;
v5 = PrefetchHeader;
}
goto LABEL_32;
}
LABEL_53:
*(_DWORD *)(v1 + 40) = Event;
LABEL_50:
if( NeedToCleanup[0] )
PfSnCleanupPrefetchSectionInfo(*((_QWORD *)v5 + 7) + 56i64 * v3, (__int64)v5, 1);
LABEL_3:
if( Handle )
NtClose((UINT64)Handle);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
PsSetCurrentThreadPrefetching(0i64, v18);
KiUnstackDetachProcess(&ApcState, 0i64);
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)v1);
}Referenced by:
No references.