CommKitIoctl.h 4.5 KB

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