| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // DriverClient.h - 与内核驱动的通信封装
- // 职责:CreateFile 打开 \\.\CommModifyKit 设备 + 封装 DeviceIoControl 调用
- #pragma once
- #include "pch.h"
- #include "../common/CommKitIoctl.h"
- namespace commkit {
- class DriverClient {
- public:
- DriverClient();
- ~DriverClient();
- DriverClient(const DriverClient&) = delete;
- DriverClient& operator=(const DriverClient&) = delete;
- // 打开驱动控制设备 \\.\CommModifyKit
- // 返回 true 表示成功;失败时通过 GetLastError() 查询 Win32 错误码
- bool Open();
- // 关闭驱动设备句柄
- void Close();
- // 是否已打开
- bool IsOpen() const { return handle_ != INVALID_HANDLE_VALUE; }
- // 获取驱动设备句柄(供 EventLoop 复用)
- HANDLE GetHandle() const { return handle_; }
- // ====== IOCTL 封装 ======
- // 注册回调管道(InitMonitor 调用)
- // 告诉驱动开始工作,DLL 工作线程会从 READ_EVENTS 拉事件
- bool RegisterCallback();
- // 绑定(启用监控)指定串口
- bool AttachPort(DWORD com_number);
- // 解绑(停止监控)指定串口
- bool DetachPort(DWORD com_number);
- // 向指定串口写数据
- bool WritePort(DWORD com_number, const void* data, int len);
- // 从指定串口发起异步读请求
- bool ReadPort(DWORD com_number, const void* data, int len);
- // 批量读取捕获的事件(阻塞或返回 0 条)
- // events_out:输出缓冲区;max_count:最多多少条
- // 返回实际读取到的条数,<0 表示错误
- int ReadEvents(COMMKIT_EVENT* events_out, int max_count);
- // 解绑所有端口并清空事件队列(FreeMonitor 调用)
- bool FreeAll();
- private:
- // 通用同步 IOCTL 调用封装
- bool SyncIoctl(DWORD ioctl_code, void* in_buf, DWORD in_size,
- void* out_buf, DWORD out_size, DWORD* returned);
- HANDLE handle_ = INVALID_HANDLE_VALUE;
- };
- } // namespace commkit
|