SMKM_STORE::SmStPrioritizeRegionsStore
__int64 __fastcall SMKM_STORE::SmStPrioritizeRegionsStore(__int64 a1, __int64 *a2){
bool v2;
__int64 *v3;
unsigned int v5;
unsigned int v6;
unsigned int v7;
_ETHREAD *CurrentThread;
volatile signed __int64 *v9;
__int64 v10;
unsigned int v11;
unsigned int v12;
int v13;
char *v14;
SIZE_T v15;
char *v16;
__int64 v17;
char *v18;
char *v19;
char *v20;
unsigned __int64 v21;
char *v22;
char *v23;
unsigned int v24;
unsigned __int64 v25;
__int64 v26;
__int64 v27;
__int64 v28;
UINT64 v29;
UINT64 v30;
SIZE_T v31;
_ETHREAD *v32;
__int64 v33;
__int64 v34;
int MemoryInformationLength;
unsigned int v37;
unsigned int v38;
unsigned int v39;
_KAPC_STATE ApcState;
_MEMORY_RANGE_ENTRY VirtualAddresses[32];
char MemoryInformation[8];
char v44;
v2 = (*(_BYTE *)(a1 + 6021) & 4) == 0;
memset(&ApcState, 0, sizeof(ApcState));
v3 = a2;
if( v2 )
return(unsigned int)-1073741637;
v6 = *(_DWORD *)(a1 + 1952);
v5 = 0;
v38 = v6;
if( !v6 )
return v5;
v7 = *(_DWORD *)(a1 + 6208) >> 12;
v37 = v7;
KiStackAttachProcess(*(_KPROCESS **)(a1 + 6584), 0i64, &ApcState);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
v9 = (volatile signed __int64 *)(a1 + 6024);
ExAcquirePushLockSharedEx(a1 + 6024, 0i64);
_InterlockedIncrement((volatile signed __int32 *)(a1 + 6596));
v11 = 0;
v12 = 0;
if( !*(_DWORD *)(a1 + 6212) )
goto LABEL_43;
do
{
if( v11 >= v6 )
break;
if( (*(_QWORD *)(*(_QWORD *)(a1 + 6216) + 8i64 * v12) & 0x7FFFFFFFFFFF0000i64) == 0 )
goto LABEL_42;
v13 = *(_BYTE *)(a1 + 856) ? 0 : *(unsigned __int16 *)(*(_QWORD *)(a1 + 1112) + 2i64 * v12) >> 13;
if( v13 != 6 )
goto LABEL_42;
v39 = v11 + 1;
v14 = (char *)SMKM_STORE::SmStMapVirtualRegion(a1, v12, 0, v10, 0);
if( (unsigned __int64)v14 <= 3 )
goto LABEL_41;
if( _InterlockedCompareExchange64(v9, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 6024));
KeAbPostRelease((PVOID)(a1 + 6024));
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
if( !*v3 )
{
v15 = *(unsigned int *)(a1 + 6208);
VirtualAddresses[0].VirtualAddress = v14;
VirtualAddresses[0].NumberOfBytes = v15;
MmSetPriorityVaRanges(1ui64, VirtualAddresses, 5ui64);
goto LABEL_40;
}
v16 = v14;
v17 = v7 << 12;
v18 = &v14[v17];
v19 = MemoryInformation;
if( v14 < &v14[v17] )
{
do
{
*(_QWORD *)v19 = v16;
v16 += 4096;
v19 += 16;
}
while( v16 < v18 );
}
if( ZwQueryVirtualMemory(
(PVOID)0xFFFFFFFFFFFFFFFFi64,
v14,
MemoryWorkingSetExList,
MemoryInformation,
16i64 * v37,
0i64) < 0
&& v14 < v18 )
{
v20 = &v44;
v21 = ((unsigned __int64)(v17 - 1) >> 12) + 1;
do
{
*(_QWORD *)v20 = *(_QWORD *)v20 & 0xFFFFFFFFF8FFFFFEui64 | 0x6000001;
v20 += 16;
--v21;
}
while( v21 );
}
v22 = MemoryInformation;
v23 = v14;
v24 = 0;
if( v14 >= v18 )
{
v3 = a2;
goto LABEL_39;
}
do
{
if( (*((_QWORD *)v22 + 1) & 1) != 0 || (*((_QWORD *)v22 + 1) & 0xC00000i64) == 0x400000 )
{
v3 = a2;
v25 = *((_QWORD *)v22 + 1) & 0x7000000i64;
if( v25 == 100663296 )
{
if( !*a2 )
{
v31 = *(unsigned int *)(a1 + 6208);
v30 = 5i64;
VirtualAddresses[0].VirtualAddress = v14;
VirtualAddresses[0].NumberOfBytes = v31;
v29 = 1i64;
goto LABEL_37;
}
v26 = *a2 - 1;
goto LABEL_28;
}
if( v25 < 0x6000000 )
{
v27 = *a2;
if( *a2 )
{
v28 = v24++;
VirtualAddresses[v28].VirtualAddress = *(PVOID *)v22;
v26 = v27 - 1;
VirtualAddresses[v28].NumberOfBytes = 4096i64;
LABEL_28:
*a2 = v26;
}
}
}
else
{
v3 = a2;
}
v23 += 4096;
v22 += 16;
}
while( v23 < v18 );
if( !v24 )
goto LABEL_39;
v29 = v24;
v30 = 6i64;
LABEL_37:
MmSetPriorityVaRanges(v29, VirtualAddresses, v30);
LABEL_39:
v7 = v37;
LABEL_40:
v32 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v32 + 243);
ExAcquirePushLockSharedEx(a1 + 6024, 0i64);
SMKM_STORE::SmStUnmapVirtualRegion(a1, v12, v33, v34, MemoryInformationLength, 0);
LABEL_41:
v11 = v39;
v6 = v38;
LABEL_42:
++v12;
}
while( v12 < *(_DWORD *)(a1 + 6212) );
LABEL_43:
if( _InterlockedCompareExchange64(v9, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 6024));
KeAbPostRelease((PVOID)(a1 + 6024));
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
_InterlockedAdd((volatile signed __int32 *)(a1 + 6596), 0xFFFFFFFF);
KiUnstackDetachProcess(&ApcState, 0i64);
return v5;
}
Referenced by:
No references.