编写通用 Hello World 驱动程序 (KMDF)

本主题介绍了如何使用内核模式驱动程序框架 (KMDF) 编写通用 Windows 驱动程序。首先使用 Microsoft Visual Studio 模板,然后在单独的计算机上部署和安装你的驱动程序。

若要开始操作,请确保你已安装 Visual Studio 2015 和 Windows 驱动程序工具包 (WDK) 10。可从 Windows 硬件开发人员中心下载它们。

当安装 WDK 时,需要包含 Windows 调试工具

创建和构建驱动程序包

  1. 打开 Microsoft Visual Studio。在“文件”菜单上,选择“新建 > 项目”
  2. 在“新建项目”对话框中,选择“WDF”
  3. 在中间窗格中,选择“内核模式驱动程序,空(KMDF)”
  4. 在“名称”字段中,输入“KmdfHelloWorld”作为项目名称。

    注意  *在创建新的 KMDF 或 UMDF 驱动程序时,必须选择一个长度不超过 32 个字符的驱动程序名称。此长度限制在 wdfglobals.h 中定义。
     
  5. 在“位置”字段中,输入要在其中创建新项目的目录。
  6. 选中“创建解决方案的目录”。单击“确定”

    “新建项目”对话框的屏幕截图

    Visual Studio 创建了一个项目和一个解决方案。你可以在“解决方案资源管理器”窗口中看到它们,如此处所示。(如果“解决方案资源管理器”窗口不可见,则从“视图”菜单中选择“解决方案资源管理器”。)该解决方案包含名为 KmdfHelloWorld 的驱动程序项目。

    “解决方案资源管理器”窗口的屏幕截图,显示了包项目 (KmdfHelloWorld Packages) 和空的驱动程序项目 (KmdfHelloWorld)
  7. 在“解决方案资源管理器”窗口中,右键单击“KmdfHelloWorld”,然后选择“属性”。 导航到“配置属性”>“驱动程序设置”>“常规”,请注意,“目标平台”默认为“通用”

  8. 在“解决方案资源管理器”窗口中,右键单击“KmdfHelloWorld”,然后选择“添加”>“新建项目”
  9. 在“添加新项目”对话框中,选择“C++ 文件”。对于“名称”,输入“Driver.c”。

    注意  文件扩展名为 .c,不是 .cpp
     

    单击“添加”。Driver.c 文件添加在源文件下,如下所示。

    “解决方案资源管理器”窗口的屏幕截图,显示添加到驱动程序项目中的 Driver.c 文件
  10. 打开 Driver.c 并输入此代码:

    
    
    #include <ntddk.h>
    #include <wdf.h>
    DRIVER_INITIALIZE DriverEntry;
    EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd;
    
    NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT  DriverObject, _In_ PUNICODE_STRING RegistryPath)
    {
        NTSTATUS status;
        WDF_DRIVER_CONFIG config;
     
        KdPrintEx(( DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n" ));
        WDF_DRIVER_CONFIG_INIT(&config, KmdfHelloWorldEvtDeviceAdd);
        status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);
        return status;
    }
    
    NTSTATUS KmdfHelloWorldEvtDeviceAdd(_In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit)
    {
        NTSTATUS status;
        WDFDEVICE hDevice;
        UNREFERENCED_PARAMETER(Driver);
    
        KdPrintEx(( DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: KmdfHelloWorldEvtDeviceAdd\n" ));
        status = WdfDeviceCreate(&DeviceInit, WDF_NO_OBJECT_ATTRIBUTES, &hDevice);
        return status;
    }
    
    
  11. 保存 Driver.c。
  12. 在“解决方案资源管理器”窗口中,右键单击“解决方案‘KmdfHelloWorld’(1 个项目)”,然后选择“配置管理器”。为驱动程序项目和程序包项目选择配置和平台。在本练习中,我们选择调试和 x64。

  13. 在“解决方案资源管理器”窗口中,右键单击“KmdfHelloWorld”,然后选择“属性”。在“Wpp 跟踪”>“所有选项”中,将“运行 Wpp 跟踪”设置为“否”。单击“应用”,然后单击“确定”
  14. 若要构建驱动程序并创建驱动程序包,请从“构建”菜单中选择“构建解决方案”。Visual Studio 在“输出”窗口中显示构建进度。(如果“输出”窗口不可见,则从“视图”菜单中选择“输出”。)

    当你已验证解决方案成功生成时,可以关闭 Visual Studio。

  15. 若要查看生成的驱动程序,则在“文件资源管理器”中,依次转到你的“KmdfHelloWorld”文件夹和“C:\KmdfHelloWorld\x64\Debug”。该文件夹包括:

    • KmdfHelloWorld.sys -- 内核模式驱动程序文件
    • KmdfHelloWorld.inf -- 在安装驱动程序时 Windows 使用的信息文件
    • KmdfHelloWorld.cat -- 安装程序用于验证驱动程序包测试签名的目录文件

部署和安装驱动程序

通常,当你测试和调试驱动程序时,调试器和驱动程序会在不同的计算机上运行。运行调试器的计算机称为“主计算机”,运行驱动程序的计算机称为目标计算机。目标计算机也称为测试计算机

到目前为止,你已在主计算机上使用 Visual Studio 构建了驱动程序。现在,你需要配置目标计算机。按照预配计算机以便进行驱动程序部署和测试 (WDK 10) 中的说明进行操作。然后,你可以部署、安装、加载和调试驱动程序:

  1. 在主机上,打开 Visual Studio 中的解决方案。你可以在 KmdfHelloWorld 文件夹中双击解决方案文件 KmdfHelloWorld.sln。
  2. 在“解决方案资源管理器”窗口中,右键单击“KmdfHelloWorld”项目,然后选择“属性”
  3. 在“KmdfHelloWorld 属性页”窗口中,转到“配置属性”>“驱动程序安装”>“部署”,如此处所示。
  4. 选中“部署前删除以前的驱动程序版本”
  5. 对于“目标设备名称”,请选择配置用于测试和调试的计算机名。在本练习中,我们使用名为 MyTestComputer 的计算机。
  6. 选择“硬件 ID 驱动程序更新”,然后输入驱动程序的硬件 ID。在本练习中,硬件 ID 为 Root\KmdfHelloWorld。单击“确定”

    “KmdfHelloWorld Package 属性页”窗口的屏幕截图,显示选择的“部署驱动程序安装”
    注意  在本练习中,硬件 ID 未标识硬件的真实部分。它标识了虚构设备,该设备位于设备树中,作为根节点的子节点。对于真实的硬件,不选择“硬件 ID 驱动程序更新”,选择“安装和验证”

    你将在驱动程序的信息 (INF) 文件中看到硬件 ID。在“解决方案资源管理器”窗口中,转到“KmdfHelloWorld”>“驱动程序文件”,然后双击“KmdfHelloWorld.inf”。硬件 ID 位于 [Standard.NT$ARCH$] 之下。

    
    [Standard.NT$ARCH$]
    %KmdfHelloWorld.DeviceDesc%=KmdfHelloWorld_Device, Root\KmdfHelloWorld
    
    
     
  7. 在“调试”菜单上,选择“启动调试”或按键盘上的 F5。
  8. Visual Studio 首先在“输出”窗口中显示进度。然后,它将打开“调试器即时窗口”并继续显示进度。

    等待直至已在目标计算机上部署、安装以及加载驱动程序。此操作可能会花费一两分钟的时间。

  9. 在“调试”菜单上,选择“全部中断”。主计算机上的调试器将中断目标计算机。在“调试器即时”窗口中,你可以看到内核调试命令提示符:kd>

    调试器即时窗口中命令提示符的屏幕截图
  10. 此时,可以试验调试器,方法是在 kd> 提示符处输入命令。例如,可以尝试使用以下命令:

  11. 若要让目标计算机再次运行,请从“调试”菜单中选择“继续”。
  12. 若要停止调试会话,请从“调试”菜单中选择“停止调试”

相关主题

开发、测试以及部署驱动程序
Windows 调试工具
编写第一个驱动程序

 

 

显示: