windows内核-加载、卸载驱动(四)

通过MFC加载或卸载驱动


一、加载驱动过程
1、用OpenSCManager打开服务控制管理器
2、用CreateService创建对应服务
3、如果驱动服务已经创建过,则用OpenService打开服务
4、用StartService加载启动驱动服务
5、清理工作,用CloseServiceHandle关闭释放句柄
 


#include <winsvc.h>

BOOL LoadDriver(const  char* lpszDriverName, const  char* lpszDriverPath)
{
	OutputDebugStringA("LoadDriver()");
	char szDriverImagePath[256] = { 0 };//用于保存 .sys的全路径名
										//得到完整的驱动路径
	GetFullPathNameA(lpszDriverPath, 256, szDriverImagePath, NULL);

	BOOL bRet = FALSE;
	SC_HANDLE hServiceMgr = NULL;//SCM管理器的句柄
	SC_HANDLE hServiceDDK = NULL;//NT驱动程序的服务句柄

	hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); //SC_MANAGER_CREATE_SERVICE

	//创建驱动所对应的服务
	hServiceDDK = CreateServiceA(hServiceMgr,
		lpszDriverName, //驱动程序的在注册表中的名字  
		lpszDriverName, // 注册表驱动程序的 DisplayName 值  
		SERVICE_START, // 加载驱动程序的访问权限  SERVICE_START 或者 SERVICE_ALL_ACCESS
		SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  
		SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值   //指定当进程调用StartService函数时由服务控制管理器启动的服务。
		SERVICE_ERROR_NORMAL,//SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  
		szDriverImagePath, // szDriverImagePath 注册表驱动程序的路径 如: C:\\222\1.sys
		NULL,  //GroupOrder HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList
		NULL,
		NULL,
		NULL,
		NULL);

	if (GetLastError() == ERROR_SERVICE_EXISTS) //ERROR_SERVICE_EXISTS 1073 //服务已经存在
	{
		hServiceDDK = OpenServiceA(hServiceMgr, lpszDriverName, SERVICE_START);或者 SERVICE_ALL_ACCESS //
	}

	bRet = StartService(hServiceDDK, NULL, NULL);

	if (hServiceDDK)
	{
		CloseServiceHandle(hServiceDDK);
	}
	if (hServiceMgr)
	{
		CloseServiceHandle(hServiceMgr);
	}
	return bRet;
}

二、卸载驱动1、获取服务控制管理器句柄 SC_HANDLE
2、OpenService打开加载中的服务获取服务句柄 SC_HANDLE
3、ControlService 停止服务
4、DeleteService
 
 

//卸载驱动程序
BOOL UnloadDriver(const char* lpszDriverName) //传入驱动名称
{
	BOOL bRet = FALSE;
	SC_HANDLE hServiceMgr = NULL;//SCM管理器的句柄
	SC_HANDLE hServiceDDK = NULL;//NT驱动程序的服务句柄
	SERVICE_STATUS SvrSta;
	//打开获取服务控制管理器句柄 
	hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (hServiceMgr == NULL)
	{
		//打开SCM管理器失败
		OutputDebugStringA("OpenSCManager() Faild \n");
		CloseServiceHandle(hServiceMgr);
		return FALSE;
	}
	
	OutputDebugStringA("OpenSCManager() ok ! \n");

	//打开驱动所对应的服务
	hServiceDDK = OpenServiceA(hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS);

	if (hServiceDDK == NULL)
	{
		//打开驱动所对应的服务失败
		OutputDebugStringA(" OpenService() Faild  ! \n");
		CloseServiceHandle(hServiceDDK);
		CloseServiceHandle(hServiceMgr);
		return FALSE;
	}
	OutputDebugStringA("OpenService() ok ! \n");

	//停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。  
	if (!ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta))
	{
		OutputDebugStringA("ControlService() Faild !\n");
	}
	else
	{
		//打开驱动所对应的失败
		OutputDebugStringA("ControlService() ok !\n");
	}

	//动态卸载驱动程序,删除服务  
	if (!DeleteService(hServiceDDK))
	{
		//卸载失败
		OutputDebugStringA("DeleteSrevice() Faild %d !\n");
	}
	else
	{
		//卸载成功
		OutputDebugStringA("DelServer:deleteSrevice() ok !\n");
	}
	//离开前关闭打开的句柄
	if (hServiceDDK)
	{
		CloseServiceHandle(hServiceDDK);
	}
	if (hServiceMgr)
	{
		CloseServiceHandle(hServiceMgr);
	}
	return TRUE;
}



 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows内核安全与驱动开发》是一本针对Windows操作系统内核安全和驱动开发的重要指南。该书主要介绍了关于Windows内核安全和驱动开发的基础知识和技术,对于希望深入了解和学习这方面知识的读者来说具有很高的参考价值。 首先,该书详细介绍了Windows内核的架构和组成,包括内核模式与用户模式、进程管理、内存管理、线程调度、异步I/O等方面的知识。这些基础知识对于理解Windows操作系统的工作原理和机制非常重要,是进行内核安全和驱动开发的基础。 其次,该书详细介绍了Windows内核安全的相关知识,包括安全模型、访问控制、进程间通信安全等方面的内容。这些知识对于保护操作系统和应用程序的安全非常重要,在进行驱动开发时需要充分考虑其中的安全风险和防护措施。 最后,该书还介绍了驱动开发的基本原理和技术,包括驱动加载卸载驱动和设备的通信、驱动的错误处理和调试等方面的知识。这些知识对于开发高质量的Windows驱动程序非常重要,能够帮助开发者更好地理解和掌握驱动开发的要点和技巧。 总之,《Windows内核安全与驱动开发》是一本非常实用和重要的书籍,对于想要深入了解Windows内核安全和驱动开发的读者来说具有很高的参考价值。通过学习这本书,读者可以对Windows内核驱动开发有更深入的了解,掌握相关的基础知识和技术,从而能够开发出更加安全可靠的驱动程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值