为了解释 FailureActions 注册表项的数据值中字节的含义,我将举这个例子:
该表示中的字节对应于以下结构:
typedef struct _SERVICE_FAILURE_ACTIONS {
DWORD dwResetPeriod;
LPTSTR lpRebootMsg;
LPTSTR lpCommand;
DWORD cActions;
SC_ACTION *lpsaActions;
} SERVICE_FAILURE_ACTIONS, *LPSERVICE_FAILURE_ACTIONS;
前四个字节80 51 01 00
的值是dwResetPeriod
结构体的成员。如果没有故障,则在此时间后将故障计数重置为零。它以秒为单位计算。在此示例中,重置周期为 0x15180 秒(因为小端字节序)。以十进制表示,它相当于 86400 秒或等于 24 小时。因此,如果 24 小时内没有发生故障,则故障计数将重置为零。
接下来的四个字节00 00 00 00
相当于lpRebootMsg
。有关该结构成员和下一个结构成员的更多信息可以找到here https://msdn.microsoft.com/en-ca/library/windows/desktop/ms685939(v=vs.85).aspx
接下来的四个字节00 00 00 00
相当于lpCommand
.
接下来的四个字节03 00 00 00
相当于cActions
。该成员是元素的数量lpsaActions
大批。在本例中我们有 3 个元素。
接下来的四个字节14 00 00 00
相当于lpsaActions
这是一个指向类型数组的指针SA_ACTION
.
最后,01 00 00 00 60 EA 00 00
01 00 00 00 60 EA 00 00
00 00 00 00 00 00 00 00
是类型数组的内容SC_ACTION
被指出lpsaActions
。我们有这个结构的 3 个实例,对应于 3 行字节。结构SC_ACTION
声明如下:
typedef struct _SC_ACTION {
SC_ACTION_TYPE Type;
DWORD Delay;
} SC_ACTION, *LPSC_ACTION;
更多信息关于SC_ACTION
and SC_ACTION_TYPE
可以被找寻到here https://msdn.microsoft.com/en-ca/library/windows/desktop/ms685126(v=vs.85).aspx.
所以,第一行01 00 00 00 60 EA 00 00
意思是::“如果出现故障,请重新启动服务(01 00 00 00
) 60 秒后 (60 EA 00 00
== to 0xEA60 ms == 60000 ms == 60 sec)。”第二行意思相同。第三行意思是“如果失败,不采取任何行动(00 00 00 00
) 0 秒后 (00 00 00 00
)"
这是如何运作的?每次服务失败时,服务控制器都会增加失败计数N
并采取行动N-1
在指向的数组中指定lpsaActions
。在我们的例子中,服务第一次失败时,N
增加到 1,控制器将执行索引为 的操作0
这意味着,60 秒后重新启动服务。第二次就失败了N
增加到 2 并且动作N-1 = 1
采取这意味着,60 秒后重新启动服务。第三次服务失败时,控制器执行数组中的最后一个操作,在我们的例子中是不采取任何操作。如果N
大于cActions
,服务控制器重复数组中的最后一个操作。在这种情况下,服务不再启动。