// EventRingBuffer.h - 内核态每端口事件环形缓冲区 // 职责:保存该端口捕获的 COMMKIT_EVENT 事件 // DLL 通过 IOCTL_COMMKIT_READ_EVENTS 批量读取 // 同步:KSPIN_LOCK 保护(IRQL <= DISPATCH_LEVEL) // 满了之后覆盖最旧事件,避免阻塞 IRP 完成例程 #pragma once #include #include #include "../common/CommKitIoctl.h" namespace commkit_driver { class EventRingBuffer { public: EventRingBuffer(); ~EventRingBuffer(); // 初始化环形缓冲(分配内存) NTSTATUS Initialize(); // 反初始化(释放内存) void Cleanup(); // 推入一条事件(拷贝 lpData 前 data_size 字节) // 调用者 IRQL <= DISPATCH_LEVEL void Push(ULONG sequence, DOUBLE 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