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

HANDLE hSCManager;
HANDLE hService;hSCManager = OpenSCManagerW(NULL, // 可以指定一个远端服务器名SERVICES_ACTIVE_DATABASE, // 目前应当指定SERVICES_ACTIVE_DATABASESC_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进行管理了。主要分为了配置和管理两种类型。

Service Control Manager 服务管理器简介相关推荐

  1. MongoDB无法注册windows服务问题解决 Error connecting to the Service Control Manager: 拒绝访问 Mongodb M

    发现在mongodb.log里出现  2017-07-07T17:01:55.339+0800 I CONTROL  [main] Error connecting to the Service Co ...

  2. linux 下的 service 和systemctl 服务管理方式

    linux 下的 service  和systemctl 服务管理方式 man service 得到:执行一个system V 风格的启动脚本 service - run a System V ini ...

  3. 成功安装mysql后,为何服务管理器里找不到MySQL服务名(解析篇)

    打开cmd 控制着面板,切换到mysql的bin目录下,然后输入几个命令就可以了. 解决办法 · 如下: 首先打开cmd,切换到你的 MySql安装目录 的MySql Server的bin目录下: 运 ...

  4. 在Yaf中使用Zf2的配置和服务管理器

    测试最新的ZF2.3框架,发现zf2性能比预想的低太多, 在笔记本上每秒竟然只能响应30个请求. 测试条件: I3 380M + 4G + Windows7 + iis7 + PHP5.4(fastc ...

  5. SuperSocket 服务管理器 (ServerManager)

    SuperSocket SuperSocket 服务管理器 (ServerManager) 中文(中国)Toggle Dropdown 关键字: ServerManager, 服务管理器, 管理, 管 ...

  6. win10计算机管理器在哪,Windows10开启服务管理器图文教程|Win10系统服务管理器在哪...

    Windows10正式版系统自带有服务管理器工具,用户可以使用它对系统的所有服务进行统一管理.比如,开启或关闭某项服务,都需要打开服务管理器才能操作.那么,在Win10系统中我们该如何打开服务管理器? ...

  7. windows下dbca删除OracleserviceXXX时遇到错误:dim-00014 Cannot open the Windows NT Service Control Manager

    windows下dbca删除OracleserviceXXX时遇到错误:dim-00014 Cannot open the Windows NT Service Control Manager  O/ ...

  8. windows Server 2016点击服务管理器无响应解决办法

    产生此问题原因: 把iis及相关功能全部删除了,重启系统后该服务器就打不开服务管理器了. 解决办法: cmd 执行:Dism /online /Enable-Feature /FeatureName: ...

  9. Python 进程 manager进程管理器

    """ 使用Manager进程管理器 进行进程间的数据共享 支持类型 list, dict, Namespace, Lock, RLock, Semaphore, Bou ...

最新文章

  1. python 贴吧自动回复机-python_库学习_02_微信自动回复机器人
  2. CentOS登录root账户
  3. Altiris 7.1 安装
  4. 真人拳皇项目第六次Scrum总结——史经浩
  5. Java多线程学习二十一:ConcurrentHashMap 在 Java7 和 8 有何不同
  6. java table 内容居中_JTable内容居中显示 | 学步园
  7. pytreebank︱情感分析可视化——情感结构树
  8. QListView的使用
  9. PB调用WebService
  10. printf()函数输出数据格式汇总
  11. 电脑联想小新连上蓝牙耳机依然外放,终于解决了
  12. 如何将旧电脑变成文件存储服务器,免费的NAS系统,把旧电脑改造成NAS
  13. 【英语六级笔记】翻译部分
  14. 线性代数在计算机视觉的应用,线性代数在数据科学中的十大强大应用(二)
  15. 如何 增删改查 XML文件中的元素
  16. uni-app 拍照或从相册上传图片
  17. Mixlab做客VLAND TALK,一起聊聊如何策划一场元宇宙活动
  18. 第十三章-相关方管理
  19. pytorch框架实现老照片修复功能详细演示(GPU版)
  20. WIN10忘记账号密码,拥有PIN码或指纹解锁,如何修改密码?

热门文章

  1. 惠普星11x2二合一平板电脑评测
  2. 秦汉清华附中2021年高考成绩查询,清华附中高考成绩2018
  3. 0606算法竞赛_数学思想
  4. HUAWEI(华为)手机当做网卡给PC上网(USB方式)
  5. 七剑战歌 - 川井宪次
  6. svn: E200002: line 19: Option expected错误解决
  7. 【对讲机的那点事】玩对讲机你了解TETRA系统吗?
  8. java kill 进程命令_Windows使用Java调用taskkill命令结束进程
  9. android 后台service 实现无预览页面录像功能
  10. JDK 1.8 HashMap解析