目录

题外话

一、了解驱动

二、驱动加载流程

2.1 加载和卸载NT驱动的4个步骤

2.2 对应函数实现流程和代码

三、一些注意事项


题外话

虽然网上已经有很多驱动加载工具和相关代码,但自己实现一次有助于理解如何使用代码实现驱动加载。因此本篇文章只是一个学习总结。再说点题外话,不管之前耗费多久时间完成一个项目,事后最好写个总结,后期可以自己翻翻,重温一下~因为我之前完成任何一个项目,都是不懂就搜,但下次遇到相同问题时还是得上网搜(⊙o⊙)…所以想试试这种总结方法会不会让我下次遇到相同问题就不要搜百度,来搜自己博客就好啦~O(∩_∩)O哈哈~

罗里吧嗦了一堆,那开始进入正题吧!(〃'▽'〃)

一、了解驱动

如果对驱动已经有了初步的认识的同学可以跳过这部分~因为我当时是对“驱动”这个概念有点懵d(´ω`*)所以这里做个简单介绍,目的是加深自己对驱动的理解~

驱动程序是一个软件组件,可让操作系统和设备彼此通信。即驱动程序是设备驱动程序,是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。如下图所示:

驱动文件一般由扩展名 CAT、 INF、 SYS、 DLL 等文件格式组成的。

二、驱动加载流程

编写代码加载驱动的原理相当于在注册表中写入相应的字段,因此设备驱动程序的动态加载主要由SCM(服务控制管理程序)系统组件完成。

2.1 加载和卸载NT驱动的4个步骤

Step1:安装——为NT驱动创建新的服务:LoadNTDriver(自定义的函数名)

Step2:运行——开启该服务:StartNTDriver(自定义的函数名)

Step3:停止——关闭此服务:StopNTDriver(自定义的函数名)

Step4:卸载——删除NT驱动所创建的服务:UnLoadNTDriver(自定义的函数名)

2.2 对应函数实现流程和代码

2.2.1 安装【LoadNTDriver】

流程图:

加载驱动流程图

代码如下:

//装载NT驱动程序
BOOL CLoadNtDriver::loadNTDriver(CString strDriverPath)
{wchar_t  szDriverImagePath[256];CString  strDriverImagePath;DWORD   dwRtn;//得到完整的驱动路径GetFullPathName(strDriverPath, 256, szDriverImagePath, NULL);strDriverImagePath = szDriverImagePath;if (strDriverImagePath.IsEmpty()){MessageBoxW(0, L" CLoadDriver::installDriver: 请输入路径名", NULL, MB_OK | MB_ICONWARNING);return FALSE;}if (!pathIsFile(strDriverImagePath)){strDriverImagePath += L" loadNTDriver:文件不存在";MessageBoxW(0, strDriverImagePath, NULL, MB_OK | MB_ICONWARNING);return FALSE;}// 提取驱动名wchar_t szServerName[40], szShowName[40];getDriverName(strDriverImagePath, szServerName, szShowName);//打开服务控制管理器m_hServiceMgr = OpenSCManager(NULL, NULL,  SC_MANAGER_CONNECT|SC_MANAGER_CREATE_SERVICE|SC_MANAGER_ENUMERATE_SERVICE);if (m_hServiceMgr == NULL){//OpenSCManager失败showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver");return FALSE;}else{//OpenSCManager成功showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");}//创建驱动所对应的服务m_hServiceDDK = CreateService(m_hServiceMgr,szServerName,                //驱动程序的在注册表中的名字  szShowName,                // 注册表驱动程序的 DisplayName 值  SERVICE_ALL_ACCESS,            // 加载驱动程序的访问权限  SERVICE_KERNEL_DRIVER,        // 表示加载的服务是驱动程序  SERVICE_DEMAND_START,        // 注册表驱动程序的 Start 值  SERVICE_ERROR_IGNORE,        // 注册表驱动程序的 ErrorControl 值  strDriverImagePath,            // 注册表驱动程序的 ImagePath 值  NULL,NULL,NULL,NULL,NULL);//判断服务是否失败if (m_hServiceDDK == NULL){dwRtn = GetLastError();if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS){//由于其他原因创建服务失败showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");releaseHandle();return FALSE;}else{//服务创建失败,是由于服务已经创立过showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");m_hServiceDDK = OpenService(m_hServiceMgr, szServerName, SERVICE_ALL_ACCESS);}}return TRUE;
}

2.2.2 运行【StartNTDriver】

流程图:

运行驱动流程图

PS:其实启动驱动就是开启在注册表中注册的该项服务~

代码如下:

// 启动驱动
BOOL CLoadNtDriver::startNTDriver( CString strDriverPath )
{//开启此项服务if (!StartService(m_hServiceDDK, NULL, NULL)){DWORD dwRtn = GetLastError();if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING){showErrorInfo(GetLastError(), __LINE__, L"startNTDriver()");releaseHandle();return FALSE;}else{if (dwRtn == ERROR_IO_PENDING){//设备被挂住showErrorInfo(GetLastError(), __LINE__, L"startNTDriver()");releaseHandle();return FALSE;}}}//服务已经开启showErrorInfo(GetLastError(), __LINE__, L"startNTDriver()");return TRUE;
}

2.2.3 停止【StopNTDriver】

停止驱动流程图

代码如下:

// 停止驱动
BOOL CLoadNtDriver::stopNTDriver( CString strDrivePath )
{//停止驱动服务SERVICE_STATUS svcsta = { 0 };if(!ControlService(m_hServiceDDK, SERVICE_CONTROL_STOP, &svcsta)){showErrorInfo(GetLastError(), __LINE__, L"stopNTDriver()");releaseHandle();return FALSE;}//服务已经停止showErrorInfo(GetLastError(), __LINE__, L"stopNTDriver()");return TRUE;
}

2.2.1 卸载【UnLoadNTDriver】

卸载驱动流程图

代码如下:

// 卸载驱动
BOOL CLoadNtDriver::unloadNTDriver(CString strDriverPath)
{if (m_hServiceDDK == NULL){//打开驱动所对应的服务失败showErrorInfo(GetLastError(), __LINE__, L"unloadNTDriver()");releaseHandle();return FALSE;}//动态卸载驱动程序。  if (!DeleteService(m_hServiceDDK)){//卸载失败showErrorInfo(GetLastError(), __LINE__, L"unloadNTDriver()");releaseHandle();return FALSE;}showErrorInfo(GetLastError(), __LINE__, L"unloadNTDriver()");releaseHandle();return TRUE;
}

三、一些注意事项

1. 记得释放句柄!释放句柄后还要将句柄置为NULL。如果不释放句柄就会出现只能实现一次安装卸载一个驱动文件,再次点击安装该驱动文件(并没有将该工具关闭重启情况下)就会安装失败~

2.本驱动加载工具是用来加载自己写的驱动文件,不要试图 加载/运行/停止/卸载 系统的驱动文件!!!我在虚拟机上试过几次加载系统驱动文件,然后……就蓝屏了……(╥╯^╰╥)

该工具后期还会加点其他功能,实现完后再添加上来吧~到时顺便把截图也放上来,完善代码后再将完整代码发上来~

嘻嘻嘻,感谢你看到这(❁´◡`❁)*✲゚*

如果这篇文章对你有帮助的话,可以给个赞哟~O(≧▽≦)O

MFC 驱动加载工具(安装/运行/停止/卸载)相关推荐

  1. 软件或开发工具读取EXCEL文件报错ACEODBC.DLL驱动加载失败解决

    ①看是哪个office版本的ACEODBC.DLL引擎驱动加载失败或者不存在: ②在其对应的文件根目录下查找其对应的引擎加载驱动ACEODBC.DLL是否存在: 路径:C:\Program Files ...

  2. PPT美化插件 islide 安装过程问题“加载com加载项时运行出现错误”

    一.插件介绍 islide是一款功能强大的PPT美化插件,可以实现快速配色.对齐.图形定制等功能. islide 官网:iSlide- 让PPT设计简单起来 | PPT模板下载平台 二.安装过程中的问 ...

  3. matlab 读取voi文件,VOI虚拟化下的Windows网卡驱动加载方法与流程

    本发明涉及计算机技术领域,特别涉及VOI虚拟化下的Windows网卡驱动加载方法. 背景技术: 在VOI虚拟化方案中,首先需要确保网卡驱动能够提前加载到系统中,才能够实现通过网络来引导操作系统启动.现 ...

  4. Windows驱动(加载驱动)

    之前我们是使用驱动工具加载驱动,本次实验内容是使用代码 实现驱动加载和卸载 加载过程 打开SCM服务管理器 -> 创建驱动服务 -> 启动服务 -> 关闭句柄 //加载驱动 输入 驱 ...

  5. wps出现安装installer_wps总出现稿纸加载项安装怎么办 - 卡饭网

    安装Word2003稿纸加载项使用Word稿纸 安装Word2003稿纸加载项使用Word稿纸 默认情况下,Word2003没有设置稿纸格式的功能.不过用户可以通过安装微软提供的Word2003稿纸加 ...

  6. linux驱动加载流程分析

    linux驱动加载流程分析 内核是如何加载驱动的,有些是编译到内核里面,有些事编译成ko,让系统自动加载.总的说来,在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动 ...

  7. 网络云盘本地加载工具——“CloudMounter”

    CloudMounter是具有低容量SSD驱动器的笔记本电脑用户必备工具,是一款本地云盘加载工具.您可以轻松地将大多数流行云作为磁盘安装,而无需下载硬盘驱动器上的在线文件.以及带有数据加密的安全云文件 ...

  8. JDBC中驱动加载的过程分析

    JDBC中驱动加载的过程分析 作者:kenty  来源:博客园  发布时间:2007-08-20 15:01  阅读:1100 次  原文链接   [收藏]    本篇从java.sql.Driver ...

  9. WinCE流驱动加载的控制

    前段时间整理了< WinCE下调试串口的动态复用>,基本实现了调试串口与普通功能串口之间的动态切换.其中实现的方法有点欠缺,在重新烧录或者升级系统后,导致系统无法正常启动.这算是个BUG. ...

  10. 后端技术:SpringBoot配置热加载工具(devtools)笔记

    今天给大家介绍IDEA开发工具如何配置devtools热加载工具. 1.devtools原理介绍 spring-boot-devtools是spring为开发者提供的热加载工具包. 主要原理是使用了两 ...

最新文章

  1. Java项目:嘟嘟校园一卡通系统(java+JSP+Servlet+html+css+JavaScript+JQuery+Ajax+mysql)
  2. 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序 3
  3. java clone 深复制_Java的clone():深复制与浅复制
  4. 如何维护关键字_SEO人如何制定工作计划?【大站】
  5. 这28张图绝非超现实,都是在真实世界中存在的
  6. 松下计划摆脱对特斯拉依赖 与其他汽车制造商合作
  7. 使用大于16TB的ext4文件系统
  8. 【详解】消息队列和线程关系
  9. [leetcode] 140. 单词拆分 II
  10. linux命令行发送串口_从命令行在Linux中发送电子邮件
  11. php用什么打开_php文件怎么打开,用什么软件打开php文件
  12. 机器学习算法对比分析(转载)
  13. 【组合数学】错排问题 ( 递推公式 | 通项公式 | 推导过程 ) ★
  14. pr中的字幕、关键帧动画以及声音的处理
  15. OSError: [WinError 127] 找不到指定的程序。 Error loading “C:\Anaconda3\envs\Machine_Learning\lib\site-package
  16. 免费下载Xshell 7,亲测有效安装教程
  17. 前端工程师之华为手机如何打开开发者模式并进行手机调试查看原生APP效果。
  18. 张邦鑫:组织文化 - 价值观打造方法论初步
  19. php 色彩空间转换,PHP Imagemagick将灰度转换为RGB
  20. 2022-2027年中国钛加工材行业市场全景评估及发展战略规划报告

热门文章

  1. Win7 SP1 安装python 3.8时,提示 KB2533623 update is required to continue
  2. VHDL——JK触发器
  3. MIT操作系统实验-XV6项目环境搭建
  4. 关于imx8mp的es8316的芯片调试
  5. 广州坐标系转换大地2000_城市坐标系转换2000国家大地坐标系分析
  6. linux系统gaussian09,高斯(Gaussian)软件linux下安装
  7. Java实现:归并排序
  8. 【已解决】ws2_32.dll丢失怎么办?ws2_32.dll调用失败如何修复
  9. unity3D: visual Studio 调试 unity
  10. html+css入门(参考b站黑马