// 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