如何开始编写自己的驱动程序

5

我在Visual Studio 2013中编写了一个驱动程序,构建过程成功。然后我准备了一个目标计算机,并将驱动程序文件复制到它上面。接着我安装了这个驱动程序:

C:\Windows\system32>pnputil -a "E:\driverZeug\KmdfHelloWorldPackage\KmdfHelloWorld.inf"
Microsoft-PnP-Dienstprogramm

Verarbeitungsinf.:            KmdfHelloWorld.inf
Das Treiberpaket wurde erfolgreich hinzugefügt.
Veröffentlichter Name:            oem42.inf


Versuche gesamt:              1
Anzahl erfolgreicher Importe: 1

看起来很成功。我在PC上运行了DebugView,但现在不知道如何启动驱动程序,以便可以看到调试输出。我的源代码中有一个DbgPrintEx()语句。

有人可以告诉我如何启动这个驱动程序,以便我可以看到输出吗?

这是驱动程序的源代码:

#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;

    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n");
    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;
}
3个回答

4

您需要制作一个EXE(testapp),如果驱动程序已经安装,就启动它。您可以在应用程序中使用以下代码:

SC_HANDLE   schService;  
SC_HANDLE   schSCManager;

schSCManager = OpenSCManager(NULL,                   // local machine
                             NULL,                   // local database
                             SC_MANAGER_ALL_ACCESS   // access required
                             ); 

// Open the handle to the existing service.
schService = OpenService(SchSCManager,
                         DriverName, //name of the driver
                         SERVICE_ALL_ACCESS
                         );

StartService(schService,     // service identifier
                  0,              // number of arguments
                  NULL            // pointer to arguments
                  ));

你需要根据你的需求添加代码。尝试这个。
要获取更多信息,请下载微软提供的示例驱动程序和测试应用程序。

0

您可以使用内置的命令行“sc”(服务控制)工具来启动驱动程序。

语法如下:

sc start <name>

所以,如果您的驱动程序安装的名称为“KmdfHelloWorld”,则命令应该是:

sc start KmdfHelloWorld

0

目前,我正在为Windows 8.1和Windows 10编写GPIO控制器/驱动程序,并遇到了类似的问题。启动驱动程序的最简单方法是设置并配置计算机进行驱动程序测试,并使用Visual Studio在远程计算机上部署、安装和启动驱动程序。

最好的做法是先编写驱动程序,然后在远程部署和测试(可以在另一台计算机或虚拟机(如VirtualBox)上),这样可以减少在编写代码的计算机上出错的机会。

为了配置计算机,我使用了以下MSDN页面: https://msdn.microsoft.com/en-us/library/windows/hardware/dn745909?f=255&MSPPError=-2147217396

通过运行预打包的测试,您实际上可以让VS和Windows报告驱动程序的状态、获取调试信息甚至设置断点。相信我,对于初学者来说,这是最简单的方法。

此外,注册并创建回调函数以处理默认工作状态也是必要的,这样在运行时您的驱动程序才会真正执行某些操作。为此,请使用与 EVT_WDF_DRIVER_DEVICE_ADD 相同的方式定义 EVT_WDF_DEVICE_D0_ENTRY

祝编码愉快!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接