发给系统服务进程的控制请求(暂停,继续,停止等)是由windows的服务控制管理器SCM发出的吗?又是由谁具体实现的?
发给系统服务进程的控制请求(暂停SERVICE_CONTROL_PAUSE,继续SERVICE_CONTROL_CONTINUE,停止SERVICE_CONTROL_STOP等)是由windows的服务控制管理器SCM发出的吗?服务进程的暂停,继续,停止又是由谁具体实现的?
我所看到的一篇service程序代码,是在服务程序自身的ServiceCtrlHandler函数(服务状态控制函数)里利用CreateThread(),ResumeThread(),SuspendThread()等有关线程的winapi实现的。程序代码经简化后如下::
// 服務狀態控制函數
void WINAPI ServiceCtrlHandler(DWORD dwCode)
{
WriteToLog("[ServiceCtrlHandler] Function begin");
switch(dwCode)
{
case SERVICE_CONTROL_PAUSE:
ServiceStatus.dwCurrentState = SERVICE_PAUSED;
//对下处不能把握,请指教!!!!
SuspendThread(该服务进程的线程句柄);
break;
case SERVICE_CONTROL_CONTINUE: // 繼續
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
//对下处不能把握,请指教!!!!
ResumeThread(该服务进程的线程句柄);
break;
case SERVICE_CONTROL_STOP: // 終止
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
//对下处不能把握,请指教!!!!
CloseHandle(该服务进程的线程句柄);
return ;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
}
多谢!!!!
问题点数:0、回复次数:13Top
1 楼sohou(2007的春天)回复于 2004-08-02 23:54:31 得分 0
markTop
2 楼chtw999(敢问敢答)回复于 2004-08-03 09:02:30 得分 0
应该是由 SCP发给SCM,再由SCM发给服务进程的吧?Top
3 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2004-08-03 09:59:37 得分 0
我想应该是windows的服务进程吧Top
4 楼aspnetwuxueyou(SHIP IT)回复于 2004-08-03 10:28:07 得分 0
A user wanting to start, stop, or configure a service uses an SCP. Although Windows 2000 supplies built-in SCPs that provide general start, stop, pause, and continue functionality, some service applications include their own SCP that allows administrators to specify configuration settings particular to the service they manage.
Top
5 楼aspnetwuxueyou(SHIP IT)回复于 2004-08-03 10:30:54 得分 0
Refer to
chapter 5 Inside Windows 2000Top
6 楼aspnetwuxueyou(SHIP IT)回复于 2004-08-03 10:43:18 得分 0
OpenScManager,StartService through SCP->scm->main thread in service process(StartServiceCtrlDispatcher)->service thread
StartServiceCtrlDispatcher creates a service thread for each start command from scm.
servide thread calls RegisterServiceCtrlHandler immediately it is created
The start command is from the scp.This function receives and stores a table of functions that the service implements to handle various commands it receives from the SCM.
Top
7 楼chtw999(敢问敢答)回复于 2004-08-03 17:22:10 得分 0
感谢楼上几位的回答,但我依旧不得要领。我的问题是:服务进程的暂停,继续,停止又是由谁具体实现的?也就是说是在服务程序自身的ServiceCtrlHandler函数(服务状态控制函数)里利用CreateThread(),ResumeThread(),SuspendThread()等有关线程的winapi实现呢?还是利用其他方法,定义在其他地方?
Top
8 楼aspnetwuxueyou(SHIP IT)回复于 2004-08-03 17:25:11 得分 0
你没有搞明白!
启动服务的程序和服务本身其实是两个程序。
比如我我开发了一个驱动,我把它作为系统服务。
我需要另外开发一个客户端程序来启动服务(利用scp指令和SCM交互)Top
9 楼aspnetwuxueyou(SHIP IT)回复于 2004-08-03 17:27:15 得分 0
当然可以配置这个服务是自动启动的,那么操作系统在进入登录界面之前,
services.exe进程会通过帮助你启动这些服务的Top
10 楼aspnetwuxueyou(SHIP IT)回复于 2004-08-03 17:28:42 得分 0
客户端程序 --〉发送指令给SCM--〉SCM启动服务的主线程 --〉启动service threadTop
11 楼chtw999(敢问敢答)回复于 2004-08-03 20:02:43 得分 0
感谢楼上讲的,我明白你说讲的。我的问题是谁去暂停、继续一个服务,代码写在什么地方?启动好理解,但暂停、继续不好理解。
多谢!!!!Top
12 楼chtw999(敢问敢答)回复于 2004-08-04 21:03:03 得分 0
希望高人继续指点!!Top
13 楼louifox(兰陵笑笑生)回复于 2004-08-04 23:57:31 得分 0
都是在服务程序里实现的,具体可以参考<w2k服务器端应用程序设计>这本书Top




