一、编写背景

服务程序可能是exe程序,具有单独的进程,也有可能是DLL文件依附于某个进程,或者sys文件处于系统的内核之中。它是反病毒软件与恶意软件的必争之地,对于研究安全非常重要。系统服务分为win32及驱动程序服务两种,通常我们通过services.msc查看的为win32程序,驱动程序服务需要借助第三方工具来进行查看,本实例将win32与驱动程序服务进行结合,通过radio方式进行切换查看并支持对枚举后的服务进行启动或停止操作。

二、源代码核心实现

// ServicesTestDlg.cpp : 实现文件
//#include "stdafx.h"
#include "ServicesTest.h"
#include "ServicesTestDlg.h"
#include "afxdialogex.h"
#include <Winsvc.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CServicesTestDlg 对话框CServicesTestDlg::CServicesTestDlg(CWnd* pParent /*=NULL*/): CDialogEx(CServicesTestDlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CServicesTestDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, m_RunList);
}BEGIN_MESSAGE_MAP(CServicesTestDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, &CServicesTestDlg::OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON2, &CServicesTestDlg::OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON3, &CServicesTestDlg::OnBnClickedButton3)ON_BN_CLICKED(IDC_RADIO2, &CServicesTestDlg::OnBnClickedRadio2)ON_BN_CLICKED(IDC_RADIO1, &CServicesTestDlg::OnBnClickedRadio1)
END_MESSAGE_MAP()// CServicesTestDlg 消息处理程序BOOL CServicesTestDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);         // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);// TODO: 在此添加额外的初始化代码initServiceList();//初始化showRunList();//显示内容return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CServicesTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CServicesTestDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CServicesTestDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}//初始化服务内容
void CServicesTestDlg::initServiceList()
{//LONG lStyle;lStyle = GetWindowLong(m_RunList.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_EX_GRIDLINES; //设置styleSetWindowLong(m_RunList.m_hWnd, GWL_STYLE, lStyle);//设置stylem_RunList.InsertColumn(0,"服务名");m_RunList.InsertColumn(1,"显示名");m_RunList.InsertColumn(2,"状态");m_RunList.SetColumnWidth(0, 100);m_RunList.SetColumnWidth(1, 250);m_RunList.SetColumnWidth(2, 50);
//  m_RunList.InsertItem(0,"aaa");
//  m_RunList.SetItemText(0,1,"test");
//  m_RunList.SetItemText(1,2,"test2");
}
//显示内容
void  CServicesTestDlg::showRunList(DWORD dwServiceType)
{m_RunList.DeleteAllItems();//打开服务管理器SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);if(NULL == hSCM){AfxMessageBox("打开失败");return ;}DWORD serviceCount = 0;DWORD dwSize = 0;LPENUM_SERVICE_STATUS serviceInfo;//第一次调用,主要获取内存空间实际大小BOOL  bRet = EnumServicesStatus(hSCM,//返回句柄dwServiceType,//枚举的服务类型SERVICE_STATE_ALL,//指定的状态服务NULL,//返回的指针0,//缓冲区大小&dwSize,//内存空间实际大小&serviceCount,//枚举的服务个数NULL);//返回枚举是否成功//ERROR_MORE_DATA 说明需要更大的内存缓冲区来保存数据if( !bRet && GetLastError() == ERROR_MORE_DATA ){serviceInfo =(LPENUM_SERVICE_STATUS) new BYTE[dwSize]; //分配缓冲区bRet = EnumServicesStatus(hSCM,dwServiceType, SERVICE_STATE_ALL,(LPENUM_SERVICE_STATUS)serviceInfo,dwSize, &dwSize,&serviceCount, NULL);if(!bRet){CloseServiceHandle(hSCM); //关闭return;}//遍历填充服务信息for(DWORD i=0;i<serviceCount;i++){m_RunList.InsertItem(i,serviceInfo[i].lpServiceName);m_RunList.SetItemText(i,1,serviceInfo[i].lpDisplayName);switch(serviceInfo[i].ServiceStatus.dwCurrentState){case SERVICE_PAUSED:{m_RunList.SetItemText(i,2,"暂停");break;}case SERVICE_STOPPED:{m_RunList.SetItemText(i,2,"停止");break;}case SERVICE_RUNNING:{m_RunList.SetItemText(i,2,"运行");break;}default:{m_RunList.SetItemText(i,2,"其他");}}}delete serviceInfo;//释放缓冲区}CloseServiceHandle(hSCM); //关闭
}//启动
void CServicesTestDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码POSITION Pos = m_RunList.GetFirstSelectedItemPosition();int nSelect = -1;while ( Pos ){nSelect = m_RunList.GetNextSelectedItem(Pos);}if ( -1 == nSelect ){AfxMessageBox("请选择要启动的服务");return ;}char szServiceName [MAXBYTE] = {0};m_RunList.GetItemText(nSelect,0,szServiceName,MAXBYTE);//获取选择内容SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//获取服务句柄if(hSCM == NULL){AfxMessageBox("打开服务失败");return;}SC_HANDLE hsService = OpenService(hSCM,szServiceName,SERVICE_ALL_ACCESS); //打开服务BOOL bRet = StartService(hsService,0,NULL); //启动服务if(bRet ==TRUE){m_RunList.SetItemText(nSelect, 2, "运行");}else{AfxMessageBox("启动失败!");}CloseServiceHandle(hsService);CloseServiceHandle(hSCM);
}//取消
void CServicesTestDlg::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码// TODO: 在此添加控件通知处理程序代码POSITION Pos = m_RunList.GetFirstSelectedItemPosition();int nSelect = -1;while ( Pos ){nSelect = m_RunList.GetNextSelectedItem(Pos);}if ( -1 == nSelect ){AfxMessageBox("请选择要启动的服务");return ;}char szServiceName [MAXBYTE] = {0};m_RunList.GetItemText(nSelect,0,szServiceName,MAXBYTE);//获取选择内容SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//获取服务句柄if(hSCM == NULL){AfxMessageBox("打开服务失败");return;}SERVICE_STATUS ServiceStatus;SC_HANDLE hsService = OpenService(hSCM,szServiceName,SERVICE_ALL_ACCESS); //打开服务BOOL bRet = ControlService(hsService, SERVICE_CONTROL_STOP, &ServiceStatus);//停止服务if(bRet ==TRUE){m_RunList.SetItemText(nSelect, 2, "停止");}else{AfxMessageBox("启动失败!");}CloseServiceHandle(hsService);CloseServiceHandle(hSCM);
}//退出
void CServicesTestDlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码EndDialog(0);
}//驱动程序服务
void CServicesTestDlg::OnBnClickedRadio2()
{// TODO: 在此添加控件通知处理程序代码showRunList(SERVICE_DRIVER);
}//win32
void CServicesTestDlg::OnBnClickedRadio1()
{// TODO: 在此添加控件通知处理程序代码、showRunList(SERVICE_WIN32);
}

#C++我的武器库系列#之系统服务核心技术实现相关推荐

  1. #C++我的武器库系列#之远控核心技术实现

    一.概要介绍 近期较忙,未能及时更新博客,Python告一段落后,开始基于C++的武器库核心技术实现,本期基于C++MFC,利用socket,通过非阻塞的方式实现client与server端的通信,通 ...

  2. manjaro笔记本显卡驱动_从入门到高端!AMD Radeon RX 500系列移动显卡全解析

    前言:在处理器领域,卧薪尝胆十年之久的AMD终究还是给所有玩家带来了惊喜,2017年2月推出了ZEN构架的处理器之后,相信后面的事情大家都知道了,手忙脚乱的Intel公司在不到2年的时间内连续发布了三 ...

  3. MIT、CMU 美国计算机专业最牛20名学校大点评

    约定:CS=计算机科学 (系).总的来说,前20的CS可以分成三波: 一.4个最为优秀的CS Program: Stanford, UC. Berkeley, MIT, CMU 二.6个其他前10的: ...

  4. Android缩放比例公式,android开发 缩放到指定比例的尺寸

    一种通过matrix矩阵缩放: //使用Bitmap加Matrix来缩放 public static Drawable resizeImage(Bitmap bitmap, int w, int h) ...

  5. RDS、DDS和GaussDB理不清?看这一篇足够了!

    当前,华为云提供的数据库服务主要包括三大类:关系型数据库服务,非关系型数据库服务以及数据库工具服务.如下图所示: 关系型数据库和非关系型数据库均可分为开源和自研两大类.其中,自研数据库统一为Gauss ...

  6. 无论你处于Java学习的哪个阶段,这些都适合你

    笔者整理了一些贯穿整个Java学习过程的视频资料, 无论你处于Java学习的哪个阶段,总能找到适合你的那款. 本资料是不断更新的,获取更新请仔细阅读资料中 学习前必读(非常重要).docx,有任何疑问 ...

  7. CCF C³-19@航天宏图:星链互联,创新未来——商业卫星互联网时代的思考丨开始报名...

    CCF C³活动第十九期主题是:星链互联,创新未来--商业卫星互联网时代的思考,将于2023年4月25日周二(13:30-16:30),在航天宏图北京总部举行,报名从速. 卫星互联网是基于卫星通信的互 ...

  8. 点评美国名校的(EE)和(CS)

    http://shiori.blog.edu.cn/2007/89635.html 点评美国名校的電気電子工程系(EE)和计算机科学系(CS) 点评美国名校的電気電子工程系(ECE) EE:Elect ...

  9. 美国大学计算机牛校简介

    美国大学计算机牛校简介2011-9-22 15:20:00 0 推荐 1. 斯坦福大学(Stanford University)    Stanford的CS是个很大个的CS,拥有40人以上的Facu ...

最新文章

  1. 生命或可在星际间传播
  2. 2015-01-30工作日记
  3. android4.2添加重启菜单项
  4. 华为RH2288V3服务器部署指南
  5. jdk11 jdk12_JDK 12附带紧凑数字格式
  6. java 七巧板油漆问题_七巧板颜色填充的问题?
  7. Hibernate 框架基本知识
  8. mysql查询单表的销售额_MYsql数据库单表百万数据量查询
  9. 夺命雷公狗---无限级分类NO2
  10. mysql 取字符串首字母_MySQL通过函数获取字符串汉字拼音首字母大写字符串
  11. 【图频处理】基于matlab GUI界面环图像处理与音乐播放系统【含Matlab源码 185期】
  12. STM32中assert_param的使用
  13. Unity实现鼠标拾取电脑屏幕指定区域像素点颜色
  14. 最早的支付网关(滴滴支付)和最新的聚合支付设计架构
  15. 个人学习笔记附Markdown格式下载
  16. go——垃圾回收机制(GC)
  17. C++ 判断矩形是否相交
  18. 策略分享-基于海龟交易模型的优化 暂存
  19. RHCSA认证培训+考试七天实录(一)
  20. 微计算机原理及应用第八章,微机原理第八章--8251讲解

热门文章

  1. Python字典获取值
  2. 【文件同步和备份软件】上海道宁为您带来GoodSync软件,让您轻松备份和同步您的文件
  3. python duplicated函数_Python Pandas Dataframe.duplicated()用法及代码示例
  4. 拆解PowerApps - 请假申请 -1
  5. 通话录音和CoreTelephony框架的简单使用
  6. AD软件电路图快捷键
  7. Androd Sugar框架
  8. Tomcat服务器工作原理
  9. 你这辈子最引以为傲的是什么?
  10. 分组函数——MySQL