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