驱动开发:实现驱动加载卸载工具

本文介绍了一个简单的驱动程序加载工具实现,包括驱动的安装、启动、停止和卸载等操作。使用了Windows API函数如OpenSCManager、CreateService、StartService等。

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

驱动程序加载工具有许多,最常用的当属KmdManager工具,如果驱动程序需要对外发布那我们必须自己编写实现一个驱动加载工具,当需要使用驱动时可以拉起自己的驱动,如下将实现一个简单的驱动加载工具,该工具可以实现基本的,安装,加载,关闭,卸载等操作日常使用完全没问题。

驱动安装

OpenSCManager是Windows操作系统提供的一个函数,用于打开服务控制管理器(SCM)数据库。服务控制管理器是Windows系统中的一个组件,负责管理和控制系统中的各种服务。

以下是OpenSCManager函数的基本信息:

SC_HANDLE OpenSCManager(
  LPCTSTR lpMachineName,
  LPCTSTR lpDatabaseName,
  DWORD   dwDesiredAccess
);

参数说明:

  • lpMachineName:机器名称,指定要连接的远程机器名称,如果为NULL,则表示本地机器。
  • lpDatabaseName:数据库名称,指定要打开的服务数据库的名称。常用的取值有SERVICES_ACTIVE_DATABASE和SERVICES_FAILED_DATABASE。
  • dwDesiredAccess:访问权限,指定打开服务控制管理器的访问权限。

返回值:

  • 返回一个SC_HANDLE类型的句柄,表示打开的服务控制管理器的句柄。如果打开失败,返回NULL。

通过调用OpenSCManager函数,可以获取一个服务控制管理器的句柄,进而可以对服务进行管理和控制,如创建服务、打开已有的服务等。打开服务控制管理器需要适当的权限,通常需要以管理员身份运行。

CreateService是Windows操作系统提供的一个函数,用于创建一个新的服务。服务是在Windows操作系统中以后台方式运行的程序,可以在系统启动时自动启动,并在后台提供某种功能或服务。

以下是CreateService函数的基本信息:

SC_HANDLE CreateService(
  SC_HANDLE    hSCManager,
  LPCTSTR      lpServiceName,
  LPCTSTR      lpDisplayName,
  DWORD        dwDesiredAccess,
  DWORD        dwServiceType,
  DWORD        dwStartType,
  DWORD        dwErrorControl,
  LPCTSTR      lpBinaryPathName,
  LPCTSTR      lpLoadOrderGroup,
  LPDWORD      lpdwTagId,
  LPCTSTR      lpDependencies,
  LPCTSTR      lpServiceStartName,
  LPCTSTR      lpPassword
);

参数说明:

  • hSCManager:服务控制管理器的句柄,用于操作服务管理器。
  • lpServiceName:服务的名称,用于唯一标识一个服务。
  • lpDisplayName:服务的显示名称,用于在用户界面上显示的友好名称。
  • dwDesiredAccess:服务的访问权限。
  • dwServiceType:服务的类型,可以是服务、驱动程序等。
  • dwStartType:服务的启动类型,指定服务在系统启动时的启动方式。
  • dwErrorControl:服务的错误控制,指定服务出错时的处理方式。
  • lpBinaryPathName:服务的可执行文件路径。
  • lpLoadOrderGroup:服务的加载顺序组,用于指定服务的加载顺序。
  • lpdwTagId:服务标识号的指针,用于接收新创建服务的标识号。
  • lpDependencies:服务依赖项,指定服务所依赖的其他服务。
  • lpServiceStartName:服务的启动用户名。
  • lpPassword:服务的启动密码。

返回值:

  • 返回一个SC_HANDLE类型的句柄,表示创建的服务的句柄。如果创建失败,返回NULL。

通过调用CreateService函数,可以在系统中创建一个新的服务,并指定该服务的各种属性和配置。创建服务需要适当的权限,通常需要以管理员身份运行。

#include <iostream>
#include <Windows.h>

using namespace std;

// 安装驱动
BOOL installDvr(CONST WCHAR drvPath[50], CONST WCHAR serviceName[20])
{

	// 打开服务控制管理器数据库
	SC_HANDLE schSCManager = OpenSCManager(
		NULL,                   // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器
		NULL,                   // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库
		SC_MANAGER_ALL_ACCESS   // 所有权限
		);
	
	if (schSCManager == NULL)
	{
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	// 创建服务对象,添加至服务控制管理器数据库
	SC_HANDLE schService = CreateService
		(
		schSCManager,               // 服务控件管理器数据库的句柄
		serviceName,                // 要安装的服务的名称
		serviceName,                // 用户界面程序用来标识服务的显示名称
		SERVICE_ALL_ACCESS,         // 对服务的访问权限:所有全权限
		SERVICE_KERNEL_DRIVER,      // 服务类型:驱动服务
		SERVICE_DEMAND_START,       // 服务启动选项:进程调用 StartService 时启动
		SERVICE_ERROR_IGNORE,       // 如果无法启动:忽略错误继续运行
		drvPath,                    // 驱动文件绝对路径,如果包含空格需要多加双引号
		NULL,                       // 服务所属的负载订购组:服务不属于某个组
		NULL,                       // 接收订购组唯一标记值:不接收
		NULL,                       // 服务加载顺序数组:服务没有依赖项
		NULL,                       // 运行服务的账户名:使用 LocalSystem 账户
		NULL                        // LocalSystem 账户密码
		);
	
	if (schService == NULL)
	{
		CloseServiceHandle(schService);
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	CloseServiceHandle(schService);
	CloseServiceHandle(schSCManager);
	return TRUE;
}

int main(int argc, char *argv[])
{
	if (installDvr(L"C:\\WinDDK.sys", L"service") == TRUE)
	{
		cout << "驱动已安装" << endl;
	}

	getchar();
	return 0;
}

启动驱动

OpenService是Windows操作系统提供的一个函数,用于打开一个已存在的服务。

以下是OpenService函数的基本信息:

SC_HANDLE OpenService(
  SC_HANDLE hSCManager,
  LPCTSTR   lpServiceName,
  DWORD     dwDesiredAccess
);

参数说明:

  • hSCManager:服务控制管理器句柄,通过调用OpenSCManager函数获取到的服务控制管理器句柄。
  • lpServiceName:服务名称,指定要打开的服务的名称。
  • dwDesiredAccess:访问权限,指定打开服务的访问权限。

返回值:

  • 返回一个SC_HANDLE类型的句柄,表示打开的服务的句柄。如果打开失败,返回NULL。

通过调用OpenService函数,可以获取一个已存在服务的句柄,进而可以对该服务进行操作,如启动、停止、删除等。打开服务需要适当的权限,通常需要以管理员身份运行,并且服务必须已经存在于服务控制管理器中。

#include <iostream>
#include <Windows.h>

using namespace std;

// 启动服务
BOOL startDvr(CONST WCHAR serviceName[20])
{

	// 打开服务控制管理器数据库
	SC_HANDLE schSCManager = OpenSCManager
		(
		NULL,                   // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器
		NULL,                   // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库
		SC_MANAGER_ALL_ACCESS   // 所有权限
		);
	
	if (schSCManager == NULL)
	{
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	// 打开服务
	SC_HANDLE hs = OpenService
		(
		schSCManager,           // 服务控件管理器数据库的句柄
		serviceName,            // 要打开的服务名
		SERVICE_ALL_ACCESS      // 服务访问权限:所有权限
		);
	
	if (hs == NULL)
	{
		CloseServiceHandle(hs);
		CloseServiceHandle(schSCManager);
		return FALSE;
	}
	
	if (StartService(hs, 0, 0) == 0)
	{
		CloseServiceHandle(hs);
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	CloseServiceHandle(hs);
	CloseServiceHandle(schSCManager);
	return TRUE;
}

int main(int argc, char *argv[])
{
	if (startDvr(L"service") == TRUE)
	{
		cout << "驱动服务" << endl;
	}

	getchar();
	return 0;
}

停止驱动

QueryServiceStatus是Windows操作系统提供的一个函数,用于查询指定服务的当前状态。

以下是QueryServiceStatus函数的基本信息:

BOOL QueryServiceStatus(
  SC_HANDLE          hService,
  LPSERVICE_STATUS   lpServiceStatus
);

参数说明:

  • hService:服务句柄,通过调用OpenService函数获取到的已打开服务的句柄。
  • lpServiceStatus:指向SERVICE_STATUS结构体的指针,用于接收查询到的服务状态信息。

返回值:

  • 如果函数调用成功,返回非零值(TRUE);如果函数调用失败,返回零值(FALSE)。可以通过调用GetLastError函数获取更多错误信息。

通过调用QueryServiceStatus函数,可以获取指定服务的当前状态信息,包括服务的运行状态、运行时间、最后一次错误等。通过查询服务状态,可以判断服务是否正在运行、停止或处于其他状态,并根据需要进行相应的处理。

ControlService是Windows操作系统提供的一个函数,用于控制指定服务的操作,例如启动、停止、暂停、恢复等。

以下是ControlService函数的基本信息:

BOOL ControlService(
  SC_HANDLE        hService,
  DWORD            dwControl,
  LPSERVICE_STATUS lpServiceStatus
);

参数说明:

  • hService:服务句柄,通过调用OpenService函数获取到的已打开服务的句柄。
  • dwControl:控制码,用于指定要执行的操作,可以是以下常量之一:
  • SERVICE_CONTROL_STOP:停止服务。
  • SERVICE_CONTROL_PAUSE:暂停服务。
  • SERVICE_CONTROL_CONTINUE:继续服务。
  • SERVICE_CONTROL_INTERROGATE:查询服务状态。

其他自定义的控制码。

  • lpServiceStatus:指向SERVICE_STATUS结构体的指针,用于接收操作后的服务状态信息。

返回值:

  • 如果函数调用成功,返回非零值(TRUE);如果函数调用失败,返回零值(FALSE)。可以通过调用GetLastError函数获取更多错误信息。

通过调用ControlService函数,可以对指定的服务进行不同的操作,例如启动服务、停止服务、暂停服务、恢复服务等。可以根据需要选择不同的控制码来执行相应的操作,并通过接收的服务状态信息来判断操作是否成功。

#include <iostream>
#include <Windows.h>

using namespace std;

// 停止服务
BOOL stopDvr(CONST WCHAR serviceName[20])
{

	// 打开服务控制管理器数据库
	SC_HANDLE schSCManager = OpenSCManager
		(
		NULL,                   // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器
		NULL,                   // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库
		SC_MANAGER_ALL_ACCESS   // 所有权限
		);

	if (schSCManager == NULL)
	{
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	// 打开服务
	SC_HANDLE hs = OpenService
		(
		schSCManager,           // 服务控件管理器数据库的句柄
		serviceName,            // 要打开的服务名
		SERVICE_ALL_ACCESS      // 服务访问权限:所有权限
		);
	
	if (hs == NULL)
	{
		CloseServiceHandle(hs);
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	// 如果服务正在运行
	SERVICE_STATUS status;
	if (QueryServiceStatus(hs, &status) == 0)
	{
		CloseServiceHandle(hs);
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	if (status.dwCurrentState != SERVICE_STOPPED &&
		status.dwCurrentState != SERVICE_STOP_PENDING
		)
	{
		// 发送关闭服务请求
		if (ControlService(
			hs,                         // 服务句柄
			SERVICE_CONTROL_STOP,       // 控制码:通知服务应该停止
			&status                     // 接收最新的服务状态信息
			) == 0) {
			CloseServiceHandle(hs);
			CloseServiceHandle(schSCManager);
			return FALSE;
		}

		// 判断超时
		INT timeOut = 0;
		while (status.dwCurrentState != SERVICE_STOPPED)
		{
			timeOut++;
			QueryServiceStatus(hs, &status);
			Sleep(50);
		}

		if (timeOut > 80)
		{
			CloseServiceHandle(hs);
			CloseServiceHandle(schSCManager);
			return FALSE;
		}
	}

	CloseServiceHandle(hs);
	CloseServiceHandle(schSCManager);
	return TRUE;
}

int main(int argc, char *argv[])
{
	if (stopDvr(L"service") == TRUE)
	{
		cout << "停止驱动服务" << endl;
	}

	getchar();
	return 0;
}

卸载驱动

DeleteService是Windows操作系统提供的一个函数,用于删除指定的服务。

以下是DeleteService函数的基本信息:

BOOL DeleteService(
  SC_HANDLE hService
);

参数说明:

  • hService:服务句柄,通过调用OpenService函数获取到的已打开服务的句柄。

返回值:

  • 如果函数调用成功,返回非零值(TRUE);如果函数调用失败,返回零值(FALSE)。可以通过调用GetLastError函数获取更多错误信息。

通过调用DeleteService函数,可以删除指定的服务。在调用此函数之前,需要先通过OpenSCManager和OpenService函数获取到相应的服务句柄。删除服务后,该服务将从系统中完全移除,无法再进行操作。

#include <iostream>
#include <Windows.h>

using namespace std;

// 卸载驱动
BOOL unloadDvr(CONST WCHAR serviceName[20])
{

	// 打开服务控制管理器数据库
	SC_HANDLE schSCManager = OpenSCManager
		(
		NULL,                   // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器
		NULL,                   // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库
		SC_MANAGER_ALL_ACCESS   // 所有权限
		);

	if (schSCManager == NULL)
	{
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	// 打开服务
	SC_HANDLE hs = OpenService
		(
		schSCManager,           // 服务控件管理器数据库的句柄
		serviceName,            // 要打开的服务名
		SERVICE_ALL_ACCESS      // 服务访问权限:所有权限
		);

	if (hs == NULL)
	{
		CloseServiceHandle(hs);
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	// 删除服务
	if (DeleteService(hs) == 0)
	{
		CloseServiceHandle(hs);
		CloseServiceHandle(schSCManager);
		return FALSE;
	}

	CloseServiceHandle(hs);
	CloseServiceHandle(schSCManager);
	return TRUE;
}

int main(int argc, char *argv[])
{
	if (unloadDvr(L"service") == TRUE)
	{
		cout << "卸载驱动服务" << endl;
	}

	getchar();
	return 0;
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>软件名称:驱动加载工具(InstDrv - 中文版)软件版本:V1.0版软件类型:个人免费版(无插件)运行环境:Windows操作系统开发作者:Coderui更新日期:2008年04月08日联系邮箱:coderui@163.com作者博客:http://hi.baidu.com/coderui>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-------------------------------------------------介绍:  该软件和网上大家常用的“InstDrv”程序功能几乎一样,只是新加入了详细的中文提示信息和拖拽打开文件等,这样可以方便用户的使用。“InstDrv”是一个比较好用的驱动安装、卸载工具。可以帮助您方便的把驱动程序安装上或卸载掉。本程序更多应用于动态调式驱动前的加载操作中。功能:1:执行加载、启动、停止、卸载驱动操作。2:支持文件拖拽打开。3:支持程序窗口总在最前显示。4:操作后有详细的中文提示信息。说明:压缩包中的“MySYS.sys”文件为测试驱动程序,支持加载、启动、停止、卸载驱动等功能,可以使用“Dbgview”工具查看驱动输出的提示信息。-------------------------------------------------详细的中文提示信息如下:状态:支持拖拽获取文件路径.状态:只能一次拖拽一个文件!状态:拖拽获取文件路径成功!状态:请输入驱动文件的路径名!状态:创建句柄失败!状态:因为不是一个有效文件,所以驱动服务安装失败!状态:因为驱动服务已经存在,所以驱动服务安装失败!状态:因为驱动服务已经启动,所以驱动服务安装失败!状态:驱动服务安装失败!状态:驱动服务安装成功!状态:打开驱动服务失败,可能该驱动服务不存在!状态:驱动服务启动成功!状态:因为驱动服务已经启动,所以驱动服务启动失败!状态:因为不是一个有效驱动,所以驱动服务启动失败!状态:因为驱动服务未被停止,所以驱动服务启动失败!状态:驱动服务启动失败!状态:驱动服务停止成功!状态:因为驱动服务没有启动,所以驱动服务停止失败!状态:驱动服务停止失败!状态:驱动服务卸栽成功!状态:因为驱动服务已经启动,所以驱动服务卸栽失败!状态:驱动服务卸栽失败!-------------------------------------------------下载说明:如果当前网页连接地址下载不了该软件,您可以发送邮件到coderui@163.com中,向程序作者所要该软件,谢谢您的支持!-------------------------------------------------解压后EXE程序全文MD5校验值为:591d784d24f5aead3a383535a4100733专用MD5校验器程序下载地址为:http://hi.baidu.com/coderui/blog/item/e3a1282354c128519822ed24.html>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>软件名称:驱动加载工具(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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微软技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值