本站资源来自互联网用户收集发布,仅供用于学习和交流。如有侵权之处,请联系站长并出示版权证明以便删除,敬请谅解!(邮箱:whctwlgzs@foxmail.com)

无忧技术吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

title
广告展示页面
查看: 1116|回复: 0

[Windows内核-驱动开发] Windows内核-驱动开发6.封装通信函数及添加回调函数

[复制链接]
admin (帅逼1)实名认证

积分信息:
无忧币:108846
交易币:2147480567
贡献:999999

我的勋章:

灌水之王突出贡献优秀版主荣誉管理论坛元老沙发王源码大师在线王终身成就机器王知识库土豪活跃会员最佳新人热心会员


发表于 2025-5-6 15:33:53 | 显示全部楼层 |阅读模式

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

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

x
Windows内核-驱动开发6.封装通信函数及添加回调函数

以三环代码例子,频繁使用的 DeviceIoControl 调用可封装为独立函数。如:
[C++] 纯文本查看 复制代码
BOOL CustomDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned) {
    return DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, NULL);
}

这样在调用时更简洁,且便于统一修改。
内核驱动中,如图片代码所示,在 IrpControl 函数中处理通信请求。通过获取输入缓冲区长度 inputBufferLength 和控制码 ioControlCode,进行合法性检查。当 inputBufferLength 等于预期长度,且回调函数 g_CommunicationCallBack 存在时,执行后续操作。
回调函数机制允许驱动在接收到符合条件的请求时,调用预先设置的函数。例如,定义回调函数指针:

[C++] 纯文本查看 复制代码
typedef VOID (*CommunicationCallBack)(PCommonPackage pPackage);
CommunicationCallBack g_CommunicationCallBack = NULL;

在内核中设置回调函数:
[C++] 纯文本查看 复制代码
VOID SetCommunicationCallBack(CommunicationCallBack callBack) {
    g_CommunicationCallBack = callBack;
}

当有通信请求时,如代码中:
[C++] 纯文本查看 复制代码
if (inputBufferLength == sizeof(CommonPackage) && g_CommunicationCallBack!= NULL) {
    if (pCommonPackage->id!= 0x1234) {
        // 处理错误
        return STATUS_INVALID_PARAMETER;
    }
    g_CommunicationCallBack(pCommonPackage);
}

在 Windows 内核驱动开发领域,封装通信函数与引入回调函数机制是优化代码结构、提升功能灵活性的关键举措。这些实践不仅能增强代码的可维护性,还能使驱动在处理用户态请求时更具针对性与高效性。
封装通信函数:简化交互流程在用户态(三环)与内核态的通信中,DeviceIoControl函数是实现交互的核心。然而,频繁分散的调用会导致代码冗余,不易维护。通过封装,可将重复的通信逻辑整合为独立函数,例如:
[C++] 纯文本查看 复制代码
BOOL CustomDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned) {
    return DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, NULL);
}

如此一来,调用方只需传入设备句柄、控制码、输入输出缓冲区等参数,即可完成通信操作。这种封装不仅简化了代码结构,还便于后续统一修改通信逻辑或添加错误处理,提升了代码的可维护性与复用性。
回调函数:定制化响应处理回调函数机制为驱动处理用户请求提供了灵活的扩展点。在内核驱动中,可定义一个函数指针类型,用于指向自定义的处理函数。例如:
[C++] 纯文本查看 复制代码
typedef VOID (*CommunicationCallBack)(PCommonPackage pPackage);
CommunicationCallBack g_CommunicationCallBack = NULL;

VOID SetCommunicationCallBack(CommunicationCallBack callBack) {
    g_CommunicationCallBack = callBack;
}

当驱动接收到用户态的通信请求时(如在IrpControl函数中),先对输入参数进行合法性校验:
[C++] 纯文本查看 复制代码
PVOID pBuff = Irp->AssociatedIrpp.SystemBuffer;
PCommonPackage pCommonPackage = (PCommonPackage)pBuff;
PIO_STACK_LOCATION pio_stack_location = IoGetCurrentIrpStackLocation(Irp);
ULONG inputBufferLength = pio_stack_location->Parameters.DeviceIoControl.InputBufferLength;

if (inputBufferLength == sizeof(CommonPackage) && g_CommunicationCallBack!= NULL) {
    if (pCommonPackage->id!= 0x1234) {
        return STATUS_INVALID_PARAMETER; // 处理参数错误
    }
    g_CommunicationCallBack(pCommonPackage); // 触发回调函数
}

通过这种方式,当满足特定条件(如输入缓冲区长度正确且回调函数已设置)时,驱动会调用预先注册的回调函数,执行定制化的业务逻辑。这使得驱动在不修改核心代码的前提下,能够灵活应对不同的业务需求,增强了系统的扩展性。
实践意义与优化方向
封装通信函数与回调机制的结合,让驱动开发更趋模块化。封装减少了重复代码,回调则赋予驱动 “可定制化响应” 的能力。在实际开发中,还可进一步优化:
强化封装函数的错误处理:在封装的通信函数中添加详细的错误码解析与日志记录,便于调试。
丰富回调函数的参数传递:根据业务需求,在回调函数中传递更多上下文信息,使处理逻辑更精准。
完善回调函数的注册与注销机制:确保回调函数在合适的生命周期内生效,避免内存泄漏或野指针问题。
总之,合理运用封装与回调机制,能使 Windows 内核驱动在处理通信时更加简洁、灵活,为构建稳定高效的驱动系统奠定坚实基础。

游客回复评论后点此刷新即可查看下载地址
回复

Windows内核-驱动开发6.封装通信函数及添加回调函数  659 无忧技术吧www.whct.net
无忧技术吧-免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.whct.net无关。
2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
4、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
5、无忧技术吧(www.whct.net)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。无忧技术吧不承担任何因为技术滥用所产生的连带责任。无忧技术吧内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或QQ与我们联系处理。
6、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:whctwlgzs@foxmail.com),本站将立即改正。
联系方式:
站长邮箱:whctwlgzs@foxmail.com
站长QQ:4040068
无忧论坛关注编程安全和移动安全、程序调试与病毒分析的前沿领域,平台本身资源丰富,作为一个资源平台,为程序员及广大编程爱好者提供了一个氛围良好的交流与合作空间。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

×本站发帖友情提示
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、如果存在违反国家相关法律、法规、条例的行为,我们有权在不经作者准许的情况下删除其在本论坛所发表的文章。
3、所有网友不要盗用有明确版权要求的作品,转贴请注明来源,否则文责自负。
4、本社区保护注册用户个人资料,但是在自身原因导致个人资料泄露、丢失、被盗或篡改,本论坛概不负责,也不承担相应法律责任。

站长推荐 关闭


官方交流群:805881393

官方交流群:805881393


查看

关于烛光| 支付宝站| 广告服务| 法律声明| 隐私保护| 联系我们| Archiver| | |网站地图 帮助中心

鄂公网安备42011502001700号

工业和信息化部备案:鄂ICP备2024050280号-2 广告服务/联系QQ: 4040068 投诉受理QQ: 4040068 

技术支持:Discuz!  Copyright © 2009 - 2010 联系邮箱:whctwlgzs@foxmail.com 版权所有 无忧技术吧

GMT+8, 2025-5-24 13:51 , Processed in 0.145379 second(s), 39 queries .

请输入你要搜索的关键字关键字: 百度 google 一搜 搜狐