Um die Bedeutung der Bytes im Datenwert von Failureregistrierungsschlüssel zu erklären, werde ich dieses Beispiel nehmen:
Die Bytes in dieser Darstellung dieser Struktur entsprechen:
typedef struct _SERVICE_FAILURE_ACTIONS {
DWORD dwResetPeriod;
LPTSTR lpRebootMsg;
LPTSTR lpCommand;
DWORD cActions;
SC_ACTION *lpsaActions;
} SERVICE_FAILURE_ACTIONS, *LPSERVICE_FAILURE_ACTIONS;
Die ersten vier Bytes 80 51 01 00
sind der Wert von dwResetPeriod
Strukturelement. Es ist die Zeit, nach der die Fehlerzählung auf Null zurückgesetzt wird, wenn keine Fehler auftreten. Es wird in Sekunden gezählt. In diesem Beispiel ist der Reset-Zeitraum 0x15180 Sekunden (wegen Little Endian). Im Dezimalformat entspricht es 86400 Sekunden oder entspricht 24 Stunden. Wenn also in einem Zeitraum von 24 Stunden keine Fehler auftreten, wird der Fehlerzähler auf Null zurückgesetzt. Die folgenden vier Bytes 00 00 00 00
entsprechen lpRebootMsg
. Weitere Informationen zum Mitglied dieser Struktur und zur nächsten finden Sie unter here
Die nächsten vier Bytes 00 00 00 00
entsprechen lpCommand
. Die nächsten vier Bytes 03 00 00 00
entsprechen cActions
. Dieses Mitglied ist die Anzahl der Elemente im Array lpsaActions
. In diesem Fall haben wir 3 Elemente.
Die nächsten vier Bytes 14 00 00 00
entsprechen lpsaActions
, was ein Zeiger auf ein Array vom Typ SA_ACTION
ist.
Schließlich ist 01 00 00 00 60 EA 00 00 01 00 00 00 60 EA 00 00 00 00 00 00 00 00 00 00
der Inhalt eines Arrays vom Typ SC_ACTION
von lpsaActions
gezeigt. Wir haben 3 Instanzen dieser Struktur, die den 3 Zeilen von Bytes entsprechen.Die Struktur SC_ACTION
wird unten erklärt:
typedef struct _SC_ACTION {
SC_ACTION_TYPE Type;
DWORD Delay;
} SC_ACTION, *LPSC_ACTION;
Mehr Infos über SC_ACTION
und SC_ACTION_TYPE
können here finden.
Also, erste Zeile 01 00 00 00 60 EA 00 00
bedeutet: "Im Falle eines Ausfalls, starten Sie den Dienst (01 00 00 00
) nach 60 sec (60 EA 00 00
== zu 0xEA60 ms == 60000 ms == 60 sec)." Die zweite Zeile bedeutet dasselbe. Die dritte Zeile bedeutet "Im Fehlerfall keine Maßnahme ergreifen (00 00 00 00
) nach 0 Sekunden (00 00 00 00
)"
Wie funktioniert das? Jedes Mal, wenn ein Service fehlschlägt, inkrementiert der Service-Controller einen Fehlerzähler N
und führt die Aktion N-1
aus, die in dem Array angegeben ist, auf das lpsaActions
zeigt. In unserem Fall, wenn der Dienst zum ersten Mal fehlschlägt, wird N
auf 1 erhöht und der Controller führt die durch 0
indizierten Aktionen aus, was bedeutet, dass der Dienst nach 60 Sekunden neu gestartet wird. Beim zweiten Mal wird die N
auf 2 erhöht und die Aktion N-1 = 1
wird genommen, was bedeutet, dass der Dienst nach 60 Sekunden neu gestartet wird. Beim dritten Mal, wenn der Dienst fehlschlägt, führt der Controller die letzte Aktion im Array aus, die in unserem Fall keine Aktion ausführt. Wenn N
größer als cActions
ist, wiederholt der Service Controller die letzte Aktion im Array. In diesem Fall wird der Dienst nicht mehr gestartet.
@Magg das ist eine gute Antwort, Sie sollten es als solche markieren! – khargoosh