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