Windows驱动开发(6)——加载驱动过程
今天顺便再解决一下应用层加载卸载驱动的方式。
加载驱动
加载驱动过程
- 用OpenSCManager打开服务控制管理器
- 用CreateService创建对应服务
- 如果驱动服务已经创建过,则用OpenService打开服务
- 用StartService加载启动驱动服务
- 清理工作,用CloseServiceHandle关闭释放句柄
一个一个介绍一下每一步的详细步骤吧
打开服务控制管理器
使用如下代码获得一个SCM管理器的句柄。
1 | SC_HANDLE hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); |
- 第一个参数是目标计算机的名称。 如果指针为 NULL 或指向空字符串,则该函数将连接到本地计算机上的服务控制管理器。
- 第二个参数是服务控制管理器数据库的名称。 此参数应设置为SERVICES_ACTIVE_DATABASE。 如果为 NULL,则默认打开SERVICES_ACTIVE_DATABASE数据库。
- 第三个参数是我们获得句柄的权限,SC_MANAGER_ALL_ACCESS 表示获得所有权限。
创建服务
使用如下代码去创建服务,获得该服务的管理句柄:
1 | hServiceDDK = CreateServiceA( |
具体参数表示的意思已经标明。
如果已经存在,则打开服务
我们需要判断此服务是否被创建过了,如果创建过了则 GetLastError 会返回一个 ERROR_SERVICE_EXISTS。
1 | if (GetLastError() == ERROR_SERVICE_EXISTS) { |
用StartService加载启动驱动服务
直接启动:
1 | int bRet = StartService(hServiceDDK, NULL, NULL); |
如果返回 1,则成功,如果为 0 则表示失败。
完整代码形式
1 |
|
卸载驱动
大概步骤是这样的:
- 获取服务控制管理器句柄
- OpenService 打开加载中的服务获取服务句柄
- ControlService 停止服务
- DeleteService 删除服务
同样也是一步步讲解——
获取服务控制管理器句柄
一样的。
打开服务句柄
跟上面那个,如果服务存在,则打开服务,一样的操作,但是这里需要获取 ALL_ACCESS 的权限
1 | hServiceDDK = OpenServiceA(hServiceMgr, ServeName, SERVICE_ALL_ACCESS); |
停止服务
用 ControlService API 去先去停止服务。
1 | int bRet = 0; |
删除服务
最后调用 DeleteService 去删除服务。
1 | bRet=DeleteService(hServiceDDK); |
大概就是这样的一个过程还挺简单的,加载驱动和卸载驱动都没有特别难。
代码汇总
以下是一个加载驱动和卸载驱动一体的代码,中间相隔 System pause,这里输入一个回车可以直接卸载驱动,用于快速加载驱动,然后再处理一下报错信息就可以了。
1 |
|
运行结果:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xia0ji233's blog!