KeInitializeTimerTable

NTSTATUS __stdcall KeInitializeTimerTable(_KPRCB *Prcb){
  _BYTE *v1; 
  unsigned __int8 Group; 
  _LIST_ENTRY *p_Entry; 
  __int64 v5; 
  __int64 v6; 
  __int64 v8; 
  VOID **v9; 
  __int64 v10; 
  VOID **PoolWithTag; 

  if( !Prcb->Number )
  {
    if( KiSerializeTimerExpiration )
    {
      if( KiSerializeTimerExpiration != 1 )
        KiSerializeTimerExpiration = 0;
    }
    else if( (unsigned __int8)off_140C00860[0]() )
    {
      KiSerializeTimerExpiration = 1;
    }
    KiInitializeTimer2Data((CHAR)Prcb, v1);
  }
  Group = Prcb->Group;
  if( !KiPendingTimerBitmaps[2 * Group + 1] )
  {
    v8 = 0x4000i64;
    if( Group )
    {
      if( KiSerializeTimerExpiration )
      {
        v9 = 0i64;
      }
      else
      {
        PoolWithTag = ExAllocatePoolWithTag(0x204ui64, 0x4000ui64, 1649698123i64);
        v9 = PoolWithTag;
        if( !PoolWithTag )
          return -1073741670;
        memset(PoolWithTag, 0i64, 0x4000u);
        Group = Prcb->Group;
      }
    }
    else
    {
      v9 = (VOID **)&KiPendingTimersMask0;
      if( KiSerializeTimerExpiration )
        v8 = 32i64;
    }
    v10 = 2i64 * Group;
    KiPendingTimerBitmaps[v10] = 8 * v8;
    KiPendingTimerBitmaps[v10 + 1] = (__int64)v9;
  }
  Prcb->LastTick = KUSER_SHARED_DATA.TickCount.LowPart;
  KeInitializeDpc(&Prcb->TimerExpirationDpc, KiTimerExpirationDpc, 0i64);
  if( !Prcb->TimerExpirationDpc.DpcData )
    Prcb->TimerExpirationDpc.Number = Prcb->Number + 1280;
  p_Entry = &Prcb->TimerTable.TimerEntries[0][0].Entry;
  v5 = 2i64;
  do
  {
    v6 = 256i64;
    do
    {
      p_Entry[-1].Blink = 0i64;
      HIDWORD(p_Entry[1].Flink) = -1;
      LODWORD(p_Entry[1].Flink) = 0;
      p_Entry->Blink = p_Entry;
      p_Entry->Flink = p_Entry;
      p_Entry += 2;
      --v6;
    }
    while( v6 );
    --v5;
  }
  while( v5 );
  KiInitializeForceIdle((INT64)Prcb);
  return 0;
}

Referenced by:

KeInitSystem
KeStartAllProcessors
KiStartDynamicProcessor