EventRingBuffer.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // EventRingBuffer.h - 内核态每端口事件环形缓冲区
  2. // 职责:保存该端口捕获的 COMMKIT_EVENT 事件
  3. // DLL 通过 IOCTL_COMMKIT_READ_EVENTS 批量读取
  4. // 同步:KSPIN_LOCK 保护(IRQL <= DISPATCH_LEVEL)
  5. // 满了之后覆盖最旧事件,避免阻塞 IRP 完成例程
  6. #pragma once
  7. #include <ntddk.h>
  8. #include <wdf.h>
  9. #include "../common/CommKitIoctl.h"
  10. namespace commkit_driver {
  11. class EventRingBuffer {
  12. public:
  13. // 初始化环形缓冲(分配内存)
  14. NTSTATUS Initialize();
  15. // 反初始化(释放内存)
  16. void Cleanup();
  17. // 推入一条事件(拷贝 lpData 前 data_size 字节)
  18. // timestamp: 100ns 单位时间戳(使用 KeQueryInterruptTime 获取)
  19. // 调用者 IRQL <= DISPATCH_LEVEL
  20. void Push(ULONG sequence, UINT64 timestamp,
  21. ULONG com_number, ULONG event_type,
  22. ULONG data_size, PVOID data);
  23. // 批量弹出事件到 out_buf
  24. // max_count:out_buf 最多能容纳多少条
  25. // 返回实际弹出的条数
  26. LONG PopBatch(PCOMMKIT_EVENT out_buf, LONG max_count);
  27. // 清空缓冲
  28. void Clear();
  29. private:
  30. KSPIN_LOCK lock_;
  31. COMMKIT_EVENT* buffer_; // 容量 COMMKIT_RING_CAPACITY
  32. LONG head_; // 下一个写入位置
  33. LONG tail_; // 下一个读取位置
  34. LONG count_; // 当前条数
  35. };
  36. } // namespace commkit_driver