DriverEntry.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // DriverEntry.cpp - KMDF 驱动入口
  2. // 职责:初始化 WDF 驱动对象、注册 EvtDeviceAdd(PnP 过滤驱动)
  3. // 创建控制设备 \\.\CommModifyKit 接收 DLL 的 IOCTL
  4. // 注意:本驱动作为串口设备类的 UpperFilters 加载
  5. // 当 PnP Manager 创建串口 PDO 时,调用 EvtDeviceAdd attach 过滤设备
  6. #include <ntddk.h>
  7. #include <wdf.h>
  8. #include "DeviceContext.h"
  9. #include "QueueCallback.h"
  10. #include "ClientConnection.h"
  11. #include "SerialFilter.h"
  12. extern "C" {
  13. DRIVER_INITIALIZE DriverEntry;
  14. EVT_WDF_DRIVER_DEVICE_ADD EvtDeviceAdd;
  15. EVT_WDF_DRIVER_UNLOAD EvtDriverUnload;
  16. } // extern "C"
  17. namespace commkit_driver {
  18. // 全局驱动对象(仅用于内部日志/调试)
  19. static WDFDRIVER g_wdf_driver = nullptr;
  20. } // namespace commkit_driver
  21. extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver_object,
  22. PUNICODE_STRING registry_path) {
  23. NTSTATUS status;
  24. WDF_DRIVER_CONFIG cfg;
  25. // 初始化全局客户端连接管理器
  26. commkit_driver::GetClientConnection().Initialize();
  27. // 初始化 WDF 配置
  28. WDF_DRIVER_CONFIG_INIT(&cfg, EvtDeviceAdd);
  29. cfg.EvtDriverUnload = EvtDriverUnload;
  30. // 创建 WDF 驱动对象
  31. status = WdfDriverCreate(driver_object, registry_path,
  32. WDF_NO_OBJECT_ATTRIBUTES, &cfg,
  33. &commkit_driver::g_wdf_driver);
  34. if (!NT_SUCCESS(status)) {
  35. return status;
  36. }
  37. // 初始化 ClientConnection(创建控制设备)
  38. status = commkit_driver::CreateControlDevice(commkit_driver::g_wdf_driver);
  39. if (!NT_SUCCESS(status)) {
  40. return status;
  41. }
  42. return STATUS_SUCCESS;
  43. }
  44. extern "C" NTSTATUS EvtDeviceAdd(WDFDRIVER driver, PWDFDEVICE_INIT init) {
  45. UNREFERENCED_PARAMETER(driver);
  46. UNREFERENCED_PARAMETER(init);
  47. // 完整实现:
  48. // 1. 从硬件 ID 解析 COM 编号
  49. // 2. WdfDeviceCreate 创建过滤设备
  50. // 3. IoAttachDeviceToDeviceStack attach 到串口栈
  51. // 4. 注册 IRP_MJ_READ/WRITE/DEVICE_CONTROL 派遣例程
  52. // 5. 调用 GetClientConnection().RegisterFilterDevice(com_number, device)
  53. // 此处为框架,留待按具体硬件环境调试完善
  54. return STATUS_SUCCESS;
  55. }
  56. extern "C" VOID EvtDriverUnload(WDFDRIVER driver) {
  57. UNREFERENCED_PARAMETER(driver);
  58. commkit_driver::GetClientConnection().Cleanup();
  59. commkit_driver::g_wdf_driver = nullptr;
  60. }