一个被svchost调用的服务应该做成DLL,所以必须定义DLLMain函数,做为动态库的入口。
DLLMain的代码框架如下:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_DETACH:
// 将服务状态设置为SERVICE_CONTROL_STOP
notifyServiceManager(SERVICE_CONTROL_STOP, 0, 0);
break;
default:
break;
}
return TRUE;
}
这里面最重要的是当卸载DLL时,应当通知OS服务已停止,所以需要将服务的状态设置为SERVICE_CONTROL_STOP。本例调用了一个自定义的函数notifyServiceManager来完成服务状态设定,代码如下:
DWORD __currentStatus;
int notifyServiceManager(DWORD status, DWORD exitCode, DWORD progress)
{
__currentStatus = status;
SERVICE_STATUS serviceStatus;
serviceStatus.dwServiceType = SERVICE_WIN32_SHARE_PROCESS | SERVICE_INTERACTIVE_PROCESS;
serviceStatus.dwCurrentState = status;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
serviceStatus.dwW

这篇博客介绍了如何创建一个被svchost进程调用的DLL服务,包括定义DLLMain函数、ServiceMain函数以及服务控制处理函数。在DLLMain中设置了服务状态,并通过notifyServiceManager更新服务状态。ServiceMain函数注册服务控制处理函数并启动服务线程,serviceThread函数执行服务的具体操作。此外,ServiceHandler函数处理各种服务控制事件,如停止、暂停和继续服务。
最低0.47元/天 解锁文章
1327





