Windows驱动(加载驱动)

该代码示例展示了如何使用C++编程语言通过SCM服务管理器来创建、启动、停止以及删除驱动服务。LoadDriver函数用于加载驱动,包括获取驱动路径,创建服务并启动服务。而UnLoadDriver函数则用于卸载驱动,涉及到停止服务和删除服务的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

加载过程

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

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>软件名称:驱动加载工具(InstDrv - 中文版)软件版本:V1.3版软件类型:个人免费版(无插件)运行环境:Windows操作系统开发作者:Coderui更新日期:2008年04月18日联系邮箱:coderui@163.com作者博客:http://hi.baidu.com/coderui>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-------------------------------------------------介绍:  该软件和网上大家常用的“InstDrv”程序功能几乎一样,现在也支持[命令行控制台]调用了,只是新加入了详细的中文提示信息和拖拽打开文件等,这样可以方便用户的使用。“InstDrv”是一个比较好用的驱动安装、卸载工具。可以帮助您方便的把驱动程序安装上或卸载掉。本程序更多应用于动态调式驱动前的加载操作中。功能:1:执行加载、启动、停止、卸载驱动操作。2:支持文件拖拽打开。3:支持程序窗口总在最前显示。4:操作后有详细的中文提示信息。5:支持[命令行控制台]调用。6:提升程序自身的权限和优先级。说明:压缩包中的“MySYS.sys”文件为测试驱动程序,支持加载、启动、停止、卸载驱动等功能,可以使用“Dbgview”工具查看驱动输出的提示信息。-------------------------------------------------详细的中文提示信息如下:状态:支持拖拽获取文件路径.状态:只能一次拖拽一个文件!状态:拖拽获取文件路径成功!状态:请输入驱动文件的路径名!状态:创建句柄失败!状态:因为不是一个有效文件,所以驱动服务安装失败!状态:因为驱动服务已经存在,所以驱动服务安装失败!状态:因为驱动服务已经启动,所以驱动服务安装失败!状态:驱动服务安装失败!状态:驱动服务安装成功!状态:打开驱动服务失败,可能该驱动服务不存在!状态:驱动服务启动成功!状态:因为驱动服务已经启动,所以驱动服务启动失败!状态:因为不是一个有效驱动,所以驱动服务启动失败!状态:因为驱动服务未被停止,所以驱动服务启动失败!状态:驱动服务启动失败!状态:驱动服务停止成功!状态:因为驱动服务没有启动,所以驱动服务停止失败!状态:驱动服务停止失败!状态:驱动服务卸载成功!状态:因为驱动服务已经启动,所以驱动服务卸载失败!状态:驱动服务卸载失败!状态:提升进程权限失败!状态:提升进程优先级失败!-------------------------------------------------[命令行控制台]调用参数:InstDrv [/i] [/u] [/s] [驱动程序路径名]/i 安装并启动这个驱动程序./u 停止并卸载这个驱动程序./s 不弹出任何消息提示窗口.注意:带有空格的路径,请用双引号把路径括起来.-------------------------------------------------下载说明:如果当前网页连接地址下载不了该软件,您可以发送邮件到coderui@163.com中,向程序作者所要该软件,谢谢您的支持!-------------------------------------------------解压后EXE程序全文MD5校验值为:6f356e16020902a77d57fa44ff21c387专用MD5校验器程序下载地址为:http://hi.baidu.com/coderui/blog/item/e3a1282354c128519822ed24.html>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值