// ClientConnection.h - 用户态连接管理 // 职责:维护 DLL 与驱动之间的控制设备 + 端口监控启用列表 // 当 DLL 通过 ATTACH_PORT IOCTL 启用某端口时,标记该端口为监控状态 // 当 DLL 通过 READ_EVENTS IOCTL 读取事件时,遍历所有启用端口的环形缓冲 #pragma once #include #include #include "DeviceContext.h" #include "EventRingBuffer.h" namespace commkit_driver { class ClientConnection { public: ClientConnection(); ~ClientConnection(); // 初始化:创建控制设备 + 符号链接 NTSTATUS Initialize(WDFDRIVER driver); // 反初始化 void Cleanup(); // ====== IOCTL 处理接口(由 QueueCallback 调用)====== // REGISTER_CALLBACK:标记 DLL 已连接 NTSTATUS HandleRegisterCallback(); // ATTACH_PORT:启用某端口监控 NTSTATUS HandleAttachPort(ULONG com_number); // DETACH_PORT:停止某端口监控 NTSTATUS HandleDetachPort(ULONG com_number); // WRITE_PORT:向指定串口发数据 NTSTATUS HandleWritePort(ULONG com_number, PVOID data, ULONG len); // READ_PORT:从指定串口读数据(异步,结果通过回调上抛) NTSTATUS HandleReadPort(ULONG com_number, PVOID data, ULONG len); // READ_EVENTS:批量读取所有启用端口的事件 // out_buf:用户缓冲;out_size:缓冲字节大小 // returned:实际返回字节数 NTSTATUS HandleReadEvents(PVOID out_buf, ULONG out_size, PULONG returned); // FREE_ALL:停止所有监控 NTSTATUS HandleFreeAll(); // 注册一个过滤设备(当 SerialFilter 创建时调用) // 将 com_number ↔ WDFDEVICE 关联存入内部表 void RegisterFilterDevice(ULONG com_number, WDFDEVICE device); // 注销一个过滤设备 void UnregisterFilterDevice(ULONG com_number); private: // 查找指定 COM 编号对应的过滤设备上下文 PDEVICE_CONTEXT FindPortContext(ULONG com_number); // 全局端口表锁 KSPIN_LOCK ports_lock_; // 端口→设备上下文映射(最多支持 256 个 COM 端口) typedef struct { ULONG ComNumber; PDEVICE_CONTEXT Context; } PORT_ENTRY; PORT_ENTRY ports_table_[256]; ULONG ports_count_; // 控制设备对象 WDFDEVICE control_device_; // DLL 是否已注册回调 BOOLEAN callback_registered_; }; // 全局单例 ClientConnection& GetClientConnection(); } // namespace commkit_driver