CommKitIoctl.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // CommKitIoctl.h - 用户态/内核态共享的 IOCTL 码与数据结构定义
  2. // 被 dll/ 与 driver/ 共同包含,确保双方契约一致
  3. #pragma once
  4. #include <winioctl.h>
  5. // ============================================================================
  6. // 用户态 CreateFile 使用的设备名(\\.\CommModifyKit)
  7. // ============================================================================
  8. #define COMMKIT_USER_DEVICE_NAME L"\\\\.\\CommModifyKit"
  9. #define COMMKIT_DEVICE_DOS_NAME L"\\DosDevices\\CommModifyKit"
  10. #define COMMKIT_DEVICE_NAME L"\\Device\\CommModifyKit"
  11. // ============================================================================
  12. // IOCTL 设备类型与控制码
  13. // 设备类型 0x8000 表示用户自定义设备类型
  14. // ============================================================================
  15. #define COMMKIT_DEVICE_TYPE 0x8000
  16. // InitMonitor 调用:注册用户态回调管道(DLL 启动事件循环线程)
  17. #define IOCTL_COMMKIT_REGISTER_CALLBACK \
  18. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
  19. // Monitor 调用:绑定(启用监控)指定串口编号
  20. #define IOCTL_COMMKIT_ATTACH_PORT \
  21. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
  22. // Stop 调用:解绑(停止监控)指定串口编号
  23. #define IOCTL_COMMKIT_DETACH_PORT \
  24. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
  25. // SetWrite_Data 调用:向指定串口下发写 IRP(数据由驱动透传给下层串口)
  26. #define IOCTL_COMMKIT_WRITE_PORT \
  27. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x803, METHOD_IN_DIRECT, FILE_WRITE_DATA)
  28. // SetRead_Data 调用:从指定串口发起异步读请求(结果通过回调 OP_READ 上抛)
  29. #define IOCTL_COMMKIT_READ_PORT \
  30. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x804, METHOD_IN_DIRECT, FILE_READ_DATA)
  31. // DLL 工作线程调用:从驱动批量读取捕获的事件(阻塞或返回 0 条)
  32. #define IOCTL_COMMKIT_READ_EVENTS \
  33. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x805, METHOD_OUT_DIRECT, FILE_READ_DATA)
  34. // FreeMonitor 调用:解绑所有端口、清空事件队列(不卸载驱动服务)
  35. #define IOCTL_COMMKIT_FREE_ALL \
  36. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)
  37. // ============================================================================
  38. // 单条事件结构(内核态 → 用户态)
  39. // 注意:字段对齐使用 1 字节 pack,便于跨位数(WOW64)传递
  40. // ============================================================================
  41. #define COMMKIT_MAX_DATA 4096 // 单条事件最大数据字节数
  42. #define COMMKIT_EVENT_BATCH 16 // 单次 IOCTL 最多返回事件数
  43. #define COMMKIT_RING_CAPACITY 256 // 内核态每端口环形缓冲容量
  44. #pragma pack(push, 1)
  45. typedef struct _COMMKIT_EVENT {
  46. INT32 Sequence; // 递增序列号(每次回调递增)
  47. double TimeStamp; // OLE Automation date(0=用当前时间)
  48. UINT32 ComNumber; // 串口编号(COM n 的 n)
  49. UINT32 EventType; // 事件类型(见 CommKitEvents.h)
  50. UINT32 DataSize; // 有效数据字节数(<= COMMKIT_MAX_DATA)
  51. CHAR Data[COMMKIT_MAX_DATA]; // 内联数据缓冲
  52. } COMMKIT_EVENT, *PCOMMKIT_EVENT;
  53. #pragma pack(pop)
  54. // IOCTL_COMMKIT_ATTACH_PORT / DETACH_PORT 输入参数
  55. #pragma pack(push, 1)
  56. typedef struct _COMMKIT_PORT_REQUEST {
  57. UINT32 ComNumber; // 串口编号
  58. } COMMKIT_PORT_REQUEST, *PCOMMKIT_PORT_REQUEST;
  59. #pragma pack(pop)
  60. // IOCTL_COMMKIT_WRITE_PORT / READ_PORT 输入参数(数据通过 METHOD_IN_DIRECT 的 pInputBuffer 传递)
  61. #pragma pack(push, 1)
  62. typedef struct _COMMKIT_DATA_REQUEST {
  63. UINT32 ComNumber; // 串口编号
  64. UINT32 DataLen; // 数据长度(字节数)
  65. CHAR Data[1]; // 变长数据,实际长度由 DataLen 决定
  66. } COMMKIT_DATA_REQUEST, *PCOMMKIT_DATA_REQUEST;
  67. #pragma pack(pop)