DriverEntry.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. // 初始化 WDF 配置
  26. WDF_DRIVER_CONFIG_INIT(&cfg, EvtDeviceAdd);
  27. cfg.EvtDriverUnload = EvtDriverUnload;
  28. // 创建 WDF 驱动对象
  29. status = WdfDriverCreate(driver_object, registry_path,
  30. WDF_NO_OBJECT_ATTRIBUTES, &cfg,
  31. &commkit_driver::g_wdf_driver);
  32. if (!NT_SUCCESS(status)) {
  33. return status;
  34. }
  35. // 初始化 ClientConnection(创建控制设备)
  36. status = commkit_driver::CreateControlDevice(commkit_driver::g_wdf_driver);
  37. if (!NT_SUCCESS(status)) {
  38. return status;
  39. }
  40. return STATUS_SUCCESS;
  41. }
  42. extern "C" NTSTATUS EvtDeviceAdd(WDFDRIVER driver, PWDFDEVICE_INIT init) {
  43. UNREFERENCED_PARAMETER(driver);
  44. UNREFERENCED_PARAMETER(init);
  45. // 完整实现:
  46. // 1. 从硬件 ID 解析 COM 编号
  47. // 2. WdfDeviceCreate 创建过滤设备
  48. // 3. IoAttachDeviceToDeviceStack attach 到串口栈
  49. // 4. 注册 IRP_MJ_READ/WRITE/DEVICE_CONTROL 派遣例程
  50. // 5. 调用 GetClientConnection().RegisterFilterDevice(com_number, device)
  51. // 此处为框架,留待按具体硬件环境调试完善
  52. return STATUS_SUCCESS;
  53. }
  54. extern "C" VOID EvtDriverUnload(WDFDRIVER driver) {
  55. UNREFERENCED_PARAMETER(driver);
  56. commkit_driver::GetClientConnection().Cleanup();
  57. commkit_driver::g_wdf_driver = nullptr;
  58. }