admin 发表于 3 天前

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


第九课 驱动功能封装与三环交互开发
一、驱动文件集成到三环项目
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 通信协议设计与高性能数据传输优化。


**** Hidden Message *****

页: [1]
查看完整版本: Windows内核驱动-封装驱动到三环-第9章-全套课程