关于Services.exe

来源:互联网 发布:it行业java发展趋势 编辑:程序博客网 时间:2024/06/13 09:05

[MSDN的描述]

Services.exe is a process that supplements the Device.exe process. If a device driver crashes when running in Device.exe, it may corrupt other, unrelated device drivers that are currently running, and crash the entire system. Running services in Services.exe decreases the likelihood of a system failure in the event of a service crash. Services.exe also provides enhanced loading capabilities such as support for starting, pausing, and stopping services.

 

Activating a Service Programmatically

Services.exe can load a service based on the value located in the built-in registry key located under the HKEY_LOCAL_MACHINE/Services/<Service Name> registry key. This will allow the service to be restarted if it has been completely unloaded.

To load a service programmatically, you must call the ActivateService function. The following code example shows how to load the Telnet server using ActivateService.

ActivateService(L"TELNETD", 0);

A call to ActivateService will cause Services.exe to load the Telnet server based on the settings located under the HKEY_LOCAL_MACHINE/Services/TELNETD registry key. Upon completion of loading the service, ActivateService will load any super service sockets that are appropriate.

To load a service that is running multiple instances from the same DLL, call the RegisterService function instead of ActivateService.

 

Registering a Service Programmatically

 You can also start a service by calling the RegisterService function. RegisterService is analogous to the RegisterDevice function, which is used to start device drivers running under Device.exe.

The ActivateService function loads a service based on the information specified in the HKEY_LOCAL_MACHINE/Services/<Service Name> registry key. RegisterDevice enables you to define additional parameters, such as the instance of the service, which is specified in the dwIndex parameter. To load a specific instance of a service that has multiple instances running from the same DLL, use RegisterService instead of ActivateService.

The following code example shows how to start Telnet server using RegisterService.

HANDLE hService = RegisterService("TEL",0,"telnetd.dll",0);

If the Telnet server is currently running on TEL0, Services.exe will return FALSE and set the last error to ERROR_DEVICE_IN_USE.

The response of a service to xxx_Init (Services.exe) is dependent on the service, although there are flags defined in the Services.h file for the dwContext value. The following flags are defined:

#define SERVICE_INIT_STARTED     0x00000000#define SERVICE_INIT_STOPPED     0x00000001

If the SERVICE_INIT_STOPPED flag is not set in dwContext, then the service is responsible for creating a thread, on startup, for it to call the accept function. This scenario assumes that it is a network-based service. If the SERVICE_INIT_STOPPED flag has been set in dwContext, the service will not be required to create a thread because the service will be using super services to handle the accept thread.

Super service sockets associated with a service should be bound to that service if it has been loaded either at the Services.exe initialization or by using the ActivateService. A service that is started by calling the RegisterService function requires an application to bind all ports to the super service if necessary. Services.exe does not automatically bind to the ports of a service that is started with RegisterService, even if the service has ports listed in the registry.

原创粉丝点击