VC 如何创建服务???

VC 如何创建服务???,第1张

这是我前几天写的一个例子:我给你注释一下,如果还不懂,就加我:Q11(59)Q(59)903

// ProcApp.cpp : 定义控制台应用程序的入口点。

//

#pragma once

#include "stdafx.h"

#include <windows.h>

#include <winioctl.h>

//这是我自定义的类型,和你问和问题无关,你就把它当成一个类型就是了

typedef struct _CALL_BACK

{

HANDLE pParentId

HANDLE pProcessId

BOOLEAN bCreate

}CALLBACKINFO,*PCALLBACKINFO

//这个定义也和创建服务无关。你就把它当成一个常量吧

#define IOCTL_NTPROCDRV_GET_PROCINFO CTL_CODE(FILE_DEVICE_UNKNOWN,0x0800,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)

int _tmain(int argc, _TCHAR* argv[])

{

wchar_t szSymlName[]=L"slNTProcDrvYH"

wchar_t szDriverPath[MAX_PATH]

wchar_t *p

::GetFullPathName(L"服务.sys",MAX_PATH,szDriverPath,&p)

//上面这个是得到服务的可执行文件路径,一个服务总有一个可执行文件的

//打开服务管理器,第一个参数是计察卜算机名,本机就用NULL,第二个是数据库名

//默认数据库就用NULL,第三个是访问权限。这个API返回服务管理器句柄

SC_HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS)

if (!scm)

{

printf("OpenSCManager失败!"祥答)

return 0

}

//这个是创建服务,它的第一个参数是服务管理器的句柄,第二个参数是服务

//名,第三个参数是服务的显示名,第四个参数是权限设置,第五个是服务类

//型,其它的你看一下MSDN吧

SC_HANDLE scs=CreateService(scm,szSymlName,szSymlName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,szDriverPath,NULL,0,NULL,NULL, NULL)

if (!scs)

{

int nError=GetLastError()

if (nError==ERROR_SERVICE_EXISTS||nError==ERROR_SERVICE_MARKED_FOR_DELETE)

{

scs=OpenService(scm,szSymlName,SERVICE_ALL_ACCESS)

}

if (!scs)

{

printf("CreateService失败!%d",GetLastError())

return 0

}

}

//这里是启动服务

if (!::StartService(scs,0,NULL))

{

int nError=::GetLastError()

if (nError!=ERROR_SERVICE_ALREADY_RUNNING)

{

printf("StartService失败!%d\n",nError)

CloseServiceHandle(scs)

CloseServiceHandle(scm)

return 0

}

}

//下面的和谨没慧你的问题没有关了,你可以不用看了,但是后面有个关闭句柄的,不要忘了

HANDLE hDriver=::CreateFile(L"\\\\.\\slNTProcDrv",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)

if (hDriver==INVALID_HANDLE_VALUE)

{

printf("打开设备失败!")

return 0

}

HANDLE hProcessEvent=::OpenEvent(SYNCHRONIZE,FALSE,TEXT("Global\\NTProcDrvProcessEvent"))

if (!hProcessEvent)

{

printf("OpenEvent失败!%d\n",::GetLastError())

CloseServiceHandle(scs)

CloseServiceHandle(scm)

return 0

}

CALLBACKINFO callbackinfo,callbacktemp={0}

while(::WaitForSingleObject(hProcessEvent,INFINITE)==WAIT_OBJECT_0)

{

DWORD nBytsReturn

BOOL bRet=::DeviceIoControl(hDriver,IOCTL_NTPROCDRV_GET_PROCINFO,NULL,0,(LPVOID)&callbackinfo,sizeof(callbackinfo),&nBytsReturn,NULL)

if (bRet)

{

if (callbackinfo.bCreate!=callbacktemp.bCreate||callbacktemp.pParentId!=callbackinfo.pParentId||callbackinfo.pProcessId!=callbacktemp.pProcessId)

{

if (callbackinfo.bCreate)

{

printf("有进程被创建,PID:%d\n",callbackinfo.pProcessId)

}

else

{

printf("有进程被结束,PID: %d\n",callbackinfo.pProcessId)

}

}

}

else

{

printf("进程信息获取失败!")

break

}

}

CloseHandle(hDriver)

SERVICE_STATUS ss

::ControlService(scs,SERVICE_CONTROL_STOP,&ss)

::DeleteService(scs)

::CloseServiceHandle(scs)

::CloseServiceHandle(scm)

return 0

}

服务程序有自己的框架的 示例羡李代码 如下 :

#include "stdafx.h"

#include "InetIp.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

#include <Winsvc.h>

#define SLEEP_TIME 1000

BOOL gbInstall = FALSE

TCHAR gaszServiceName[] = _T("InetIp")

SERVICE_STATUS_HANDLE ghServiceStatus = NULL

SERVICE_STATUS gtStatus

//定义全局函数变量

void Init()

BOOL IsInstalled()

BOOL Install()

BOOL Uninstall()

void WINAPI ServiceMain()

void WINAPI ServiceStrl(DWORD dwOpcode)

//*********************************************************

//Functiopn: Init

//Description: 初始化

//Calls: main

//Called By:

//Table Accessed:

//Table Updated:

//Input:

//Output:

//Return:

//Others:

//History:

// <author>niying <time>2006-8-10 <version> <desc>

//*********************************************************

void Init()

{

ghServiceStatus = NULL

gtStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS

gtStatus.dwCurrentState = SERVICE_STOPPED

gtStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP

gtStatus.dwWin32ExitCode = 0

gtStatus.dwServiceSpecificExitCode = 0

gtStatus.dwCheckPoint = 0

gtStatus.dwWaitHint = 0

}

//*********************************************************

//Functiopn: ServiceMain

//Description: 服务主函数,这在里进行兄脊迟控制对服务野带控制的注册

//Calls:

//Called By:

//Table Accessed:

//Table Updated:

//Input:

//Output:

//Return:

//Others:

//History:

// <author>niying <time>2006-8-10 <version> <desc>

//*********************************************************

void WINAPI ServiceMain()

{

gtStatus.dwServiceType = SERVICE_WIN32

gtStatus.dwCurrentState = SERVICE_START_PENDING

gtStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN

gtStatus.dwWin32ExitCode = 0

gtStatus.dwServiceSpecificExitCode = 0

gtStatus.dwCheckPoint = 0

gtStatus.dwWaitHint = 0

ghServiceStatus = RegisterServiceCtrlHandler(gaszServiceName,

(LPHANDLER_FUNCTION)ServiceStrl)

if (ghServiceStatus == (SERVICE_STATUS_HANDLE)0)

{

// Registering Control Handler failed

return

}

// We report the running status to SCM.

gtStatus.dwCurrentState = SERVICE_RUNNING

SetServiceStatus(ghServiceStatus, &gtStatus)

while (gtStatus.dwCurrentState == SERVICE_RUNNING)

{

Sleep(SLEEP_TIME)

}

return

}

//*********************************************************

//Functiopn: ServiceStrl

//Description: 服务控制主函数,这里实现对服务的控制,

// 当在服务管理器上停止或其它 *** 作时,将会运行此处代码

//Calls:

//Called By:

//Table Accessed:

//Table Updated:

//Input: dwOpcode:控制服务的状态

//Output:

//Return:

//Others:

//History:

// <author>niying <time>2006-8-10 <version> <desc>

//*********************************************************

void WINAPI ServiceStrl(DWORD dwOpcode)

{

switch(dwOpcode)

{

case SERVICE_CONTROL_STOP:

gtStatus.dwWin32ExitCode = 0

gtStatus.dwCurrentState = SERVICE_STOPPED

SetServiceStatus (ghServiceStatus, &gtStatus)

return

case SERVICE_CONTROL_SHUTDOWN:

gtStatus.dwWin32ExitCode = 0

gtStatus.dwCurrentState = SERVICE_STOPPED

SetServiceStatus (ghServiceStatus, &gtStatus)

return

default:

// Report current status

SetServiceStatus (ghServiceStatus, &gtStatus)

break

}

return

}

//*********************************************************

//Functiopn: IsInstalled

//Description: 判断服务是否已经被安装

//Calls:

//Called By:

//Table Accessed:

//Table Updated:

//Input:

//Output:

//Return:

//Others:

//History:

// <author>niying <time>2006-8-10 <version> <desc>

//*********************************************************

BOOL IsInstalled()

{

BOOL bResult = FALSE

//打开服务控制管理器

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)

if (hSCM != NULL)

{

//打开服务

SC_HANDLE hService = ::OpenService(hSCM, gaszServiceName, SERVICE_QUERY_CONFIG)

if (hService != NULL)

{

bResult = TRUE

::CloseServiceHandle(hService)

}

::CloseServiceHandle(hSCM)

}

return bResult

}

//*********************************************************

//Functiopn: Install

//Description: 安装服务函数

//Calls:

//Called By:

//Table Accessed:

//Table Updated:

//Input:

//Output:

//Return:

//Others:

//History:

// <author>niying <time>2006-8-10 <version> <desc>

//*********************************************************

BOOL Install()

{

if (IsInstalled())

{

Uninstall()

}

//打开服务控制管理器

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)

if (hSCM == NULL)

{

return FALSE

}

// Get the executable file path

TCHAR aszFilePath[MAX_PATH]

::GetModuleFileName(NULL, aszFilePath, MAX_PATH)

//创建服务

SC_HANDLE hService = ::CreateService(

hSCM, gaszServiceName, gaszServiceName,

SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,

SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,

aszFilePath, NULL, NULL, _T(""), NULL, NULL)

if (hService == NULL)

{

::CloseServiceHandle(hSCM)

return FALSE

}

::CloseServiceHandle(hService)

::CloseServiceHandle(hSCM)

return TRUE

}

//*********************************************************

//Functiopn: Uninstall

//Description: 删除服务函数

//Calls:

//Called By:

//Table Accessed:

//Table Updated:

//Input:

//Output:

//Return:

//Others:

//History:

// <author>niying <time>2006-8-10 <version> <desc>

//*********************************************************

BOOL Uninstall()

{

SERVICE_STATUS status

if (!IsInstalled())

{

return TRUE

}

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)

if (hSCM == NULL)

{

return FALSE

}

SC_HANDLE hService = ::OpenService(hSCM, gaszServiceName, SERVICE_STOP | DELETE)

if (hService == NULL)

{

::CloseServiceHandle(hSCM)

return FALSE

}

::ControlService(hService, SERVICE_CONTROL_STOP, &status)

//删除服务

BOOL bDelete = ::DeleteService(hService)

::CloseServiceHandle(hService)

::CloseServiceHandle(hSCM)

if (bDelete)

{

return TRUE

}

return FALSE

}

// 唯一的应用程序对象

CWinApp theApp

using namespace std

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

int nRetCode = 0

int nArgCmp = -1

BOOL bExitFlg = FALSE

UtilThread* pclsThread = NULL

// 初始化 MFC 并在失败时显示错误

if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))

{

// TODO: 更改错误代码以符合您的需要

_tprintf(_T("致命错误: MFC 初始化失败\n"))

nRetCode = 1

}

else

{

// TODO: 在此处为应用程序的行为编写代码。

Init()

SERVICE_TABLE_ENTRY st[] =

{

{ gaszServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },

{ NULL, NULL }

}

if (argc <= 1)

{

::StartServiceCtrlDispatcher(st)

return 0

}

if (2 != argc)

{

return 0

}

nArgCmp = _tcscmp(argv[1], _T("-i"))

if (0 == nArgCmp)

{

Install()

return 0

}

nArgCmp = _tcscmp(argv[1], _T("-u"))

if (0 == nArgCmp)

{

Uninstall()

}

}

return nRetCode

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12286001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存