最近访客
李落尘Ustinian的头像-  侠者非攻社区
李落尘Ustinian

第一个 HelloWordDriver 驱动程序

机器人
摘要
Mxchild
生成中...

0x00 新建项目

图片[1]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
图片[2]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区

0x01 编写驱动

/*
 * 项目名称:KrpsHelloWorld (KMDF Driver)
 * 描述:一个基于 KMDF 框架的最小化驱动示例
 * 环境:Windows 10/11, WDK
 */

// fltkernel.h 是文件系统过滤驱动的头文件。
// 虽然本代码主要演示 KMDF,但既然引用了它,说明该项目可能后续涉及文件监控功能。
#include <fltkernel.h> 

// WDF (Windows Driver Framework) 是 KMDF 的核心头文件
#include <wdf.h>

// 声明驱动入口点函数
// 系统加载驱动时,会首先寻找并调用这个函数
DRIVER_INITIALIZE DriverEntry;

// 声明设备添加回调函数
// 当框架检测到有硬件需要该驱动管理时,会调用此函数来创建设备
EVT_WDF_DRIVER_DEVICE_ADD KrpsHelloWorldEvtDeviceAdd;

/*
 * 驱动入口点
 * 这是驱动程序的“main”函数。
 * 注意:此时系统还没有完全初始化框架,我们需要手动初始化。
 */
NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT DriverObject,     // 驱动对象指针,由系统传入
    _In_ PUNICODE_STRING RegistryPath     // 注册表路径,指向该驱动的注册表项
)
{
    NTSTATUS status = STATUS_SUCCESS;

    // 定义一个 WDF_DRIVER_CONFIG 结构体
    // 这个结构体用于告诉框架:“我的设备添加回调函数是谁”
    WDF_DRIVER_CONFIG config;

    // 打印调试日志
    // 注意:这里使用了双层括号 ((...)),这是 KdPrintEx 宏的特殊要求
    KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KrpsHelloWorld: DriverEntry\n"));

    // 触发断点
    // 如果连接了内核调试器,程序运行到这里会暂停,方便调试
    KdBreakPoint();

    // 初始化配置结构体
    // 第一个参数:结构体指针
    // 第二个参数:EvtDeviceAdd 回调函数指针。
    // 意思是:一旦框架初始化完成,并且发现有硬件匹配,就去调用 KrpsHelloWorldEvtDeviceAdd
    WDF_DRIVER_CONFIG_INIT(&config, KrpsHelloWorldEvtDeviceAdd);

    // 创建 WDF 驱动对象
    // 这一步非常关键:它会将 WDM 的 DriverObject 包装成 KMDF 的 WDFDRIVER 对象
    // 从此以后,KMDF 框架接管了 DriverObject,我们不再直接操作底层的 IRP 分发
    status = WdfDriverCreate(
        DriverObject,             // 原始的 WDM 驱动对象
        RegistryPath,             // 注册表路径
        WDF_NO_OBJECT_ATTRIBUTES, // 对象属性(这里不需要)
        &config,                  // 刚才初始化的配置
        WDF_NO_HANDLE             // 如果不需要保存驱动句柄,填 NULL 或 WDF_NO_HANDLE
    );

    // 返回状态
    // 如果 WdfDriverCreate 失败,驱动加载就会失败
    return status;
}

/*
 * 设备添加回调函数
 * 当驱动加载成功,并且系统发现有硬件(或虚拟设备)匹配该驱动时,
 * 框架会自动调用这个函数。
 * 在这里,我们负责创建具体的“设备对象”。
 */
NTSTATUS
KrpsHelloWorldEvtDeviceAdd(
    _In_ WDFDRIVER Driver,        // 父驱动对象句柄
    _Inout_ PWDFDEVICE_INIT DeviceInit // 设备初始化结构,用于配置设备属性
)
{
    // 告诉编译器 Driver 参数虽然未使用,但这并非错误(消除编译警告 C4100)
    UNREFERENCED_PARAMETER(Driver);

    NTSTATUS status;

    // 定义设备句柄
    // 这个句柄代表了我们即将创建的设备实例
    WDFDEVICE hDevice;

    // 打印日志,确认进入了设备添加阶段
    KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KrpsHelloWorld: KrpsHelloWorldEvtDeviceAdd\n"));

    // 再次触发断点
    // 这可以用来验证设备是否真的被系统枚举到了
    KdBreakPoint();

    // 创建 WDF 设备对象
    // 这是 KMDF 中最核心的函数之一
    status = WdfDeviceCreate(
        &DeviceInit,              // 传入设备初始化结构(框架会自动清理它)
        WDF_NO_OBJECT_ATTRIBUTES, // 对象属性(默认)
        &hDevice                  // 输出:返回创建好的设备句柄
    );

    // 注意:
    // 在 KMDF 中,我们不需要像 WDM 那样手动创建符号链接或处理 IRP_MJ_CREATE
    // 框架会自动帮我们处理大部分底层细节。
    // 如果需要创建设备接口(让应用层能找到),通常在这里调用 WdfDeviceCreateDeviceInterface

    return status;
}

0x02 编译驱动

图片[3]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
图片[4]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
图片[5]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
图片[6]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区

0x03 调试驱动

图片[7]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
图片[8]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
图片[9]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
图片[10]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
图片[11]-  第一个 HelloWordDriver 驱动程序-  侠者非攻社区
本站一切资源仅供学习交流使用请勿商业运营,严禁从事违法侵权等任何非法活动,否则后果自负!
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容