之前我们是使用驱动工具加载驱动,本次实验内容是使用代码 实现驱动加载和卸载

加载过程

打开SCM服务管理器 -> 创建驱动服务 -> 启动服务 -> 关闭句柄

//加载驱动 输入 驱动名称和驱动文件名 如果不写路径 驱动要跟exe同级
#include"pch.h"
#include<winsvc.h>
BOOL LoadDriver(const char* lpszDriverName,const char* lpszDriverPath)
{char szDriverImagePath[256] = {0};  //驱动路径+驱动名GetFullPathNameA(lpszDriverPath,256, szDriverImagePath,NULL);char buf[2048] = {0};sprintf_s(buf,"zxxx 驱动文件输入路径:%s  全路径:%s \n",lpszDriverPath,szDriverImagePath);OutputDebugStringA(buf);BOOL bRet = FALSE;SC_HANDLE hServiceMgr = NULL; //SCM管理器的句柄SC_HANDLE hServiceDDK = NULL;   //驱动程序的句柄//1.打开SCM服务管理器hServiceMgr = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS);  //使用所有权限打开sprintf_s(buf, "zxxx 打开SCM %p GetLastError=%d \n", hServiceMgr,GetLastError());OutputDebugStringA(buf);//2.创建驱动服务hServiceDDK = CreateServiceA(hServiceMgr,                //SCM管理器句柄lpszDriverName,               //驱动程序在注册表中的名字lpszDriverName,               //注册表驱动程序的 DisplayName值SERVICE_START,               //加载驱动程序的访问权限 SERVICE_START 或 SERVICE_ALL_ACCESSSERVICE_KERNEL_DRIVER,      //加载的服务是驱动程序SERVICE_DEMAND_START,       //注册表驱动程序的Start值SERVICE_ERROR_NORMAL,       //注册表驱动程序的ERRORControl值szDriverImagePath,           //注册表驱动程序的路径NULL,                       NULL,NULL,NULL,NULL);sprintf_s(buf, "zxxx 创建驱动服务 %d  驱动路径:%s \n", hServiceDDK, szDriverImagePath);OutputDebugStringA(buf);//3.判断服务是否存在if (GetLastError() == ERROR_SERVICE_EXISTS){hServiceDDK = OpenServiceA(hServiceMgr,lpszDriverName,SERVICE_START);sprintf_s(buf, "zxxx 服务已存在 %d \n", hServiceDDK);OutputDebugStringA(buf);}Sleep(1200);//4.启动服务bRet = StartService(hServiceDDK,NULL,NULL);sprintf_s(buf, "zxxx 启动服务 加载驱动 %d GetlastError=%d \n", bRet,GetLastError());OutputDebugStringA(buf);//5.关闭句柄if (hServiceDDK){CloseServiceHandle(hServiceDDK);}if (hServiceMgr){CloseServiceHandle(hServiceMgr);}return bRet;
}

卸载过程

打开SCM服务管理器 -> 打开驱动服务 -> 停止驱动程序 -> 卸载驱动 -> 关闭句柄

//卸载驱动 输入驱动名
BOOL UnLoadDriver(const char* lpszDriverName)
{BOOL bRet = FALSE;SC_HANDLE hServiceMgr = NULL;  //SCM管理器的句柄SC_HANDLE hServiceDDK = NULL;   //驱动程序的句柄SERVICE_STATUS SvrSta;char buf[2048] = { 0 };//1.打开SCM服务管理器hServiceMgr = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);  //使用所有权限打开if (hServiceMgr == NULL){sprintf_s(buf, "zxxx 打开SCM ERROR %p GetLastError=%d \n", hServiceMgr, GetLastError());OutputDebugStringA(buf);bRet = FALSE;goto BeforeLeave; //返回前 关闭句柄}else{sprintf_s(buf, "zxxx 打开SCM SUCCESS %p GetLastError=%d \n", hServiceMgr, GetLastError());OutputDebugStringA(buf);}//2.打开驱动服务hServiceDDK = OpenServiceA(hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS);if (hServiceDDK == NULL){sprintf_s(buf, "zxxx 打开驱动服务 ERROR  GetLastError=%d \n", GetLastError());OutputDebugStringA(buf);bRet = FALSE;goto BeforeLeave; //返回前 关闭句柄}else{sprintf_s(buf, "zxxx 打开驱动服务 SUCCESS  GetLastError=%d \n", GetLastError());OutputDebugStringA(buf);}//3.停止驱动程序if (!ControlService(hServiceDDK,SERVICE_CONTROL_STOP,&SvrSta)){sprintf_s(buf, "zxxx 停止驱动 ERROR  GetLastError=%d \n", GetLastError());OutputDebugStringA(buf);}else{sprintf_s(buf, "zxxx 停止驱动 SUCCESS  GetLastError=%d \n", GetLastError());OutputDebugStringA(buf);}//4.卸载驱动if (!DeleteService(hServiceDDK)){sprintf_s(buf, "zxxx 卸载驱动 ERROR  GetLastError=%d \n", GetLastError());OutputDebugStringA(buf);}else{sprintf_s(buf, "zxxx 卸载驱动 SUCCESS  GetLastError=%d \n", GetLastError());OutputDebugStringA(buf);}bRet = TRUE;
BeforeLeave://5.关闭句柄if (hServiceDDK){CloseServiceHandle(hServiceDDK);}if (hServiceMgr){CloseServiceHandle(hServiceMgr);}return bRet;
}

Windows驱动(加载驱动)相关推荐

  1. Windows Driver开发_TraceEvents调试以及加载驱动的方法

    在最新版的WDK框架里,我们新建了Windows Driver KMDF模型之后默认使用的TraceEvents来打印输出的,这套输出机制叫WPP,我们可以在DriverEntry函数里看到它的初始化 ...

  2. 由于Windows无法加载这个设备所需要的驱动设备,导致这个设备工作异常(代码31)VMware Virtual Ethernet Adapter for VMnet1 or VMnet8

    在这里插入图片描述 由于Windows无法加载这个设备所需要的驱动设备,导致这个设备工作异常(代码31)VMware Virtual Ethernet Adapter for VMnet1 or VM ...

  3. CH340驱动问题,由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常。 (代码 31)

    -------------------------------------以下是2022.11.8更新 现在可以了,把端口名称换了后(同学告诉我的),刚开始还是不行,换了个单片机烧可以,再换回之前的也 ...

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

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

  5. 获取WinCE已加载驱动的信息

    //===================================================================== //TITLE: //    WinCE驱动的动态加载 ...

  6. 征途2无法显示服务器列表,解决win10系统玩征途2提示“DriverCommlnit驱动加载失败”的方法...

    征途2是一款众所周知的角色扮演类游戏,它在玩法上延续了征途1的总体风格,但是在画面和音效上比征途1的要提高了很多,其独特的玩法吸引了众多的玩家.但是又部分用户反映,在win10系统上运行征途2的游戏时 ...

  7. 不使用软盘加载驱动安装系统的方法--使用nLite集成驱动

    不使用软盘加载驱动安装系统的方法--使用nLite集成驱动整合驱动程序到系统安装盘-图片多是因为适应不同用户的需求,其实操作过程很简单,也就是点几下鼠标的事. 当我们在使用SATA.SCSI硬盘或磁盘 ...

  8. windows10驱动 x64--- 3环代码加载驱动(二)

    windows10驱动 x64--- 3环代码加载驱动 一:了解驱动加载工具 二:应用层--3环代码示例 一:了解驱动加载工具 平时调试.sys 我们都是用的驱动加载工具:open(打开驱动文件) - ...

  9. Win11的两个实用技巧系列之加载驱动失败怎么办、占用内存高的解决办法

    Win11加载驱动失败怎么办?Win11无法加载驱动程序的三种解决方法 win11用户在使用电脑的时候遇到了"无法在设备上加载驱动程序"的情况,导致有些软件无法正常使用,这种情况要 ...

最新文章

  1. 一、网页端文件流的传输
  2. Ubuntu的奇技淫巧
  3. 华科计算机学院三好学生,哲学学院常若帆荣获校“三好学生标兵”称号
  4. 刚才看到一篇文章,感觉不错,转载过来和大家分享:
  5. java手机翻译,使用JUniversal翻译Android项目
  6. python用哪种字体比较好_女生练哪种字体比较好?适合女生写的漂亮字体推荐
  7. 13.节点操作上,下
  8. 一个正经的前端学习 开源 仓库(每日更新)-698道知识点
  9. 了解NLP(自然语言处理)技术
  10. Python模块selenium实例:电影分类排名数据生成json,sqlite和excel(openpyxl)文件(一)
  11. 二分图匹配-匈牙利算法, 最小路径覆盖
  12. URL deconding URL解码
  13. SpringBoot——安全管理(一)
  14. 代码的坏味道之七 :Feature Envy(依恋情结)
  15. python启动浏览器编程_python实现打开浏览器的方法
  16. Vue Echarts 电子支付图表
  17. defaultChecked 和 checked 的区别
  18. 智能卡操作(非接触CPU卡又称智能卡) 总结
  19. ShareSDK关于微信分享问题
  20. Spring配置log4j实例

热门文章

  1. 贝叶斯方法---分段线性插值函数画图
  2. oracle导出where,Oracle exp导出加where指定条件
  3. matlab 16点fft,16点基4fft流图
  4. python中用plot绘制两条直线_在Matplotlib中绘制两条直线之间角度的最佳方法
  5. 移动端安全通信的利器——端到端加密(E2EE)技术详解
  6. 【记】Vue - 拖拽元素组件实现
  7. 如果快速有效的开项目启动会?
  8. 2k2实用球员_nba2kol2操作技巧大全,nba2kol2平民球星阵容搭配。
  9. getopt()用法详解
  10. 陈景润是数学改革先锋吗