| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // DriverEntry.cpp - KMDF 驱动入口
- // 职责:初始化 WDF 驱动对象、注册 EvtDeviceAdd(PnP 过滤驱动)
- // 创建控制设备 \\.\CommModifyKit 接收 DLL 的 IOCTL
- // 注意:本驱动作为串口设备类的 UpperFilters 加载
- // 当 PnP Manager 创建串口 PDO 时,调用 EvtDeviceAdd attach 过滤设备
- #include <ntddk.h>
- #include <wdf.h>
- #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;
- // 初始化全局客户端连接管理器
- commkit_driver::GetClientConnection().Initialize();
- // 初始化 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;
- }
|