SerialFilter.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // SerialFilter.h - 串口 IRP 拦截
  2. // 职责:作为上层过滤驱动 attach 到串口设备栈
  3. // 拦截 IRP_MJ_READ / IRP_MJ_WRITE / IRP_MJ_DEVICE_CONTROL
  4. // 将捕获的数据推入对应端口的环形缓冲
  5. #pragma once
  6. #include <ntddk.h>
  7. #include <wdf.h>
  8. #include "DeviceContext.h"
  9. namespace commkit_driver {
  10. class SerialFilter {
  11. public:
  12. // 创建过滤设备并 attach 到串口设备栈
  13. // parent_serial_pdo:下层串口的 PDO
  14. // 返回 STATUS_SUCCESS + 设置 *filter_device
  15. static NTSTATUS CreateAndAttach(WDFDRIVER driver,
  16. PDEVICE_OBJECT serial_pdo,
  17. ULONG com_number,
  18. WDFDEVICE* out_filter_device);
  19. // 拦截 IRP_MJ_READ 完成:捕获数据并推入环形缓冲
  20. static NTSTATUS OnReadComplete(PDEVICE_OBJECT dev, PIRP irp, PVOID ctx);
  21. // 拦截 IRP_MJ_WRITE 完成:捕获数据并推入环形缓冲
  22. static NTSTATUS OnWriteComplete(PDEVICE_OBJECT dev, PIRP irp, PVOID ctx);
  23. // WDM IRP 预处理回调(KMDF 签名:WDFDEVICE, PIRP)
  24. static NTSTATUS DispatchRead(WDFDEVICE dev, PIRP irp);
  25. static NTSTATUS DispatchWrite(WDFDEVICE dev, PIRP irp);
  26. static NTSTATUS DispatchDeviceControl(WDFDEVICE dev, PIRP irp);
  27. private:
  28. // 从 IRP 中提取数据并推入环形缓冲
  29. // event_type:COMMKIT_OP_READ 或 COMMKIT_OP_WRITE
  30. static void CaptureIrpData(PDEVICE_CONTEXT ctx, PIRP irp, ULONG event_type);
  31. };
  32. } // namespace commkit_driver