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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Windows内核-驱动开发] Windows内核驱动-封装驱动到三环-第9章-全套课程

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

等级 :

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

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

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

×

第九课 驱动功能封装与三环交互开发
一、驱动文件集成到三环项目
1. 准备驱动资源
  • 将编译好的 .sys 驱动文件复制到用户程序目录(建议新建 Drivers 子目录)
  • 包含驱动定义头文件(如 MyDriver.h),内容示例:
// 驱动IO控制码定义
#define IOCTL_MY_DRIVER_READ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MY_DRIVER_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)

// 驱动设备路径
#define DRIVER_DEVICE_PATH L"\\\\.\\MyDriverDevice"

2. 三环项目配置
  • 在 VS 项目中添加驱动头文件包含路径
  • 链接时无需直接链接 .sys,通过服务控制管理器动态加载
二、驱动加载与卸载封装
1. 核心 API 封装(C++)
// 加载驱动服务
BOOL LoadDriver(LPWSTR szServiceName, LPWSTR szDriverPath) {
    SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    SC_HANDLE hService = CreateService(hSCManager, szServiceName, szServiceName,
        SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
        szDriverPath, NULL, NULL, NULL, NULL, NULL);
    if (!hService && GetLastError() != ERROR_SERVICE_EXISTS) return FALSE;

    if (hService) CloseServiceHandle(hService);
    hService = OpenService(hSCManager, szServiceName, SERVICE_ALL_ACCESS);
    StartService(hService, 0, NULL);
    CloseServiceHandle(hSCManager);
    CloseServiceHandle(hService);
    return TRUE;
}

// 卸载驱动服务
BOOL UnloadDriver(LPWSTR szServiceName) {
    SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    SC_HANDLE hService = OpenService(hSCManager, szServiceName, SERVICE_ALL_ACCESS);
    SERVICE_STATUS ss;
    ControlService(hService, SERVICE_CONTROL_STOP, &ss);
    DeleteService(hService);
    CloseServiceHandle(hSCManager);
    CloseServiceHandle(hService);
    return TRUE;
}

2. 使用示例
// 加载驱动
LoadDriver(L"MyDriver", L"..\\Drivers\\MyDriver.sys");

// 卸载驱动
UnloadDriver(L"MyDriver");

三、驱动通信模块实现
1. 设备句柄获取
HANDLE GetDeviceHandle() {
    return CreateFile(DRIVER_DEVICE_PATH, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
}

2. 通信函数封装
// 发送读请求
BOOL DriverRead(PVOID pBuffer, DWORD dwSize) {
    HANDLE hDevice = GetDeviceHandle();
    if (hDevice == INVALID_HANDLE_VALUE) return FALSE;

    DWORD dwRet;
    BOOL bRet = DeviceIoControl(hDevice, IOCTL_MY_DRIVER_READ, NULL, 0, pBuffer, dwSize, &dwRet, NULL);
    CloseHandle(hDevice);
    return bRet;
}

// 发送写请求
BOOL DriverWrite(PVOID pBuffer, DWORD dwSize) {
    HANDLE hDevice = GetDeviceHandle();
    if (hDevice == INVALID_HANDLE_VALUE) return FALSE;

    DWORD dwRet;
    BOOL bRet = DeviceIoControl(hDevice, IOCTL_MY_DRIVER_WRITE, pBuffer, dwSize, NULL, 0, &dwRet, NULL);
    CloseHandle(hDevice);
    return bRet;
}

四、导出函数封装(动态链接库)
1. 创建 DLL 接口
// MyDriverAPI.h
#ifdef MYDRIVER_API_EXPORTS
#define MYDRIVER_API __declspec(dllexport)
#else
#define MYDRIVER_API __declspec(dllimport)
#endif

MYDRIVER_API BOOL MYAPI LoadMyDriver(LPWSTR szDriverPath);
MYDRIVER_API BOOL MYAPI UnloadMyDriver();
MYDRIVER_API BOOL MYAPI DriverReadData(PVOID pBuffer, DWORD dwSize);
MYDRIVER_API BOOL MYAPI DriverWriteData(PVOID pBuffer, DWORD dwSize);

// MyDriverAPI.cpp
#include "MyDriverAPI.h"
#include "MyDriver.h"
// 实现具体函数逻辑(调用前文封装的加载/通信函数)

五、易语言模块开发
1. 定义模块数据类型
// 驱动操作句柄
类型 驱动句柄, 整数型

// 初始化模块
子程序 初始化驱动模块()
    ' 加载系统依赖库
    调用 DLL ("kernel32", "SetErrorMode", 整数型, 整数型, 1)
结束子程序

// 加载驱动(易语言声明)
声明 DLL 函数 #加载驱动, 逻辑型, "MyDriverAPI.dll", "LoadMyDriver"
    参 驱动路径, 文本型
结束声明

// 读写操作示例
子程序 驱动读操作(数据缓冲区, 数据长度)
    .局部变量 结果, 逻辑型
    结果 = #驱动读函数 (数据缓冲区, 数据长度)
    .如果 (结果 = 假)
        输出调试文本 (“读操作失败: ” + 到文本 (取最后错误 ()))
    .否则
        输出调试文本 (“读操作成功”)
    .如果结束
结束子程序

六、开发注意事项
  • 权限控制:加载驱动需以管理员权限运行程序
  • 错误处理:每个 API 调用后添加 GetLastError() 错误捕获
  • 同步机制:复杂通信场景添加互斥锁避免并发冲突
  • 兼容性:支持 x86/x64 架构需分别编译驱动和三环程序
通过以上步骤,可实现内核驱动与用户层程序的完整交互闭环,后续课程将讲解 IOCTL 通信协议设计与高性能数据传输优化。

Windows内核上专题.png
游客,如果您要查看本帖隐藏内容请回复


捷云鲸技术社区(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:25 , Processed in 0.104502 second(s), 40 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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