// 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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)