Service Control Manager 服务管理器简介

news2024/11/26 12:20:23

在windows驱动开发流程中,写完sys驱动binary之后,为了让OS能够正确的从注册表中读取到对应的信息,并且将其load运行起来,还需要编写inf文件来描述配置驱动文件。不过这也不是必须的,可以通过ServiceControlManager直接创建一个指定驱动binary的Service并且启动。如下code:

HANDLE hSCManager;
HANDLE hService;

hSCManager = OpenSCManagerW(
                    NULL, // 可以指定一个远端服务器名
                    SERVICES_ACTIVE_DATABASE, // 目前应当指定SERVICES_ACTIVE_DATABASE
                    SC_MANAGER_CREATE_SERVICE); // 指定该SCM需要进行的操作
if (hSCManager == NULL)
{
    printf("\nOpenSCManager failed");
    return false;
}
    
hService = CreateService(hSCManager, // 之前创建的SCM句柄
                        "Test", // 服务器名
                        "TestDriver", // 显示名
                        SERVICE_START | DELETE | SERVICE_STOP, // 拥有的操作
                        SERVICE_KERNEL_DRIVER, // 创建的服务类型,和普通的服务不同,指明了创建的服务为内核驱动
                        SERVICE_DEMAND_START, // 服务的启动选项,可以选择自动启动,手动启动,以及Demand Start,只有在明确调用的时候才会被启动,重启之后不会被启动。
                        SERVICE_ERROR_IGNORE, // 当服务出现error的时候会怎么处理
                        "C:\\TestDriver.sys", // 需要被load的binary文件
                        NULL, NULL, NULL, NULL, NULL // 一些组和权限的参数
                        );

if(!hService)
{
    hService = OpenService(hSCManager, 
                            "Example", 
                            SERVICE_START | DELETE | SERVICE_STOP
                            );
}

if(hService == NULL)
{
    printf("\nCreate or Open Service failed");
    return false
}

StartService(hService, 0, NULL); // 启动之前创建的Driver Serivce。如果该服务是驱动,不需要传2,3的参数

而通常我们也会使用服务程序来控制或与驱动程序进行通信。所以先来介绍一下关于服务。

Service Control Manager管理着一个数据库,该数据库管理这所有的服务程序和驱动。并且提供了统一的访问控制方式。通过任务管理器就可以看到

可以看到里面由服务名,描述,以及状态。并且同通过右键可以控制。

同时SCM提供了一系列的API可以让开发者可以开发自己的服务,以及服务控制程序。

值得注意的一点是SCM不止是可以访问本地的服务database,如果具有远端的设备的权限则还能够管理远端的服务数据库。

要了解SCM就需要先知道它所管理的服务的基本信息。

服务程序

服务器程序本质上是一个控制台程序。入口点也是main。不同与普通的桌面应用程序,启动它的不再是用户,而是由服务管理器。当服务程序被服务管理器启动之后需要马上调用StartServiceCtrlDispatcher。从这里开始才是真正区别于桌面程序的地方。普通控制台程序当启动之后,基本就是将所有控制权力交给了开发者。而服务却需要服务启动之后第一时间在主线程中通过StartServiceCtrlDispatcher来注册ServiceMain回调函数。而在其中需要服务程序实现一系列的任务来相应SCM的各种控制指令,从而能够按照SCM的操作来进行响应。主要包含下列操作

  1. 调用RegisterServiceCtrlHandler来注册一个Handler来相应SCM所发送的所有的控制命令control code。例如SERVICE_CONTROL_SHUTDOWN,SERVICE_CONTROL_SHUTDOWN等。
  2. 服务本身需要通过SetServiceStatus来报告当前服务的状态,该状态也能在服务管理器中看到。例如初始化需要用较长时间时需要设置SERVICE_START_PENDING来在未初始化完毕时禁止接收来自于SCM的控制。
  3. 初始化任务完成之后需要将服务状态设置成SERVICE_RUNNING,此时SCM才会正常发送控制命令。
  4. 最后加入遇到了错误,需要负责设置服务SERVICE_STOP_PENDING和SERVICE_STOP从而报告当前服务停止,将错误码设置到SERVICE_STATUS中向SCM报告具体错误。

如果不考虑复杂场景下的实现,完成一个服务程序,完成上面所述的一些步骤就可以了。不过SCM为SC设计了一系列的状态转换,其中会对应于SCM对应的控制请求。具体如下图。

当实现一个服务程序之后,就能将器注册到服务数据库中,并且由SCM进行管理了。主要分为了配置和管理两种类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fiddler 抓包工具 - 全网最全最细教程,没有之一

Fiddler 简介 Fiddler 是位于客户端和服务器端的 HTTP 代理 目前最常用的 http 抓包工具之一 功能非常强大,是 Web 调试的利器 监控浏览器所有的 HTTP/HTTPS 流量 查看、分析请求内容细节 伪造客户端请求和服务器响应 测试网站的性能解密 HTTPS 的 Web 会话 全局…

Go语音基于zap的日志封装

zap日志封装 Zap是一个高性能、结构化日志库,专为Go语言设计。它由Uber开源,并且在Go社区中非常受欢迎。它的设计目标是提供一个简单易用、高效稳定、灵活可扩展的日志系统。 以下是Zap的一些主要特点: 1.高性能:Zap的性能非常出…

【Linux】权限的理解

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…

mysql exist和in的区别

一、演示用的表 为了演示二者的区别,先建立两张表 user 表和 order 表 二、in 的执行情况 in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,…

接口测试之Jenkins+Jmeter+Ant实现持续集成

安装Jenkins,见手把手教小白安装Jenkins_程序员馨馨的博客-CSDN博客 一)Linux机器上安装Jmeter 百度一下就好 二)Linux机器上安装Ant 1、下载安装包 进入Apache Ant - Binary Distributions,下载安装包,本次安装的是版…

高仿某东商城flutter版本,个人学习flutter项目

前言 高仿某东商城flutter版本,个人学习flutter项目 使用flutter_redux状态管理网络使用dio进行了简单的封装使用node项目mock服务端接口(mock_server目录)目前只实现了首页,其他功能持续更新… 同款Android Kotlin版本( https://github.co…

Mysql索引底层原理及其优化方案

1.深入理解Mysql索引底层数据结构与算法 1.1索引结构 索引及其数据结构: 二叉树红黑树Hash表B-Tree 1.1 二叉树 说明:二叉树是建立数据后,会和第一元素进行比对,当比较的元素小于第一个元素时,此时就会走第一个元素…

代码随想录算法训练营第四十三天 | 填满背包有几种方法、背包有两个维度

1049.最后一块石头的重量II 文档讲解:代码随想录 (programmercarl.com) 视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili 状态:没想到。 思路 本…

chatgpt如何引入领域知识?mit团队利用gpt4做数据增强来提升小模型在特定领域的效果

一、概述 title:Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation 论文地址:Paper page - Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation…

(6)LED点阵屏

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等 LED点阵屏分类 按颜色:单色、双色、全彩按像素:88、…

Excel模板导入导出功能测试点

近期接触的都是Web项目,有很多导入数据这个功能,导入的文件格式都是Excel,基本流程就是:下载一个Excel模板,填充数据,再将Excel表格导入,导入后可下载列表,想着这类功能的测试点基本…

springboot基于vue的地方美食分享网站

开发技术介绍 Java介绍 JavaScript是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言,便于结构的分离&…

DVWA全级别通关教程

首先选择难度,我们从low开始,如上图所示进行修改 目录 SQL手工注入 过程: low Medium high Impossible SQL 盲注 过程: SQL 工具注入 工具安装过程: 过程: low Medium High: 暴力破解 过…

教室借用-贪婪算法

问题1: 假设你有一个教室(只有一个教室),你有几个来自讲师的使用教室的请求 。应用间隔调度问题来安排尽可能多的请求,以优化教室的使用。 最早开始时间 最早开始时间(Earliest Start Time,简…

一站了解zookeeper的关键知识

ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 的架构通过冗余服务实现高可用性。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高…

maven下载和maven配置(以maven3示例)

maven下载和maven配置(以maven3示例) 1.maven下载1.1 直接使用idea捆绑的(很轻松)1.2 手动下载到本机服务器(推荐)1.2.1 官网下载maven1.2.2 选好版本后,选二进制目录 binaries1.2.3 文件选择1.…

Jmeter的Content-Type设置方式

今天调Jmeter脚本遇到一个问题:接口的请求体为Body Data时,没有在HTTP信息头管理加Content-Type参数,Content-Type: application/json,导致脚本一直跑不通,报错,一顿排查,才发现是请求头的原因。…

SpringCloud项目将某个子模块改成以war的形式打包,需要修改的地方

SpringCloud项目将某个子模块改成以war的形式打包&#xff0c;需要修改的地方 在GAV后面添加 《packaging》 war 《/packaging》 在GAV后面添加 《packaging》 war 《/packaging》 添加war打包方式 <packaging>war</packaging>添加之后项目会报错&#xff0c;工程…

Ada学习(2)Statements

文章目录 if statements / expressionif statementsif expression Case Statement / ExpressionCase StatementCase Expression Loop Statement基本循环结构 loopwhile loopFor 循环NoteFor ... loop Control VariableFor ... loop Range EvaluationDeclare block (声明代码块)…

手把手教小白安装Jenkins

一、Jenkins简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 简而言之&#xff0c;Jenkins就是一款将构建&#xff0c;打…