设为首页收藏本站开通Vip积分充值极速删帖通道违规用户-点我查看 劰载中...

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫描二维码关注官方公众号
查看: 1844|回复: 0

[Windows内核-驱动开发] Windows内核-驱动开发7.三环加载驱动

[复制链接]
admin (帅逼1)实名认证
主题 主题 1374
回帖 回帖 75
等级头衔
组别 : 管理员

等级 :

积分成就
下载币 : 442 枚
交易币 : 0 枚
贡献 : 999999 粒
云鲸币 : 117938 枚
Icon在线时间 : 915 小时
Icon注册时间 : 2025-1-11
Icon最后登录 : 2026-5-19
发表于 2025-5-6 15:38:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转无忧吧。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在 Windows 内核驱动开发中,三环(用户态)加载驱动是一个关键环节,它涉及到与系统服务管理器交互,完成驱动服务的创建、启动等操作。这一过程需要严格遵循系统规范,确保驱动能够正确加载到内核空间并正常工作。下面我们结合具体代码来详细剖析三环加载驱动的步骤与要点。
首先,打开服务控制管理器。通过OpenSCManagerA函数实现,该函数用于获取服务控制管理器的句柄。代码如下:
[C++] 纯文本查看 复制代码
SC_HANDLE SCManagerHandle = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!SCManagerHandle) {
    // 处理错误,如输出错误信息
    return false;
}

此处 NULL, NULL 代表本地计算机与默认服务数据库,SC_MANAGER_ALL_ACCESS 赋予完全访问权限。若获取句柄失败,需及时处理错误,因其是后续操作的基石

二、创建驱动服务
利用 CreateServiceA 函数创建服务:

[C++] 纯文本查看 复制代码
SC_HANDLE CreateServiceHandle = CreateServiceA(
    SCManagerHandle,
    "yxfzedu_test", // 服务名称
    "yxfzedu_test", // 显示名称
    SERVICE_ALL_ACCESS,
    SERVICE_KERNEL_DRIVER,
    SERVICE_DEMAND_START,
    SERVICE_ERROR_IGNORE,
    "C:\\Users\\Administrator\\Desktop\\basis02_communication.sys", // 驱动路径
    NULL, NULL, NULL, NULL, NULL
);
if (!CreateServiceHandle) {
    // 处理创建服务失败的情况
    CloseServiceHandle(SCManagerHandle);
    return false;
}

该函数参数丰富,SCManagerHandle 为服务控制管理器句柄;"yxfzedu_test" 是服务名与显示名;SERVICE_KERNEL_DRIVER 标明内核驱动属性;SERVICE_DEMAND_START 表示按需启动;"C:\\Users\\Administrator\\Desktop\\basis02_communication.sys" 为驱动文件路径。若创建失败,需关闭已打开句柄并返回。
三、打开驱动对应的服务
通过 OpenServiceA 函数获取已创建服务的句柄:
[C++] 纯文本查看 复制代码
SC_HANDLE OpenServiceHandle = OpenServiceA(SCManagerHandle, "yxfzedu_test", SERVICE_ALL_ACCESS);
if (!OpenServiceHandle) {
    CloseServiceHandle(SCManagerHandle);
    return false;
}

此句柄用于后续的启动操作,若打开失败,同样要释放资源。
四、启动服务
使用 StartServiceA 函数启动服务:
[C++] 纯文本查看 复制代码
BOOL flag = StartServiceA(OpenServiceHandle, 0, NULL);
if (!flag) {
    printf("服务启动失败!%d \r\n", GetLastError());
}

若启动失败,借助 GetLastError 获取详细错误码,以便调试。
五、资源释放与注意事项
整个流程中,资源释放不可或缺。每一步操作后,都需确保正确关闭句柄,如 CloseServiceHandle(SCManagerHandle),防止资源泄漏。此外,实际应用中需留意驱动路径的准确性、服务名称的唯一性等细节,确保驱动顺利加载并运行于内核环境。
三环加载驱动需精准处理每个系统函数调用,从打开服务控制管理器到启动服务,每一步都可能遭遇错误。合理的错误处理与资源管理是保障程序稳定性的核心。通过深入理解这些步骤与代码逻辑,开发者能更好地把控驱动加载过程,为后续驱动开发与调试筑牢根基。
游客,如果您要查看本帖隐藏内容请回复


7.jpg
捷云鲸技术社区(bbs.jieyunjing.com)免责声明:
使用本社区服务即视为同意本声明全部条款。
1. 本社区所有技术、工具及内容仅限**学习研究**使用,旨在提升安全技术水平,严禁用于非法、商业及其他不良用途,违规后果由使用者自行承担。
2. 社区内容及资源来源于网络,仅代表发布者个人观点,与本社区无关,相关法律责任由发布者自负。
3. 资源版权归原作者所有,用户下载后须在**24小时内删除**,版权争议与本社区无关。
4. 禁止任何破坏社区正常运营的行为,违规将视情节处理,社区保留追责权利。
5. 本社区坚决支持正版,如涉及侵权,请通过站长邮箱或QQ联系删除。
6. 本社区对本声明拥有最终解释权,可适时修改并公示生效。
站长邮箱:jieyunjingvip@qq.com
站长QQ:4040068
捷云鲸社区bbs.jieyunjing.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|捷云鲸技术社区 ( 鄂ICP备2024050280号-4 ) 鄂公网安备 42018502008673号|网站地图

GMT+8, 2026-5-19 23:26 , Processed in 0.121140 second(s), 41 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表
捷云鲸小助手