CommKitIoctl.h 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. #define IOCTL_COMMKIT_WRITE_PORT \
  31. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x803, METHOD_IN_DIRECT, FILE_WRITE_DATA)
  32. // SetRead_Data 调用:从指定串口发起异步读请求(结果通过回调 OP_READ 上抛)
  33. #define IOCTL_COMMKIT_READ_PORT \
  34. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x804, METHOD_IN_DIRECT, FILE_READ_DATA)
  35. // DLL 工作线程调用:从驱动批量读取捕获的事件(阻塞或返回 0 条)
  36. #define IOCTL_COMMKIT_READ_EVENTS \
  37. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x805, METHOD_OUT_DIRECT, FILE_READ_DATA)
  38. // FreeMonitor 调用:解绑所有端口、清空事件队列(不卸载驱动服务)
  39. #define IOCTL_COMMKIT_FREE_ALL \
  40. CTL_CODE(COMMKIT_DEVICE_TYPE, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)
  41. // ============================================================================
  42. // 单条事件结构(内核态 → 用户态)
  43. // 注意:字段对齐使用 1 字节 pack,便于跨位数(WOW64)传递
  44. // TimeStamp: 100ns 单位,从 1601-01-01 起算(与 FILETIME 相同)
  45. // ============================================================================
  46. #define COMMKIT_MAX_DATA 4096 // 单条事件最大数据字节数
  47. #define COMMKIT_EVENT_BATCH 16 // 单次 IOCTL 最多返回事件数
  48. #define COMMKIT_RING_CAPACITY 256 // 内核态每端口环形缓冲容量
  49. #pragma pack(push, 1)
  50. typedef struct _COMMKIT_EVENT {
  51. INT32 Sequence; // 递增序列号(每次回调递增)
  52. UINT64 TimeStamp; // 100ns 单位时间戳(0=用当前时间)
  53. UINT32 ComNumber; // 串口编号(COM n 的 n)
  54. UINT32 EventType; // 事件类型(见 CommKitEvents.h)
  55. UINT32 DataSize; // 有效数据字节数(<= COMMKIT_MAX_DATA)
  56. CHAR Data[COMMKIT_MAX_DATA]; // 内联数据缓冲
  57. } COMMKIT_EVENT, *PCOMMKIT_EVENT;
  58. #pragma pack(pop)
  59. // IOCTL_COMMKIT_ATTACH_PORT / DETACH_PORT 输入参数
  60. #pragma pack(push, 1)
  61. typedef struct _COMMKIT_PORT_REQUEST {
  62. UINT32 ComNumber; // 串口编号
  63. } COMMKIT_PORT_REQUEST, *PCOMMKIT_PORT_REQUEST;
  64. #pragma pack(pop)
  65. // IOCTL_COMMKIT_WRITE_PORT / READ_PORT 输入参数(数据通过 METHOD_IN_DIRECT 的 pInputBuffer 传递)
  66. #pragma pack(push, 1)
  67. typedef struct _COMMKIT_DATA_REQUEST {
  68. UINT32 ComNumber; // 串口编号
  69. UINT32 DataLen; // 数据长度(字节数)
  70. CHAR Data[1]; // 变长数据,实际长度由 DataLen 决定
  71. } COMMKIT_DATA_REQUEST, *PCOMMKIT_DATA_REQUEST;
  72. #pragma pack(pop)