怎么使系统服务进程无法停止?

CBuilderflying 2004-07-31 01:52:18
怎么使系统服务进程无法终止?就像某些Windows系统进程那样,或者显示“无法完成操作 禁止访问”
还有就是如何编程设置系统服务的之间的依存关系,比如要关闭Server进程必须要同时关闭Computer Browser进程...
...全文
458 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2004-09-27
  • 打赏
  • 举报
回复
怎么建工程放test1 和test2
zhoujiamurong 2004-09-27
  • 打赏
  • 举报
回复
mark
九重霄 2004-09-10
  • 打赏
  • 举报
回复
gz
toxyboy 2004-08-03
  • 打赏
  • 举报
回复
Mark
bx2000 2004-08-03
  • 打赏
  • 举报
回复
做成驱动模式的就可以了
Kudeet 2004-08-02
  • 打赏
  • 举报
回复
转自老侃第一站:

怎么做一个WinNT下无法终止的进程呢?相信有很多人会说做成服务,这样就不能被任务管理器杀死了。真的吗?不一定,普通的服务也还是能够被任务管理器杀死的,但的确在杀有些服务的时候会提示“为系统关键进程,无法停止”。系统关键进程怎么做?不会了吧,呵呵,我也不会。
我这里讲的方法实际上是不能终止的两个进程。讲到这里相信很多人都明白了,就是两个进程相互监视,一旦发现对方被杀就立刻重启对方。这样,这两个进程就很难被杀死了,至少我认为用任务管理器是不可能杀死它们的。

我的例子中,每个进程建立一个线程专门用于监视,这样主线程还可以做其他的事情。另外,注意那个互斥对象的使用。当然,这个程序可能写的不是很完美。

//test1.cpp

#include <windows.h>

DWORD WINAPI ThreadCheckProc(LPVOID lParam)
{
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi={0};
HANDLE hMutex;
char *pName=(char *)lParam;
while(true)
{
hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,pName);
if(!hMutex)
{
CreateProcess(pName,
NULL,
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ); // Pointer to PROCESS_INFORMATION structure.
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
else
{
CloseHandle(hMutex);
}
Sleep(1);
}
}

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
DWORD ThreadId;
CreateMutex(NULL,TRUE,"test1.exe");
CreateThread(NULL,0,ThreadCheckProc,(LPVOID *)"test2.exe",0,&ThreadId);
while(1)
{
Sleep(1000);
}
return 0;
}


//test2.cpp

#include <windows.h>

DWORD WINAPI ThreadCheckProc(LPVOID lParam)
{
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi={0};
HANDLE hMutex;
char *pName=(char *)lParam;
while(true)
{
hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,pName);
if(!hMutex)
{
CreateProcess(pName,
NULL,
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ); // Pointer to PROCESS_INFORMATION structure.
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
else
{
CloseHandle(hMutex);
}
Sleep(1);
}
}

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
DWORD ThreadId;
CreateMutex(NULL,TRUE,"test2.exe");
CreateThread(NULL,0,ThreadCheckProc,(LPVOID *)"test1.exe",0,&ThreadId);
while(1)
{
Sleep(1000);
}
return 0;
}
NowCan 2004-08-02
  • 打赏
  • 举报
回复
可能是SetServiceStatus函数实现的。
试试看,我没有用过。
huiker 2004-08-01
  • 打赏
  • 举报
回复
up
StarsWu 2004-08-01
  • 打赏
  • 举报
回复
system idle process不是真正的进程,只是用来表示空闲CPU时间的代替进程.
tabris17 2004-08-01
  • 打赏
  • 举报
回复

谁说"没有绝对结束不了的进程"的?

system idle process就是不能结束的
howtotell 2004-07-31
  • 打赏
  • 举报
回复
没有绝对结束不了的进程.只能是windows自带的进程管理器结束不了而已.通过把自己编写的程序提升到SE_PRIVILEGE_ENABLED权限,然后利用TerminateProcess(OpenProcess(PROCESS_TERMINATE ,FALSE,进程号,0);连0号进程都可以结束(结果是蓝屏而已).
tabris17 2004-07-31
  • 打赏
  • 举报
回复
只要编写的服务程序不响应SERVICE_CONTROL_STOP就可以了
huiker 2004-07-31
  • 打赏
  • 举报
回复
关注

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧