Sobald der Dienst SchedSvc started, scannt er die Registry unter dem Schlüssel HKLM/Software/OGroeger/SchedSvc nach Tasks . Für jeden Task, den er fehlerfrei laden kann, erzeugt er einen neuen Thread. In Abhängigkeit von dem Inhalt des Registry-Werts IntervalInMs erzeugt er entweder einen PeriodicThread (IntervalInMs > 0) oder einen PhoenixThread (IntervalInMs = 0).
Ein PeriodicThread funktioniert folgendermassen:
- Er erzeugt einen WaitableTimer mit der gegebenen Intervallänge.
- Er startet diesen WaitableTimer.
- Er wartet sowohl auf ein Signal von dem Timer als auch auf ein Signal für das Beenden des Dienstes.
- Wenn der Timer ein Signal sendet, dann erzeugt der Thread einen neuen Prozess mit dem gegebenen Programmnamen und speichert das Prozess-Handle.
- Wenn das Signal für das Beenden des Dienstes eintrifft, dann zerstört der Thread den Timer und beendet jeden Prozess für den er einen Prozess-Handle besitzt und der noch nicht beendet wurde.
- Er beendet sich selbst.
Der PhoenixThread funktioniert folgendermassen:
- Er erzeugt einen neuen Prozess mit dem gegebenen Programmnamen.
- Er wartet darauf, dass der neue Prozess beendet wird und auf ein Signal für das Beenden des Dienstes.
- Wenn der Prozess beendet wurde, erzeugt der Thread einen neuen Prozess mit dem gegebenen Programmnamen.
- Wenn das Signal eintrifft, dass der Dienst beendet werden soll, dann stoppt der Thread den gestarteten Prozess.
- Er beendet sich selbst.