如何启动一个自编的驱动程序

时间:2016-05-30 09:10:00

标签: c windows driver wdf

我在Visual Studio 2013中编写了一个驱动程序。构建过程成功了。 然后我准备了一个traget-computer并将驱动程序文件复制到它。 然后我安装了驱动程序:

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

3 个答案:

答案 0 :(得分:3)

如果已经完成安装,您需要创建一个启动驱动程序的 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
                  ));

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

欲了解更多信息,请下载微软提供的示例驱动程序和测试应用程序。

答案 1 :(得分:0)

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

语法为:

sc start <name>

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

sc start KmdfHelloWorld

答案 2 :(得分:0)

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

编写驱动程序然后远程部署和测试(在另一台计算机或虚拟机等虚拟机上)是一种很好的做法,因为这样可以减少弄乱正在编写代码的计算机的可能性。

要配置计算机,我使用了以下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所做的那样。

快乐的编码!