|
|
Definition at line 28 of file clock.c.
Referenced by ExpSetTimeZoneInformation(), NtSetSystemTime(), and Phase1InitializationDiscard().
{
TIME_FIELDS TimeFields;
KIRQL OldIrql, OldIrql2;
LARGE_INTEGER DeltaTime;
PLIST_ENTRY ListHead, NextEntry;
PKTIMER Timer;
PKSPIN_LOCK_QUEUE LockQueue;
LIST_ENTRY TempList, TempList2;
ULONG Hand, i;
ASSERT((NewTime->HighPart & 0xF0000000) == 0);
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
if (HalTime) RtlTimeToTimeFields(HalTime, &TimeFields);
KeSetSystemAffinityThread(1);
OldIrql = KiAcquireDispatcherLock();
KeRaiseIrql(HIGH_LEVEL, &OldIrql2);
KeQuerySystemTime(OldTime);
SharedUserData->SystemTime.High2Time = NewTime->HighPart;
SharedUserData->SystemTime.LowPart = NewTime->LowPart;
SharedUserData->SystemTime.High1Time = NewTime->HighPart;
if (HalTime) ExCmosClockIsSane = HalSetRealTimeClock(&TimeFields);
DeltaTime.QuadPart = NewTime->QuadPart - OldTime->QuadPart;
KeBootTime.QuadPart += DeltaTime.QuadPart;
KeBootTimeBias = KeBootTimeBias + DeltaTime.QuadPart;
KeLowerIrql(OldIrql2);
if (FixInterruptTime) ASSERT(FALSE);
InitializeListHead(&TempList);
for (i = 0; i < TIMER_TABLE_SIZE; i++)
{
ListHead = &KiTimerTableListHead[i].Entry;
LockQueue = KiAcquireTimerLock(i);
NextEntry = ListHead->Flink;
while (NextEntry != ListHead)
{
Timer = CONTAINING_RECORD(NextEntry, KTIMER, TimerListEntry);
NextEntry = NextEntry->Flink;
if (Timer->Header.Absolute)
{
KiRemoveEntryTimer(Timer);
InsertTailList(&TempList, &Timer->TimerListEntry);
}
}
KiReleaseTimerLock(LockQueue);
}
InitializeListHead(&TempList2);
while (TempList.Flink != &TempList)
{
Timer = CONTAINING_RECORD(TempList.Flink, KTIMER, TimerListEntry);
RemoveEntryList(&Timer->TimerListEntry);
Timer->DueTime.QuadPart -= DeltaTime.QuadPart;
Hand = KiComputeTimerTableIndex(Timer->DueTime.QuadPart);
Timer->Header.Hand = (UCHAR)Hand;
LockQueue = KiAcquireTimerLock(Hand);
if (KiInsertTimerTable(Timer, Hand))
{
KiRemoveEntryTimer(Timer);
InsertTailList(&TempList2, &Timer->TimerListEntry);
}
KiReleaseTimerLock(LockQueue);
}
KiTimerListExpire(&TempList2, OldIrql);
KeRevertToUserAffinityThread();
}
|