ClientConnection.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // ClientConnection.h - 用户态连接管理
  2. // 职责:维护 DLL 与驱动之间的控制设备 + 端口监控启用列表
  3. // 当 DLL 通过 ATTACH_PORT IOCTL 启用某端口时,标记该端口为监控状态
  4. // 当 DLL 通过 READ_EVENTS IOCTL 读取事件时,遍历所有启用端口的环形缓冲
  5. #pragma once
  6. #include <ntddk.h>
  7. #include <wdf.h>
  8. #include "DeviceContext.h"
  9. #include "EventRingBuffer.h"
  10. namespace commkit_driver {
  11. class ClientConnection {
  12. public:
  13. // 初始化(构造不分配资源)
  14. void Initialize();
  15. // 清理资源(驱动卸载时调用)
  16. void Cleanup();
  17. // ====== IOCTL 处理接口(由 QueueCallback 调用)======
  18. // REGISTER_CALLBACK:标记 DLL 已连接
  19. NTSTATUS HandleRegisterCallback();
  20. // ATTACH_PORT:启用某端口监控
  21. NTSTATUS HandleAttachPort(ULONG com_number);
  22. // DETACH_PORT:停止某端口监控
  23. NTSTATUS HandleDetachPort(ULONG com_number);
  24. // WRITE_PORT:向指定串口发数据
  25. NTSTATUS HandleWritePort(ULONG com_number, PVOID data, ULONG len);
  26. // READ_PORT:从指定串口读数据(异步,结果通过回调上抛)
  27. NTSTATUS HandleReadPort(ULONG com_number, PVOID data, ULONG len);
  28. // READ_EVENTS:批量读取所有启用端口的事件
  29. // out_buf:用户缓冲;out_size:缓冲字节大小
  30. // returned:实际返回字节数
  31. NTSTATUS HandleReadEvents(PVOID out_buf, ULONG out_size, PULONG returned);
  32. // FREE_ALL:停止所有监控
  33. NTSTATUS HandleFreeAll();
  34. // 注册一个过滤设备(当 EvtDeviceAdd 创建时调用)
  35. // com_number 暂为 0,由 UpdatePortComNumber 更新
  36. void RegisterFilterDevice(WDFDEVICE device);
  37. // 更新端口表中设备的 COM 编号(EvtDevicePrepareHardware 解析后调用)
  38. void UpdatePortComNumber(WDFDEVICE device, ULONG com_number);
  39. // 注销一个过滤设备
  40. void UnregisterFilterDevice(ULONG com_number);
  41. private:
  42. // 查找指定 COM 编号对应的过滤设备上下文
  43. PDEVICE_CONTEXT FindPortContext(ULONG com_number);
  44. // 全局端口表锁
  45. KSPIN_LOCK ports_lock_;
  46. // 端口→设备上下文映射(最多支持 256 个 COM 端口)
  47. typedef struct {
  48. ULONG ComNumber;
  49. PDEVICE_CONTEXT Context;
  50. } PORT_ENTRY;
  51. PORT_ENTRY ports_table_[256];
  52. ULONG ports_count_;
  53. // 控制设备对象
  54. WDFDEVICE control_device_;
  55. // DLL 是否已注册回调
  56. BOOLEAN callback_registered_;
  57. };
  58. // 全局实例(手动管理生命周期)
  59. extern ClientConnection g_ClientConnection;
  60. // 访问全局实例
  61. inline ClientConnection& GetClientConnection() {
  62. return g_ClientConnection;
  63. }
  64. } // namespace commkit_driver