系统服务编程

来源:互联网 发布:像素软件 新三板 编辑:程序博客网 时间:2024/06/05 13:35

//Author: Anish C.V.
//EMail :   cv_anish@hotmail.com

#include "stdafx.h"
#include "Windows.h"
#include "Winsvc.h"
#include "time.h"

SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning=true;

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
BOOL InstallService();
BOOL DeleteService();

int main(int argc, char* argv[])
{
 if(argc>1)
 {
  if(strcmp(argv[1],"-i")==0)
  {
   if(InstallService())
    printf("/n/nService Installed Sucessfully/n");
   else
    printf("/n/nError Installing Service/n");
  }
  if(strcmp(argv[1],"-d")==0)
  {
   if(DeleteService())
    printf("/n/nService UnInstalled Sucessfully/n");
   else
    printf("/n/nError UnInstalling Service/n");
  }
  else
  {
   printf("/n/nUnknown Switch Usage/n/nFor Install use Srv1 -i/n/nFor UnInstall use Srv1 -d/n");
  }
 }
 else
 {
  SERVICE_TABLE_ENTRY DispatchTable[]={{"Service1",ServiceMain},{NULL,NULL}}; 
  StartServiceCtrlDispatcher(DispatchTable);
 }
 return 0;
}

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{

    DWORD status;
    DWORD specificError;

    m_ServiceStatus.dwServiceType        = SERVICE_WIN32;
    m_ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
    m_ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP;
    m_ServiceStatus.dwWin32ExitCode      = 0;
    m_ServiceStatus.dwServiceSpecificExitCode = 0;
    m_ServiceStatus.dwCheckPoint         = 0;
    m_ServiceStatus.dwWaitHint           = 0;
 
    m_ServiceStatusHandle = RegisterServiceCtrlHandler("Service1",ServiceCtrlHandler); 
    if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
        return;
    }    

    m_ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
    m_ServiceStatus.dwCheckPoint         = 0;
    m_ServiceStatus.dwWaitHint           = 0; 
    if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
    {

    }
 
 bRunning=true;
 while(bRunning)
 {  
  Sleep(3000); 
  //该服务所要实现功能的入口
 }

    return;
}


void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
    switch(Opcode)
    {
        case SERVICE_CONTROL_PAUSE:
            m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
            break;
 
        case SERVICE_CONTROL_CONTINUE:
            m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
            break;
 
        case SERVICE_CONTROL_STOP:
            m_ServiceStatus.dwWin32ExitCode = 0;
            m_ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
            m_ServiceStatus.dwCheckPoint    = 0;
            m_ServiceStatus.dwWaitHint      = 0;
 
            SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);

   bRunning=false;

   break;
 
        case SERVICE_CONTROL_INTERROGATE:
            break;
    }     
    return;
}

BOOL InstallService()
{

 char strDir[1024];
 HANDLE schSCManager,schService;

 GetCurrentDirectory(1024,strDir);
 strcat(strDir,"//Srv1.exe"); //服务进程名称

 schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 
 
 if (schSCManager == NULL)
  return false;

    LPCTSTR lpszBinaryPathName=strDir;
 
    schService = CreateService(schSCManager,"Service1","The Display Name Needed",           // service name to display
        SERVICE_ALL_ACCESS,        // desired access
        SERVICE_WIN32_OWN_PROCESS, // service type
        SERVICE_DEMAND_START,      // start type
        SERVICE_ERROR_NORMAL,      // error control type
        lpszBinaryPathName,        // service's binary
        NULL,                      // no load ordering group
        NULL,                      // no tag identifier
        NULL,                      // no dependencies
        NULL,                      // LocalSystem account
        NULL);                     // no password
 
    if (schService == NULL)
        return false; 
 
    CloseServiceHandle(schService);

 return true;
}


BOOL DeleteService()
{
 HANDLE schSCManager;
 SC_HANDLE hService;

 schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
 
 if (schSCManager == NULL)
  return false; 

 hService=OpenService(schSCManager,"Service1",SERVICE_ALL_ACCESS);

 if (hService == NULL)
  return false;

 if(DeleteService(hService)==0)
  return false;

 if(CloseServiceHandle(hService)==0)
  return false;
 else
  return true;
}

原创粉丝点击