EventRingBuffer.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. EventRingBuffer();
  14. ~EventRingBuffer();
  15. // 初始化环形缓冲(分配内存)
  16. NTSTATUS Initialize();
  17. // 反初始化(释放内存)
  18. void Cleanup();
  19. // 推入一条事件(拷贝 lpData 前 data_size 字节)
  20. // 调用者 IRQL <= DISPATCH_LEVEL
  21. void Push(ULONG sequence, DOUBLE timestamp,
  22. ULONG com_number, ULONG event_type,
  23. ULONG data_size, PVOID data);
  24. // 批量弹出事件到 out_buf
  25. // max_count:out_buf 最多能容纳多少条
  26. // 返回实际弹出的条数
  27. LONG PopBatch(PCOMMKIT_EVENT out_buf, LONG max_count);
  28. // 清空缓冲
  29. void Clear();
  30. private:
  31. KSPIN_LOCK lock_;
  32. COMMKIT_EVENT* buffer_; // 容量 COMMKIT_RING_CAPACITY
  33. LONG head_; // 下一个写入位置
  34. LONG tail_; // 下一个读取位置
  35. LONG count_; // 当前条数
  36. };
  37. } // namespace commkit_driver