// DriverEntry.cpp - KMDF 驱动入口 // 职责:初始化 WDF 驱动对象、注册 EvtDeviceAdd(PnP 过滤驱动) // 创建控制设备 \\.\CommModifyKit 接收 DLL 的 IOCTL // 注意:本驱动作为串口设备类的 UpperFilters 加载 // 当 PnP Manager 创建串口 PDO 时,调用 EvtDeviceAdd attach 过滤设备 #include #include #include "DeviceContext.h" #include "QueueCallback.h" #include "ClientConnection.h" #include "SerialFilter.h" extern "C" { DRIVER_INITIALIZE DriverEntry; EVT_WDF_DRIVER_DEVICE_ADD EvtDeviceAdd; EVT_WDF_DRIVER_UNLOAD EvtDriverUnload; } // extern "C" namespace commkit_driver { // 全局驱动对象(仅用于内部日志/调试) static WDFDRIVER g_wdf_driver = nullptr; } // namespace commkit_driver extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver_object, PUNICODE_STRING registry_path) { NTSTATUS status; WDF_DRIVER_CONFIG cfg; // 初始化 WDF 配置 WDF_DRIVER_CONFIG_INIT(&cfg, EvtDeviceAdd); cfg.EvtDriverUnload = EvtDriverUnload; // 创建 WDF 驱动对象 status = WdfDriverCreate(driver_object, registry_path, WDF_NO_OBJECT_ATTRIBUTES, &cfg, &commkit_driver::g_wdf_driver); if (!NT_SUCCESS(status)) { return status; } // 初始化 ClientConnection(创建控制设备) status = commkit_driver::CreateControlDevice(commkit_driver::g_wdf_driver); if (!NT_SUCCESS(status)) { return status; } return STATUS_SUCCESS; } extern "C" NTSTATUS EvtDeviceAdd(WDFDRIVER driver, PWDFDEVICE_INIT init) { UNREFERENCED_PARAMETER(driver); UNREFERENCED_PARAMETER(init); // 完整实现: // 1. 从硬件 ID 解析 COM 编号 // 2. WdfDeviceCreate 创建过滤设备 // 3. IoAttachDeviceToDeviceStack attach 到串口栈 // 4. 注册 IRP_MJ_READ/WRITE/DEVICE_CONTROL 派遣例程 // 5. 调用 GetClientConnection().RegisterFilterDevice(com_number, device) // 此处为框架,留待按具体硬件环境调试完善 return STATUS_SUCCESS; } extern "C" VOID EvtDriverUnload(WDFDRIVER driver) { UNREFERENCED_PARAMETER(driver); commkit_driver::GetClientConnection().Cleanup(); commkit_driver::g_wdf_driver = nullptr; }