Windows驱动(加载驱动)
之前我们是使用驱动工具加载驱动,本次实验内容是使用代码 实现驱动加载和卸载
加载过程
打开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驱动(加载驱动)相关推荐
- Windows Driver开发_TraceEvents调试以及加载驱动的方法
在最新版的WDK框架里,我们新建了Windows Driver KMDF模型之后默认使用的TraceEvents来打印输出的,这套输出机制叫WPP,我们可以在DriverEntry函数里看到它的初始化 ...
- 由于Windows无法加载这个设备所需要的驱动设备,导致这个设备工作异常(代码31)VMware Virtual Ethernet Adapter for VMnet1 or VMnet8
在这里插入图片描述 由于Windows无法加载这个设备所需要的驱动设备,导致这个设备工作异常(代码31)VMware Virtual Ethernet Adapter for VMnet1 or VM ...
- CH340驱动问题,由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常。 (代码 31)
-------------------------------------以下是2022.11.8更新 现在可以了,把端口名称换了后(同学告诉我的),刚开始还是不行,换了个单片机烧可以,再换回之前的也 ...
- matlab 读取voi文件,VOI虚拟化下的Windows网卡驱动加载方法与流程
本发明涉及计算机技术领域,特别涉及VOI虚拟化下的Windows网卡驱动加载方法. 背景技术: 在VOI虚拟化方案中,首先需要确保网卡驱动能够提前加载到系统中,才能够实现通过网络来引导操作系统启动.现 ...
- 获取WinCE已加载驱动的信息
//===================================================================== //TITLE: // WinCE驱动的动态加载 ...
- 征途2无法显示服务器列表,解决win10系统玩征途2提示“DriverCommlnit驱动加载失败”的方法...
征途2是一款众所周知的角色扮演类游戏,它在玩法上延续了征途1的总体风格,但是在画面和音效上比征途1的要提高了很多,其独特的玩法吸引了众多的玩家.但是又部分用户反映,在win10系统上运行征途2的游戏时 ...
- 不使用软盘加载驱动安装系统的方法--使用nLite集成驱动
不使用软盘加载驱动安装系统的方法--使用nLite集成驱动整合驱动程序到系统安装盘-图片多是因为适应不同用户的需求,其实操作过程很简单,也就是点几下鼠标的事. 当我们在使用SATA.SCSI硬盘或磁盘 ...
- windows10驱动 x64--- 3环代码加载驱动(二)
windows10驱动 x64--- 3环代码加载驱动 一:了解驱动加载工具 二:应用层--3环代码示例 一:了解驱动加载工具 平时调试.sys 我们都是用的驱动加载工具:open(打开驱动文件) - ...
- Win11的两个实用技巧系列之加载驱动失败怎么办、占用内存高的解决办法
Win11加载驱动失败怎么办?Win11无法加载驱动程序的三种解决方法 win11用户在使用电脑的时候遇到了"无法在设备上加载驱动程序"的情况,导致有些软件无法正常使用,这种情况要 ...
最新文章
- 一、网页端文件流的传输
- Ubuntu的奇技淫巧
- 华科计算机学院三好学生,哲学学院常若帆荣获校“三好学生标兵”称号
- 刚才看到一篇文章,感觉不错,转载过来和大家分享:
- java手机翻译,使用JUniversal翻译Android项目
- python用哪种字体比较好_女生练哪种字体比较好?适合女生写的漂亮字体推荐
- 13.节点操作上,下
- 一个正经的前端学习 开源 仓库(每日更新)-698道知识点
- 了解NLP(自然语言处理)技术
- Python模块selenium实例:电影分类排名数据生成json,sqlite和excel(openpyxl)文件(一)
- 二分图匹配-匈牙利算法, 最小路径覆盖
- URL deconding URL解码
- SpringBoot——安全管理(一)
- 代码的坏味道之七 :Feature Envy(依恋情结)
- python启动浏览器编程_python实现打开浏览器的方法
- Vue Echarts 电子支付图表
- defaultChecked 和 checked 的区别
- 智能卡操作(非接触CPU卡又称智能卡) 总结
- ShareSDK关于微信分享问题
- Spring配置log4j实例