MiDeleteBatch
INT64 __fastcall MiDeleteBatch(UINT8 *a1){
bool v1;
INT64 result;
INT64 v4;
_LIST_ENTRY *v5;
WORK_QUEUE_TYPE v6;
PVOID v7;
UINT8 v8;
_MMPFN *PfnDb;
char *v10;
char *v11;
unsigned __int64 v12;
_MMPFN *v13;
char v14;
char *v15;
UINT64 v16;
char v17;
volatile signed __int64 *v18;
__int64 v19;
UNICODE_STRING *v20;
UINT8 v21;
WCHAR *v22;
int v23;
INT64 v24;
__int64 v25;
unsigned __int64 v26;
UINT8 i;
UINT64 v28;
struct _IO_WORKITEM LockHandle;
UINT64 SpinCount;
INT64 v31;
v1 = *a1 == 0;
LockHandle.WorkItem.WorkerRoutine = 0i64;
if( v1 )
return 0i64;
v4 = 0i64;
v31 = *((_QWORD *)a1 + 2);
v5 = *(_LIST_ENTRY **)(qword_140C4E388
+ 8
* ((*((_QWORD *)MmGetPfnDb()
+ 6 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v31) >> 12) & 0xFFFFFFFFFi64)
+ 5) >> 39) & 0x3FFi64));
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = v5 + 470;
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)&v5[470], v6, v7);
v8 = 0;
if( *a1 )
{
PfnDb = MmGetPfnDb();
v10 = (char *)PfnDb + 16;
do
{
v31 = *(_QWORD *)&a1[8 * v8 + 16];
v11 = (char *)MmGetPfnDb() + 34;
v12 = 48 * (((unsigned __int64)v31 >> 12) & 0xFFFFFFFFFi64);
v13 = (_MMPFN *)((char *)PfnDb + v12);
v14 = v11[v12];
v15 = &v11[v12];
if( (v14 & 7) != 6 )
MiBadShareCount(v13);
v16 = 0i64;
if( (v31 & 0x42) != 0 && (v14 & 0x10) == 0 )
{
v17 = v14;
if( (*(_DWORD *)&v10[v12] & 0x400i64) == 0 && (v14 & 8) == 0 )
{
v16 = MiCapturePageFileInfoInline((UINT64 *)&v10[v12], 1i64, 0i64);
v17 = *v15;
}
*v15 = v17 | 0x10;
}
*(_QWORD *)&a1[8 * v8 + 16] = v16;
v18 = (volatile signed __int64 *)((char *)MmGetPfnDb() + v12 + 24);
v19 = *v18 ^ (*v18 ^ (*v18 - 1)) & 0x3FFFFFFFFFFFFFFFi64;
*v18 = v19;
if( (v19 & 0x3FFFFFFFFFFFFFFFi64) == 0 && (unsigned int)MiPfnShareCountIsZero((UINT64)v13, 1ui64) == 3 )
{
LOBYTE(v23) = MI_PFN_IS_PROTO((UNICODE_STRING *)v13, v20, v21, v22);
if( !v23 )
++v4;
}
_InterlockedAnd64(v18, 0x7FFFFFFFFFFFFFFFui64);
++v8;
v10 = (char *)MmGetPfnDb() + 16;
PfnDb = MmGetPfnDb();
}
while( v8 < *a1 );
}
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
v25 = *((_QWORD *)a1 + 1);
if( a1[1] == 1 )
{
MiLockNestedPageAtDpcInline(*((_QWORD *)a1 + 1));
}
else
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v25 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v25 + 24) < 0 );
}
}
if( (*(_BYTE *)(v25 + 34) & 7) != 6 || (v26 = *a1, (*(_QWORD *)(v25 + 24) & 0x3FFFFFFFFFFFFFFFui64) < v26) )
MiBadShareCount((_MMPFN *)v25);
*(_QWORD *)(v25 + 24) ^= (*(_QWORD *)(v25 + 24) ^ (*(_QWORD *)(v25 + 24) - v26)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)(v25 + 24), 0x7FFFFFFFFFFFFFFFui64);
for( i = 0; i < *a1; ++i )
{
v28 = *(_QWORD *)&a1[8 * i + 16];
if( v28 )
MiReleasePageFileInfo(
(INT64)v5,
v28,
1,
v24,
(INT64)LockHandle.WorkItem.List.Flink,
(INT64)LockHandle.WorkItem.List.Blink,
(INT64)LockHandle.WorkItem.WorkerRoutine,
(INT64)LockHandle.WorkItem.Parameter,
(INT64)LockHandle.Routine,
(INT64)LockHandle.IoObject,
(INT64)LockHandle.Context,
(INT64)LockHandle.WorkOnBehalfThread);
}
result = v4;
*a1 = 0;
return result;
}Referenced by:
MiDeleteClusterPage
MiDeletePteRun