MiInsertNewCombineBlocks
_MI_COMBINE_BLOCK *__stdcall MiInsertNewCombineBlocks(
_MI_PAGE_COMBINING_SUPPORT *Pcs,
_MI_COMBINE_BLOCK *CombineBlock,
UINT64 NumberOfEntries){
_MI_COMBINE_BLOCK *v3;
int v5;
_LIST_ENTRY *p_CombinePageFreeList;
_LIST_ENTRY *i;
_LIST_ENTRY *v8;
_KLOCK_QUEUE_HANDLE LockHandle;
v3 = CombineBlock;
memset(&LockHandle, 0, sizeof(LockHandle));
if( !MiLockPagedRange((INT64)CombineBlock, 0xF78ui64) )
return 0i64;
memset(v3, 0i64, 0xF78u);
v5 = 54;
KeAcquireInStackQueuedSpinLock(&Pcs->CombineFreeListLock, &LockHandle);
p_CombinePageFreeList = &Pcs->CombinePageFreeList;
for( i = Pcs->CombinePageFreeList.Flink; ; i = v8 )
{
v8 = (_LIST_ENTRY *)v3;
if( i->Blink != p_CombinePageFreeList )
__fastfail(3u);
*(_QWORD *)v3 = i;
*((_QWORD *)v3 + 1) = p_CombinePageFreeList;
i->Blink = (_LIST_ENTRY *)v3;
p_CombinePageFreeList->Flink = (_LIST_ENTRY *)v3;
v3 += 18;
if( !--v5 )
break;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return v3;
}Referenced by:
MiAllocateCombineProto