Windows驱动(加载驱动)

news/2024/11/15 6:05:28/

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

加载过程

打开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;
}

 


http://www.ppmy.cn/news/170498.html

相关文章

microsoft edge驱动器下载以及使用

microsoft edge驱动器下载以及使用 1.查看浏览器版本2.下载驱动器3.试运行脚本4.对驱动器改名后运行 1.查看浏览器版本 打开edge浏览器&#xff0c;点击设置&#xff0c;查看浏览器版本 2.下载驱动器 输入驱动器下载网址https://developer.microsoft.com/en-us/microsoft-e…

MySQL 连接驱动器包 下载教程

文章目录 MySQL连接驱动包的下载 MySQL连接驱动包的下载 使用 mysql-connector 来连接使用 MySQL&#xff0c; mysql-connector 是 MySQL 官方提供的驱动器。 1.登录MySQL官网 2.选择【Developer Zone】&#xff0c;然后单击【MySQL Downloads】按钮 3.在下图中&#xff0c…

Windows设备与驱动器管理

在安装一些软件的时候经常会在“我的电脑-设备与驱动器”下面多几个图标&#xff0c;那么这些图标是怎么添加上去&#xff1f;要怎么删除掉呢&#xff1f; 只需要知道关联的注册表项&#xff0c;就可以轻松的添加、删除、修改了&#xff1a; 1、设备与驱动器标记注册表项 HKE…

ukey linux驱动程序,产品驱动程序下载

软件名称 大小 所属类别 下载次数 925K 外围模块板驱动程序 966 0 DM7520 &SDM7540 DM7520 &SDM7540 DM6852 DM6852 DM6816andDM6916 K 数据模块板驱动程序 1863 DM6425 DM6430 DM6430 DM6420 相关备注&#xff1a; 适用于Pentium M/Celeron M系列CPU模块板 版本&#…

常用电机驱动器

常用电机驱动器 电机品牌&#xff1a;松下 特点&#xff1a;modbus,EtherCAT通信&#xff0c;交流伺服&#xff0c;系列全&#xff0c;货期短&#xff0c;价格适中&#xff0c;性能稳定&#xff0c;电机和驱动器配套。 品牌&#xff1a;台达 特点&#xff1a;交流伺服。canopen…

删除设备和驱动器中的迅雷下载、百度网盘的图标(win10、win11可用)

安装百度网盘&#xff0c;迅雷等软件后会在设备和驱动器中多出图标&#xff0c;怎么将他们删除呢&#xff1f; 操作流程 按快捷键【win R】进入&#xff0c;【运行】 输入 “regedit”打开注册表编辑器。 也可以通过windows的搜素&#xff0c;搜索【注册表编辑器】进入。 进…

【Azure】微软 Azure 基础解析(八)Azure 存储服务:Blob存储、队列存储、文件存储等特点与应用场景

本系列博文还在更新中&#xff0c;收录在专栏&#xff1a;「Azure探秘&#xff1a;构建云计算世界」 专栏中。 本系列文章列表如下&#xff1a; 【Azure】微软 Azure 基础解析&#xff08;三&#xff09;描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx…

常用浏览器 + WebDriver驱动下载网址汇总 + 浏览器内核版本查看

常用浏览器 一、IE浏览器二、Microsoft Edge浏览器三、Chrome(google)浏览器四、Firefox(火狐)浏览器五、Opera浏览器六、Safari浏览器七、其他1、QQ浏览器2、360浏览器3、搜狗浏览器4、猎豹浏览器5、华为浏览器 八、浏览器内核版本查看 一、IE浏览器 说明:该浏览器为Windows系…