怎么使系统服务进程无法终止?就像某些Windows系统进程那样,或者显示“无法完成操作  禁止访问”
还有就是如何编程设置系统服务的之间的依存关系,比如要关闭Server进程必须要同时关闭Computer Browser进程...

解决方案 »

  1.   

    只要编写的服务程序不响应SERVICE_CONTROL_STOP就可以了
      

  2.   

    没有绝对结束不了的进程.只能是windows自带的进程管理器结束不了而已.通过把自己编写的程序提升到SE_PRIVILEGE_ENABLED权限,然后利用TerminateProcess(OpenProcess(PROCESS_TERMINATE ,FALSE,进程号,0);连0号进程都可以结束(结果是蓝屏而已).
      

  3.   


    谁说"没有绝对结束不了的进程"的?system idle process就是不能结束的
      

  4.   

    system idle process不是真正的进程,只是用来表示空闲CPU时间的代替进程.
      

  5.   

    可能是SetServiceStatus函数实现的。
    试试看,我没有用过。
      

  6.   

    转自老侃第一站:怎么做一个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;
    }
      

  7.   

    怎么建工程放test1 和test2