扫描二维码关注官方公众号

0 评论

0 收藏

分享

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

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

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

x

第九课 驱动功能封装与三环交互开发
一、驱动文件集成到三环项目
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
回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
admin 实名认证
管理员
主题 1380
回复 75
粉丝 1

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