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()-Statement。

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

这是驱动程序的源代码:

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

3 回答 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
                  ));

您需要根据需要添加代码。尝试这个。

有关详细信息,请下载 Microsoft 提供的示例驱动程序和测试应用程序。

于 2016-09-13T12:58:09.653 回答
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_DEVICE_D0_ENTRY请像对EVT_WDF_DRIVER_DEVICE_ADD.

快乐编码!

于 2016-09-13T14:14:08.807 回答
0

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

语法是:

sc start <name>

因此,如果您的驱动程序使用名称“KmdfHelloWorld”安装,则命令应为:

sc start KmdfHelloWorld
于 2016-09-13T13:14:22.457 回答