MiInsertPteTracker
_SLIST_ENTRY *__fastcall MiInsertPteTracker(INT64 a1, INT64 a2, CHAR a3, CHAR a4){
int v7;
PSLIST_ENTRY v8;
PSLIST_ENTRY v9;
_SLIST_ENTRY *Next;
_SLIST_ENTRY *v11;
_SLIST_ENTRY *result;
unsigned __int64 v13;
__int64 v14;
__int64 v15;
unsigned __int64 v16;
__int64 v17;
__int64 v18;
unsigned __int64 v19;
_SLIST_ENTRY *v20;
__int64 v21;
__int64 *v22;
__int64 v23;
__int64 v24;
UINT64 BackTraceHash;
struct _KLOCK_QUEUE_HANDLE LockHandle;
LODWORD(BackTraceHash) = 0;
v7 = a2;
memset(&LockHandle, 0, sizeof(LockHandle));
if( (unsigned __int16)xmmword_140C4E800 < 0xAu )
{
v8 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)&xmmword_140C4E800);
goto LABEL_6;
}
v9 = RtlpInterlockedFlushSList((PSLIST_HEADER)&xmmword_140C4E800);
v8 = v9;
if( v9 )
{
Next = v9->Next;
if( v9->Next )
{
do
{
v11 = Next->Next;
ExFreePoolWithTag(Next, 0);
Next = v11;
}
while( v11 );
}
LABEL_6:
if( v8 )
goto LABEL_9;
}
LODWORD(result) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v8 = result;
if( !result )
{
byte_140C4E8FD = 1;
return result;
}
LABEL_9:
if( !v7 )
{
v17 = (*(_DWORD *)(a1 + 32) + *(_DWORD *)(a1 + 44)) & 0xFFF;
v18 = *(unsigned int *)(a1 + 40) + 4095i64;
v8[1].Next = (_SLIST_ENTRY *)a1;
v16 = v18 + v17;
*((_QWORD *)&v8[2].Next + 1) = *(_QWORD *)(a1 + 32);
LODWORD(v8[3].Next) = *(_DWORD *)(a1 + 44);
HIDWORD(v8[3].Next) = *(_DWORD *)(a1 + 40);
goto LABEL_14;
}
if( v7 == 1 )
{
v14 = (*(_DWORD *)(a1 + 32) + *(_DWORD *)(a1 + 44)) & 0xFFF;
v15 = *(_QWORD *)(a1 + 16) + 4095i64;
v8[1].Next = (_SLIST_ENTRY *)1;
v16 = v15 + v14;
LABEL_14:
v13 = v16 >> 12;
goto LABEL_15;
}
v13 = *(_QWORD *)(a1 + 16) >> 12;
v8[1].Next = 0i64;
LABEL_15:
v19 = v13 + 1;
if( (a3 & 2) == 0 )
v19 = v13;
*((_QWORD *)&v8[1].Next + 1) = v19;
RtlCaptureStackBackTrace(1ui64, 7ui64, (PVOID *)&v8[4].Next + 1, &BackTraceHash);
v20 = *(_SLIST_ENTRY **)(a1 + 24);
v8[2].Next = v20;
*((_QWORD *)&v8[3].Next + 1) = *(_QWORD *)(a1 + 48);
LODWORD(v8[4].Next) = (4 * (a4 & 3)) | a3 & 1 | (__int64)v8[4].Next & 0xFFFFFFE0 | ((a3 & 2) != 0 ? 0x10 : 0);
v21 = 40543i64 * (unsigned int)((unsigned __int64)v20 >> 12);
KeAcquireInStackQueuedSpinLock(&qword_140C4E810, &LockHandle);
v22 = &qword_140C4F570[2 * (((unsigned __int8)v21 ^ BYTE4(v21)) & 0xF)];
v23 = *v22;
if( *(__int64 **)(*v22 + 8) != v22 )
__fastfail(3u);
*((_QWORD *)&v8->Next + 1) = v22;
v8->Next = (_SLIST_ENTRY *)v23;
*(_QWORD *)(v23 + 8) = v8;
*v22 = (__int64)v8;
qword_140C4F670 += v19;
v24 = ++qword_140C4F678;
if( qword_140C4F678 > (unsigned __int64)qword_140C4F680 )
qword_140C4F680 = v24;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (_SLIST_ENTRY *)(unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
MiMapContiguousMemory
MmAllocateMappingAddressEx
MmMapLockedPagesSpecifyCache
MmMapMdl