MiGetUltraMdlContext
PSLIST_ENTRY __stdcall MiGetUltraMdlContext(){
unsigned int v0;
unsigned __int64 v1;
__int64 v2;
PSLIST_ENTRY result;
_SLIST_ENTRY *Pool;
_SLIST_ENTRY *v5;
int v6;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v0 = 0;
v1 = __rdtsc() >> 4;
v2 = 8i64 * KeGetCurrentPrcb()->ParentNode->Affinity.Reserved[0];
do
{
LODWORD(v1) = v1 & 7;
result = RtlpInterlockedPopEntrySList((PSLIST_HEADER)(*(&stru_140C4DB30 + 457) + ((v2 + (unsigned int)v1) << 6)));
if( result )
return result;
LOBYTE(v1) = v1 + 1;
++v0;
}
while( v0 < 8 );
if( *(&stru_140C4DB30 + 912) >= 0x80u )
return 0i64;
Pool = (_SLIST_ENTRY *)MiAllocatePool(64i64, 0x28ui64, 0x6D55694Dui64);
v5 = Pool;
if( !Pool )
return 0i64;
if( !MiCreateUltraThreadContextHelper((INT64)(&Pool->Next + 1), 3ui64, 0i64) )
{
ExFreePoolWithTag(v5, 0);
return 0i64;
}
v6 = 0;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 448, &LockHandle);
if( *(&stru_140C4DB30 + 912) >= 0x80u )
v6 = 1;
else
++*(&stru_140C4DB30 + 912);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v6 )
{
MiDeleteUltraMapContext((INT64)(&v5->Next + 1), (_XSTATE_CONFIGURATION *)3);
ExFreePoolWithTag(v5, 0);
return 0i64;
}
return v5;
}Referenced by:
MmMapMdl