ExInitializeLookasideListExInternal

NTSTATUS __stdcall ExInitializeLookasideListExInternal(
        _LOOKASIDE_LIST_EX *Lookaside,
        VOID **Allocate,
        POOL_TYPE a3,
        UINT64 a4,
        UINT64 a5,
        _LOOKASIDE_LIST_EX *a6,
        VOID *Free,
        VOID *a8,
        _LOOKASIDE_LIST_EX *a9,
        INT64 PoolType,
        INT64 Flags,
        UINT64 Size,
        INT64 Tag,
        INT64 Depth,
        UINT64 CacheDisabled){
  int v15; 
  __int16 v17; 
  VOID(__stdcall *v19)(VOID *, VOID *); 
  unsigned __int16 v20; 
  int v21; 
  int v22; 
  _LIST_ENTRY *v23; 
  UINT64 *v24; 
  unsigned __int64 v25; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *p_ListEntry; 
  unsigned int v29; 

  v15 = a4;
  v17 = (__int16)a8;
  v19 = *(VOID(__stdcall **)(VOID *, VOID *))&a3;
  if( (_WORD)a8 )
  {
    if( (unsigned __int16)((_WORD)a8 - 256) > 0x300u )
      return -1073741578;
  }
  else
  {
    v17 = 256;
  }
  v20 = 0;
  if( !(_DWORD)a9 )
    v20 = v17;
  v21 = 8;
  if( (unsigned __int64)a6 > 8 )
    v21 = (int)a6;
  v29 = v21;
  if( (((_DWORD)a5 - 1) & (unsigned int)a5) != 0 || (a5 & 0xFFFFFFFC) != 0 )
    return -1073741581;
  if( (a5 & 1) != 0 )
  {
    v22 = 16;
  }
  else
  {
    v22 = 0;
    if( (_DWORD)a5 )
      v22 = 8;
  }
  if( (a4 & 0xFFFFFC18) != 0 || (a4 & 3) == 3 )
    return -1073741582;
  v23 = (_LIST_ENTRY *)((char *)&WheapDeferredInternalLogsEventLock + 2832);
  v24 = (UINT64 *)((char *)&WheapDeferredInternalLogsEventLock + 2880);
  if( (a4 & 1) != 0 )
    v23 = (_LIST_ENTRY *)((char *)&WheapDeferredInternalLogsEventLock + 2816);
  if( (a4 & 1) != 0 )
    v24 = (UINT64 *)((char *)&WheapDeferredInternalLogsEventLock + 2848);
  InitializeSListHead(&Lookaside->L.ListHead);
  Lookaside->L.Depth = ExMinimumLookasideDepth;
  Lookaside->L.Tag = (unsigned int)Free;
  Lookaside->L.Size = v29;
  Lookaside->L.MaximumDepth = v20;
  *(_QWORD *)&Lookaside->L.TotalAllocates = 0i64;
  *(_QWORD *)&Lookaside->L.TotalFrees = 0i64;
  Lookaside->L.Type = v15 | v22;
  if( !Allocate )
    Allocate = (VOID **)CmpAllocateTransientPoolWithTag;
  Lookaside->L.AllocateEx = (void *(__fastcall *)(_POOL_TYPE, unsigned __int64, unsigned int, _LOOKASIDE_LIST_EX *))Allocate;
  if( !v19 )
    v19 = ExFreePoolEx;
  Lookaside->L.FreeEx = (void(__fastcall *)(void *, _LOOKASIDE_LIST_EX *))v19;
  *(_QWORD *)&Lookaside->L.LastTotalAllocates = 0i64;
  v25 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(v24);
  if( (_DWORD)a9 )
  {
    Lookaside->L.Depth = v20;
    Lookaside->L.MaximumDepth = -1;
  }
  else if( !ExMinimumLookasideDepth )
  {
    *(_DWORD *)&Lookaside->L.Depth = -65536;
  }
  Blink = v23->Blink;
  p_ListEntry = &Lookaside->L.ListEntry;
  if( Blink->Flink != v23 )
    __fastfail(3u);
  p_ListEntry->Flink = v23;
  p_ListEntry->Blink = Blink;
  Blink->Flink = p_ListEntry;
  v23->Blink = p_ListEntry;
  KxReleaseSpinLock(v24);
  __writecr8(v25);
  return 0;
}

Referenced by:

VmInitSystem