《Windows驱动开发技术详解》之编程加载NT式驱动

之前我们加载驱动都是利用INSTDRV这个应用,其原理是在注册表中写入相应的字段,这一节我们手动编写代码去加载驱动,其原理类似:

设备驱动程序的动态加载主要由服务控制管理程序(Service Control Manager,SCM)系统组件完成。加载和卸载NT驱动分为四个步骤:

为NT驱动创建新的服务;

开启此服务;

关闭此服务;

删除NT驱动所创建的服务。

LoadNTDriver装载驱动代码主要流程如下:

代码如下:

 1 BOOL LoadNTDriver(char*lpszDriverName, char*lpszDriverPath){
 2     char szDriverImagePath[256];
 3     //得到完整的驱动路径
 4     GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);
 5     BOOL bRet = FALSE;
 6     SC_HANDLE hServiceMgr = NULL;
 7     SC_HANDLE hServiceDDK = NULL;
 8     //打开服务控制管理器
 9     hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
10     if (NULL == hServiceMgr){
11         printf("OpenSCManager() failed : %d \n", GetLastError());
12         goto BeforeLeave;
13         bRet = FALSE;
14     }
15     else{
16         printf("OpenSCManager() OK!\n");
17     }
18     //创建驱动所对应的服务
19     hServiceDDK = CreateService(hServiceMgr,
20         lpszDriverName,
21         lpszDriverName,
22         SERVICE_ALL_ACCESS,
23         SERVICE_KERNEL_DRIVER,
24         SERVICE_DEMAND_START,
25         SERVICE_ERROR_IGNORE,
26         szDriverImagePath,
27         NULL, NULL, NULL, NULL, NULL);
28 
29     DWORD dwRtn;
30     if (NULL == hServiceDDK){
31         dwRtn = GetLastError();
32         if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS){
33             printf("CreateService failed:%d!\n", dwRtn);
34             bRet = FALSE;
35             goto BeforeLeave;
36         }
37         else{
38             printf("CreateService failed:ERROR_IO_PENDING or ERROR_SERVICE_EXISTS\n");
39         }
40         //创建失败说明服务已经存在,直接打开即可
41         hServiceDDK = OpenService(hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS);
42         if (NULL == hServiceDDK){
43             dwRtn = GetLastError();
44             printf("OpenService() failed:%d!\n", dwRtn);
45             bRet = FALSE;
46             goto BeforeLeave;
47         }
48         else{
49             printf("OpenService OK!\n");
50         }
51     }
52     else{
53         printf("CreateService OK!\n");
54     }
55 
56     //创建服务成功,开启此服务
57     bRet = StartService(hServiceDDK, NULL, NULL);
58     if (!bRet){
59         dwRtn = GetLastError();
60         if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING){
61             printf("StartService failed:%d!\n", dwRtn);
62             bRet = FALSE;
63             goto BeforeLeave;
64         }
65         else{
66             if (ERROR_IO_PENDING == dwRtn){
67                 printf("StartService() failed:ERROR_IO_PENDING");
68                 bRet = FALSE;
69                 goto BeforeLeave;
70             }
71             else{
72                 printf("StartService() failed :ERROR_SERVICE_ALREADY_RUNNING");
73                 bRet = TRUE;
74                 goto BeforeLeave;
75             }
76         }
77     }
78     bRet = TRUE;
79 BeforeLeave:
80     if (hServiceDDK){
81         CloseServiceHandle(hServiceDDK);
82     }
83     if (hServiceMgr){
84         CloseServiceHandle(hServiceMgr);
85     }
86     return bRet;
87 }

UnLoadNTDriver卸载驱动主要代码流程如下:

代码如下:

 1 BOOL UnloadNTDriver(char*szSvrName){
 2     BOOL bRet = FALSE;
 3     SC_HANDLE hServiceMgr = NULL;
 4     SC_HANDLE hServiceDDK = NULL;
 5     hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 6     if (NULL == hServiceMgr){
 7         printf("OpenSCManager() failed : %d \n", GetLastError());
 8         goto BeforeLeave;
 9         bRet = FALSE;
10     }
11     else{
12         printf("OpenSCManager() OK!\n");
13     }
14     hServiceDDK = OpenService(hServiceMgr, szSvrName, SERVICE_ALL_ACCESS);
15     if (NULL == hServiceDDK){
16         printf("OpenService() failed :%d\n", GetLastError());
17         bRet = FALSE;
18         goto BeforeLeave;
19     }
20     else{
21         printf("OpenService() OK!\n");
22     }
23     SERVICE_STATUS SvrSta;
24     //停止驱动程序
25     if (!ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta)){
26         printf("ControlService() failed:%d\n", GetLastError());
27     }
28     else{
29         printf("ControlService() OK!\n");
30     }
31     //动态卸载驱动程序
32     if (!DeleteService(hServiceDDK)){
33         printf("DeleteService() failed:%d\n", GetLastError());
34     }
35     else{
36         printf("DeleteService() OK!\n");
37     }
38     bRet = TRUE;
39 
40 BeforeLeave:
41     if (hServiceDDK){
42         CloseServiceHandle(hServiceDDK);
43     }
44     if (hServiceMgr){
45         CloseServiceHandle(hServiceMgr);
46     }
47     return bRet;
48 }

安装和卸载驱动:

注意,这里的驱动名称和路径应该设置为:

运行成功:

 

转载于:https://www.cnblogs.com/predator-wang/p/5514107.html

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

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

相关文章

教你如何成为解决问题的高手

最近看到很多初级或者准备入坑的小伙伴在问答模块提问问题 ,有的在QQ群或者微信群提问题,这个是很多新手程序员都会经历的一个过程,这种事情很正常,主要是自己都不清楚问题是什么或者描述不清楚,别人如何帮你解答呢? 目录 1.澄清问题 2.关联经验 3.问题重现 4.寻找差异 5…

mongodb存储数据_在MongoDB中存储分层数据

mongodb存储数据继续使用MongoDB进行 NoSQL之旅,我想谈一谈一个经常出现的特定用例:存储分层文档关系。 MongoDB是很棒的文档数据存储,但是如果文档具有父子关系,该怎么办? 我们可以有效地存储和查询此类文档层次结构吗…

程序员如何快速成长为IT精英

很多程序员工作了很多年,仍然只学到了皮毛点的业务和技术,技术长时间没有提升,一直拖拖拉拉处于某个水平,没有接触到核心业务,也难于成为公司的中流砥柱和骨干。那么程序员该如何成长呢? 1.主动学习 时刻保持危机感,对知识保持好奇心,完善自己的职业规划和知识体系,掌…

hdu1521 指数型母函数

排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3438 Accepted Submission(s): 1439Problem Description有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品…

【Java从入门到天黑|06】高质量男性SpringBoot入门及原理(基础总结版,强烈建议收藏)

目录 SpringBoot简介 Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。 helloWorld

JavaFX实际应用程序:AISO HRC-Matic

“ Real-World JavaFX Apps”系列中的第三个应用程序是一种重型数据输入应用程序,由称为HRC-Matic的关系数据库支持。 它是由AISO在日内瓦开发的。 AISO是一家专门开发基于JavaFX的业务应用程序的公司。 他们还在研究我在本系列的第一个博客( 欧洲广播联…

Feather包实现数据框快速读写,你值得拥有

什么是Feather? Feature是一种文件格式,支持R语言和Python的交互式存储,速度更快。目前支持R语言的data.frame和Python pandas 的DataFrame。 Feather收到了Apache arrow 项目的支持,Apache Arrow是Apache基金会下一个全新的开源项…

一文教你学会需求分析与管理

大家好,我是孙叫兽,本期给大家分享需求分析与管理,在项目开始或者需求整理时,这方面的知识显得尤为重要,常言道:良好的开始是成功的一半! 1.需求的定义 产品需求是在一定的时期,一定的场景中,无论是心理上还是生理上的,用户有着某种“需要”,这种“需要”用户自己不…

java 编写代码_Java 7:如何编写非常快速的Java代码

java 编写代码当我第一次写此博客时,我的目的是向您介绍ThreadLocalRandom类,它是Java 7中新增的用于生成随机数的类。 我在一系列微基准测试中分析了ThreadLocalRandom的性能,以了解其在单线程环境中的性能。 结果相对令人惊讶:尽…

POJ 1172 DFS

&#xff08;感谢wzc学长的幻灯片&#xff09; 单组数据 注意从必经点能到标记过的点则此点不是分裂点。 //By: Sirius_Ren #include <cstdio> #include <queue> #include <cstring> using namespace std; int tot1,first[51],cnt,v[101],nxt[101],n,vis[51…

文件夹或者文件比对工具 Beyond Compare

文件夹或者文件比对工具 Beyond Compare 之前有同事离职了。 没有工作交接。 同事的代码有一部分也没有提交版本库。 结果就是线上的代码和版本库中的文件数量和代码内容不一致。 这时就需要进行两方比对&#xff0c;查找不一致的地方。 如果人工…

Lucene查询(搜索)语法示例

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中&#xff0c;以…

远程桌面在自己电脑显示很小的解决办法

背景:最近在某银行办公,使用的是云桌面,疫情期间有一周是在加班办公,使用自己的电脑登录云桌面,然后电脑屏幕显示云桌面很小,看文档及代码十分难受。问问同事,这个问题终于得到了解决。 显示如下: 这个云桌面在我电脑就显示2/3宽度的大小,看代码太难受了,排除右上角向…

《JavaScript100例|01》之javaScript实现俄罗斯方块,唤起了女朋友儿时的回忆!

导读&#xff1a;小时候我们经常打游戏玩俄罗斯方块&#xff0c;用的是游戏机。 现在我们学会了敲代码&#xff0c;简单用JS实现一下这个游戏把。 目录 先看效果 操作说明 代码实现 完整代码 先看效果 操作说明 打开编译器&#xff0c;讲代码复制进去&#xff0c;在浏览…

JBOSS内存溢出处理

JBOSS内存溢出处理 前几天公司一个项目的服务器坏了&#xff0c;就换了一个备份服务器顶替一下&#xff0c;但是没有跑一会就宕机了&#xff0c;一直报java.lang.OutOfMemoryError。。。。一看到这里&#xff0c;就知道是内存溢出&#xff0c;但是JBoss的内存配置已经达到1024M…

linux命令之seq

seq命令简述 seq命令比较常用&#xff0c;在需要做循环的时候用于产生一个序列是再合适不过的工具了&#xff0c;常用方法也比较简单&#xff1a;Usage:seq [OPTION]... LASTseq [OPTION]... FIRST LASTseq [OPTION]... FIRST INCREMENT LASTPrint numbers from FIRST to LAST,…

史上最全高级Java教程总结版(强烈建议收藏)

本篇文章主要用于分享java相关的视频,课程等,涉及面比较广,建议先收藏再慢慢观看,信息量比较大。适合新手,老手各阶段Java程序员。 订阅本专栏 《高级java教程系列》 的福利! 目录 java知识体系列表 面试题库 java各知识点综合面试题

adf4351使用_ADF:将UI类别与动态表单一起使用

adf4351使用JDev 11g R2具有有趣的新功能“ UI类别”。 它使我们可以在视图对象定义级别上以声明方式对VO的属性进行分组。 例如&#xff0c;我的VEmployees视图对象的“ UI Categories”选项卡如下所示&#xff1a; 默认情况下&#xff0c;每个视图对象都有一个预定义的类别“…

使用JavaScript将小写金额转化为大写金额的两种常见方法

导读:在一些支付或者银行确认信息中经常需要将小写金额转换为大写金额,这里做一下归纳, 目录 效果图: 方法一:使用正则表达式 方法二:常规JavaScript实现 效果图: 前面小写,后面大写,这里使用vue测试,其它框架同理.小写是传值的字段money,大写直接调用函数dealBigMoney(money…