驱动开发:实现驱动加载卸载工具
驱动程序加载工具有许多,最常用的当属KmdManager
工具,如果驱动程序需要对外发布那我们必须自己编写实现一个驱动加载工具,当需要使用驱动时可以拉起自己的驱动,如下将实现一个简单的驱动加载工具,该工具可以实现基本的,安装,加载,关闭,卸载等操作日常使用完全没问题。
installDvr 驱动安装
#include <iostream>
#include <Windows.h>using namespace std;// 安装驱动
BOOL installDvr(CONST WCHAR drvPath[50], CONST WCHAR serviceName[20])
{// 打开服务控制管理器数据库SC_HANDLE schSCManager = OpenSCManager(NULL, // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器NULL, // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库SC_MANAGER_ALL_ACCESS // 所有权限);if (schSCManager == NULL){CloseServiceHandle(schSCManager);return FALSE;}// 创建服务对象,添加至服务控制管理器数据库SC_HANDLE schService = CreateService(schSCManager, // 服务控件管理器数据库的句柄serviceName, // 要安装的服务的名称serviceName, // 用户界面程序用来标识服务的显示名称SERVICE_ALL_ACCESS, // 对服务的访问权限:所有全权限SERVICE_KERNEL_DRIVER, // 服务类型:驱动服务SERVICE_DEMAND_START, // 服务启动选项:进程调用 StartService 时启动SERVICE_ERROR_IGNORE, // 如果无法启动:忽略错误继续运行drvPath, // 驱动文件绝对路径,如果包含空格需要多加双引号NULL, // 服务所属的负载订购组:服务不属于某个组NULL, // 接收订购组唯一标记值:不接收NULL, // 服务加载顺序数组:服务没有依赖项NULL, // 运行服务的账户名:使用 LocalSystem 账户NULL // LocalSystem 账户密码);if (schService == NULL){CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return TRUE;
}int main(int argc, char *argv[])
{if (installDvr(L"C:\\WinDDK.sys", L"service") == TRUE){cout << "驱动已安装" << endl;}getchar();return 0;
}
startDvr 启动驱动
#include <iostream>
#include <Windows.h>using namespace std;// 启动服务
BOOL startDvr(CONST WCHAR serviceName[20])
{// 打开服务控制管理器数据库SC_HANDLE schSCManager = OpenSCManager(NULL, // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器NULL, // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库SC_MANAGER_ALL_ACCESS // 所有权限);if (schSCManager == NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打开服务SC_HANDLE hs = OpenService(schSCManager, // 服务控件管理器数据库的句柄serviceName, // 要打开的服务名SERVICE_ALL_ACCESS // 服务访问权限:所有权限);if (hs == NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}if (StartService(hs, 0, 0) == 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE;
}int main(int argc, char *argv[])
{if (startDvr(L"service") == TRUE){cout << "驱动服务" << endl;}getchar();return 0;
}
stopDvr 停止驱动
#include <iostream>
#include <Windows.h>using namespace std;// 停止服务
BOOL stopDvr(CONST WCHAR serviceName[20])
{// 打开服务控制管理器数据库SC_HANDLE schSCManager = OpenSCManager(NULL, // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器NULL, // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库SC_MANAGER_ALL_ACCESS // 所有权限);if (schSCManager == NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打开服务SC_HANDLE hs = OpenService(schSCManager, // 服务控件管理器数据库的句柄serviceName, // 要打开的服务名SERVICE_ALL_ACCESS // 服务访问权限:所有权限);if (hs == NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 如果服务正在运行SERVICE_STATUS status;if (QueryServiceStatus(hs, &status) == 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}if (status.dwCurrentState != SERVICE_STOPPED &&status.dwCurrentState != SERVICE_STOP_PENDING){// 发送关闭服务请求if (ControlService(hs, // 服务句柄SERVICE_CONTROL_STOP, // 控制码:通知服务应该停止&status // 接收最新的服务状态信息) == 0) {CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 判断超时INT timeOut = 0;while (status.dwCurrentState != SERVICE_STOPPED){timeOut++;QueryServiceStatus(hs, &status);Sleep(50);}if (timeOut > 80){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE;
}int main(int argc, char *argv[])
{if (stopDvr(L"service") == TRUE){cout << "停止驱动服务" << endl;}getchar();return 0;
}
unloadDvr 卸载驱动
#include <iostream>
#include <Windows.h>using namespace std;// 卸载驱动
BOOL unloadDvr(CONST WCHAR serviceName[20])
{// 打开服务控制管理器数据库SC_HANDLE schSCManager = OpenSCManager(NULL, // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器NULL, // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库SC_MANAGER_ALL_ACCESS // 所有权限);if (schSCManager == NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打开服务SC_HANDLE hs = OpenService(schSCManager, // 服务控件管理器数据库的句柄serviceName, // 要打开的服务名SERVICE_ALL_ACCESS // 服务访问权限:所有权限);if (hs == NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 删除服务if (DeleteService(hs) == 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE;
}int main(int argc, char *argv[])
{if (unloadDvr(L"service") == TRUE){cout << "卸载驱动服务" << endl;}getchar();return 0;
}
驱动开发:实现驱动加载卸载工具相关推荐
- linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写
摘要:媒介 Device Tree是一种用去描绘硬件的数据布局,类似板级描绘说话,发源于OpenFirmware(OF).正在现在遍及应用的kernel 2.6.x版本中,对分歧仄台.分歧硬件,往] ...
- win10驱动开发4——加载/卸载驱动
注意加载卸载驱动必须是win32项目 #include <Windows.h> #include <stdio.h> int main() {//等同于创建驱动======== ...
- windows10驱动 x64--- 3环代码加载驱动(二)
windows10驱动 x64--- 3环代码加载驱动 一:了解驱动加载工具 二:应用层--3环代码示例 一:了解驱动加载工具 平时调试.sys 我们都是用的驱动加载工具:open(打开驱动文件) - ...
- oracle10 64位odbc,图文教你64位win10添加oracle odbc驱动时提示无法加载oracle如何解决...
现在电脑已成为我们工作生活的一部分,相信大家在操作电脑时一定会遇到这样那样的问题,64位win10添加oracle odbc驱动时提示无法加载oracle如何解决这个问题就是我们经常会遇到的,这样的问 ...
- Linux驱动开发 -- touch驱动注册
Linux i2c驱动开发 – touch 驱动 文章目录 Linux i2c驱动开发 -- touch 驱动 前言 一.i2c 驱动框架 二.Linux的MODULE声明 1. MODULE相关声明 ...
- Linux驱动开发——串口设备驱动
Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...
- Linux嵌入式驱动开发02——驱动编译到内核
文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...
- C#中动态加载卸载类库
网上现有很多的文章是介绍怎样开发插件化的框架的,大部分无非是用Assembly.load等方法,动态加载类库,但这种方法有个缺点,就是没有办法卸载,因为net中就没有提供卸载assembly的方法,还 ...
- 微信小程序开发动感十足的加载动画--都在这里!
微信小程序开发动感十足的加载动画--都在这里.jpg 1. 概述 我们在学习微信小程序时,应该会遇到载入图片或者动画需要等待的情况,那么这个等待的画面我们应该怎么编写呢?今天我们就分享这样的小教程. ...
- Webpack前端资源加载/打包工具
文章目录 一.Webpack 1.什么是Webpack 2.Webpack安装 2.1全局安装 2.2安装后查看版本号 3.创建项目 3.1初始化项目 3.2创建src文件夹 3.3 src下创建co ...
最新文章
- Android 实现一个验证码倒计时(Handler postDelayed 实现验证码倒计时)
- Python 技术篇-pip安装的python库缓存位置查看方法,如何查看python库源码
- [IE编程相关]之一:客户端键盘响应事件分析
- pytorch 之 有关交叉熵函数使用的几点说明
- apache和tomcat开启GZIP功能
- javadoc maven_Maven Fluido Skin和Javadoc类图
- mac mysql sequel_苹果系统Sequel Pro—MySQL客户端工具一个大坑
- tensor索引[..., 0]
- 图论算法——有向图的邻接链表实现
- 7-8 猜数字 (20 分)
- python如何安装scrapy库_Python爬虫:Scrapy框架的安装和基本使用
- Python 算法交易实验30 退而结网7-交易策略思考
- Jquery 实现json复杂查询等操作(jsonDB)
- 自然语言处理(NLP):08 TextCNN在短文本分类应用介绍
- css页面一些动态效果展示
- Oracle OR条件的优化与改写
- python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图
- 备战金九银十,腾讯 T4 梳理 2022 年最全 999 道 Java 岗必备面试题答案
- Windows 11 修改桌面文件路径
- ATJ2157内存篇【炬芯音频芯片】---sct语法