SMKM_STORE::SmStTrimWsStoreBatch
void __fastcall SMKM_STORE::SmStTrimWsStoreBatch(
__int64 a1,
unsigned int *a2,
PVOID *a3,
unsigned int a4,
int a5,
_QWORD *a6){
__int64 v6;
__int64 v7;
unsigned int *v9;
UINT64 v10;
_QWORD *v11;
unsigned int v12;
__int64 v13;
unsigned int v14;
PVOID *PoolWithTag;
unsigned int v16;
unsigned int v17;
PVOID *v18;
char *v19;
PVOID *v20;
__int64 v21;
unsigned int v22;
unsigned int v23;
unsigned int v24;
PVOID v25;
_BYTE *v26;
bool v27;
_ETHREAD *CurrentThread;
__int64 v29;
__int64 v30;
int MemoryInformationLength;
PVOID BaseAddress;
PVOID P;
ULONG_PTR NumberOfBytesToUnlock;
UINT64 v35;
unsigned int v38;
v6 = a1;
v7 = a4;
v9 = a2;
BaseAddress = 0i64;
v10 = a1 + 6024;
v35 = a1 + 6024;
if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 6024), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 6024));
KeAbPostRelease((PVOID)(v6 + 6024));
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
v11 = a6;
v12 = *(_DWORD *)(v6 + 6208);
NumberOfBytesToUnlock = v12;
if( a6 )
{
v14 = v12 >> 12;
PoolWithTag = (PVOID *)ExAllocatePoolWithTag(NonPagedPoolNx, 16 * v7 * v14, 0x71576D73ui64);
P = PoolWithTag;
if( PoolWithTag )
{
v16 = 0;
v17 = 0;
if( (_DWORD)v7 )
{
v18 = a3;
do
{
v19 = (char *)*v18;
++v17;
BaseAddress = *v18;
if( v16 < v14 * v17 )
{
v20 = &PoolWithTag[2 * v16];
v21 = v14 * v17 - v16;
v16 = v14 * v17;
do
{
*v20 = v19;
v20 += 2;
v19 = (char *)BaseAddress + 4096;
BaseAddress = (char *)BaseAddress + 4096;
--v21;
}
while( v21 );
}
++v18;
}
while( v17 < (unsigned int)v7 );
v11 = a6;
}
if( ZwQueryVirtualMemory(
(PVOID)0xFFFFFFFFFFFFFFFFi64,
*PoolWithTag,
MemoryWorkingSetExList,
PoolWithTag,
16 * v7 * v14,
0i64) >= 0 )
{
v22 = 0;
v23 = 0;
v38 = 0;
if( (_DWORD)v7 )
{
v24 = v14;
do
{
v25 = 0i64;
BaseAddress = 0i64;
if( v23 < v24 )
{
v26 = P;
do
{
if( (v26[16 * v23 + 8] & 1) != 0 )
{
v27 = (*v11)-- == 1i64;
v25 = *a3;
BaseAddress = *a3;
if( v27 )
break;
}
++v23;
}
while( v23 < v24 );
if( v25 )
ZwUnlockVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &NumberOfBytesToUnlock, 1ui64);
v22 = v38;
}
if( !*v11 )
break;
++v22;
v24 += v14;
++a3;
v38 = v22;
}
while( v22 < (unsigned int)v7 );
v10 = v35;
}
}
else
{
*v11 = 0i64;
}
ExFreePoolWithTag(P, 0);
v6 = a1;
}
else
{
*a6 = 0i64;
}
v9 = a2;
}
else if( (_DWORD)v7 )
{
v13 = v7;
do
{
BaseAddress = *a3;
ZwUnlockVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &NumberOfBytesToUnlock, 1ui64);
++a3;
--v13;
}
while( v13 );
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx(v10, 0i64);
if( (_DWORD)v7 )
{
do
{
SMKM_STORE::SmStUnmapVirtualRegion(v6, *v9++, v29, v30, MemoryInformationLength, 2u);
--v7;
}
while( v7 );
}
}
Referenced by:
No references.