windows 服务学习笔记


http://blog.csdn.net/mixu_yy/archive/2004/11/22/190712.aspx

    这是在学习windows的服务安装机制时的笔记,主要是一些函数的说明,还有我自己的代码,没有整理过比较乱

OpenSCManager

    The OpenSCManager function establishes a connection to the service control manager on the specified computer and opens the specified service control manager database.

 

    SC_HANDLE OpenSCManager(

        LPCTSTR lpMachineName,

        LPCTSTR lpDatabaseName,

        DWORD dwDesiredAccess   如果以administrators的权限创建服务的话,该字段的值为SC_MANAGER_ALL_ACCESS

    );

 

CreateService

    The CreateService function creates a service object and adds it to the specified service control manager database

 

    SC_HANDLE CreateService(

          SC_HANDLE hSCManager,

          LPCTSTR lpServiceName,    //服务的名称

          LPCTSTR lpDisplayName,   

          DWORD dwDesiredAccess,    //SERVICE_ALL_ACCESS

          DWORD dwServiceType,      //SERVICE_WIN32_OWN_PROCESS

          DWORD dwStartType,        //SERVICE_AUTO_START

          DWORD dwErrorControl,     //SERVICE_ERROR_IGNORE

          LPCTSTR lpBinaryPathName,     //指向二进制文件的路径

          LPCTSTR lpLoadOrderGroup,

          LPDWORD lpdwTagId,

          LPCTSTR lpDependencies,

          LPCTSTR lpServiceStartName,

          LPCTSTR lpPassword

        );

 

Type                    Meaning

SERVICE_FILE_SYSTEM_DRIVER      File system driver service.

SERVICE_KERNEL_DRIVER      Driver service.

SERVICE_WIN32_OWN_PROCESS       Service that runs in its own process.

SERVICE_WIN32_SHARE_PROCESS     Service that shares a process with other services.

 

StartService  启动一个服务

 

        BOOL StartService(

              SC_HANDLE hService,

              DWORD dwNumServiceArgs,

              LPCTSTR* lpServiceArgVectors

            );

 

QueryServiceStatus

 

    BOOL QueryServiceStatus(

          SC_HANDLE hService,

          LPSERVICE_STATUS lpServiceStatus

        );

 

Return:

 

    If the function succeeds, the return value is nonzero.

    If the function fails, the return value is zero. To get extended error information, call GetLastError.

 

RegisterServiceCtrlHandler:     注册一个服务

 

    SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler(

          LPCTSTR lpServiceName,        //服务的名字

          LPHANDLER_FUNCTION lpHandlerProc      //服务的控制函数的名字

        ); 

创建服务线程  服务完成的功能在这里调用

 

CreateThread

 

    HANDLE CreateThread(

          LPSECURITY_ATTRIBUTES lpThreadAttributes,

          SIZE_T dwStackSize,

          LPTHREAD_START_ROUTINE lpStartAddress,    //线程函数的名字

          LPVOID lpParameter,

          DWORD dwCreationFlags,

          LPDWORD lpThreadId

        );

 

附上我的代码

 

#include "windows.h"

#include "stdio.h"

 

//全局变量

     SERVICE_STATUS      ServiceStatus;

     SERVICE_STATUS_HANDLE ServiceStatusHandle;

 

 

//函数声明

void InstallService(char *szServicePath);

void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv);

void WINAPI ServiceControl(DWORD dwCode);

DWORD WINAPI Service(LPVOID lpvThread);      //服务功能函数

 

 

int main(int argc, char* argv[])

{     

     //定义SERVICE_TABLE_ENTRY DispatchTable[] 结构

     SERVICE_TABLE_ENTRY DispatchTable[2] =

     {

           {"mixu_yy", ServiceStart},                 

           {NULL, NULL}

     };

 

     //安装或者打开服务

     StartServiceCtrlDispatcher(DispatchTable);

     InstallService(argv[0]);

    

     return 0;

}

//函数定义

void InstallService(char *szServicePath)

{

     SC_HANDLE        schSCManager;

     SC_HANDLE        schService;     

     SERVICE_STATUS      InstallServiceStatus;

     DWORD      dwErrorCode;

    

     //打开服务管理数据库

     schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

     if(schSCManager == NULL)

     {

               //Open Service Control Manager Database Failed!;

         return;

     }

     //创建服务

     schService = CreateService(     

                                                  schSCManager,

                             "mixu_yy",

                             "mixu_yy",

                             SERVICE_ALL_ACCESS,

                             SERVICE_WIN32_OWN_PROCESS,

                             SERVICE_AUTO_START,

                             SERVICE_ERROR_IGNORE,

                             szServicePath,

                             NULL,

                             NULL,

                             NULL,

                             NULL,

                             NULL);

     if(schService == NULL)

     {

           dwErrorCode = GetLastError();

           if(dwErrorCode != ERROR_SERVICE_EXISTS)

           {

                 //创建服务失败

                 CloseServiceHandle(schSCManager);

                 return;

           }

           else

           {

                 //要创建的服务已经存在

                 schService = OpenService(schSCManager, "mixu_yy", SERVICE_START);

                 if(schService == NULL)

                 {

                       //Open Service Failed!;

                       CloseServiceHandle(schSCManager);

                       return;

                 }

           }

     }

     else

     {

           //Create Service Success!;

     }

     //启动服务

     if(StartService(schService, 0, NULL)==0 )

     {

           //启动失败

           dwErrorCode = GetLastError();

           if(dwErrorCode == ERROR_SERVICE_ALREADY_RUNNING)

           {

                 //Service already run!;

                 CloseServiceHandle(schSCManager);

                 CloseServiceHandle(schService);

                 return ;

           }

     }

     else

     {

           //Service pending

     }

 

     while(QueryServiceStatus(schService, &InstallServiceStatus) != 0)

     {

           if(InstallServiceStatus.dwCurrentState == SERVICE_START_PENDING)

           {

                 //Sleep(100);

           }

           else

           {

                 break;

           }

     }

     if(InstallServiceStatus.dwCurrentState != SERVICE_RUNNING)

     {

           //Failure!

     }

     else

     {

           //Sucess!

     }

 

     //擦屁股

     CloseServiceHandle(schSCManager);

     CloseServiceHandle(schService);

     return;

}

 

void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv)

{

     HANDLE hThread;

 

     ServiceStatus.dwServiceType      = SERVICE_WIN32;

     ServiceStatus.dwCurrentState      = SERVICE_START_PENDING;

     ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP      | SERVICE_ACCEPT_PAUSE_CONTINUE;

    

     ServiceStatus.dwServiceSpecificExitCode      = 0;

     ServiceStatus.dwWin32ExitCode            = 0;

     ServiceStatus.dwCheckPoint            = 0;

     ServiceStatus.dwWaitHint            = 0;

 

     ServiceStatusHandle = RegisterServiceCtrlHandler("mixu_yy", ServiceControl);

     if(ServiceStatusHandle == 0)

     {

           //error

           return;

     }

 

     ServiceStatus.dwCurrentState      = SERVICE_RUNNING;

     ServiceStatus.dwCheckPoint      = 0;

     ServiceStatus.dwWaitHint      = 0;

 

     if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)

     {

           //SetServiceStatus error!

           return;

     }

    

     //创建服务线程   服务完成的功能在这里调用

     hThread = CreateThread(NULL,

                       0,

                       Service,

                       NULL,

                       0,

                       NULL);

     if(hThread == NULL)

     {

           //CreateThread error!

           return;

     }

     CloseHandle(hThread);

     return;

}

 

//服务控制模块

 

void WINAPI ServiceControl(DWORD dwCode)

{

     switch(dwCode) {

     case SERVICE_CONTROL_PAUSE:

           ServiceStatus.dwCurrentState      = SERVICE_PAUSED;

           break;

 

     case SERVICE_CONTROL_CONTINUE:

           ServiceStatus.dwCurrentState      = SERVICE_RUNNING;

           break;

 

     case SERVICE_CONTROL_STOP:

           ServiceStatus.dwCurrentState      = SERVICE_STOPPED;

           ServiceStatus.dwWin32ExitCode      = 0;

           ServiceStatus.dwCheckPoint      = 0;

           ServiceStatus.dwWaitHint      = 0;

           if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)

           {

                 //SetServiceStatus error!

           }

           return;

     case SERVICE_CONTROL_INTERROGATE:

           break;

     default:

           break;

     }

 

     if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)

     {

           //SetServiceStatus error!

     }

 

     return ;

}

 

//服务线程函数

DWORD WINAPI Service(LPVOID lpvThread)

{

           //实现函数功能的地方。

       return 1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值