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