2016-05-30 14 views
5

Ho scritto un driver in Visual Studio 2013. Il processo di costruzione ha avuto esito positivo. Quindi ho preparato un computer-traget e ho copiato i file del driver. Poi ho installato il driver:Come avviare un driver auto-scritto

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 

Sembra come se fosse successo. Ho lanciato DebugView sul PC ma ora non so come avviare il driver, in modo che possa vedere un debug-output. Ho una dichiarazione DbgPrintEx() nel mio codice sorgente.

Qualcuno può dirmi come avviare questo driver in modo che possa vedere l'output.

Questo è il codice sorgente del driver:

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

risposta

2

Hai bisogno di fare un EXE (testapp) che avvia il driver se l'installazione è già fatto. È possibile utilizzare sotto il codice nell'applicazione:

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

È necessario aggiungere codice in base alle proprie esigenze. Prova questo.

Per maggiori informazioni scaricare i driver di esempio e le app di prova fornite da microsoft.

0

È possibile utilizzare lo strumento "sc" (controllo servizi) della riga di comando incorporato per avviare il driver.

La sintassi è:

sc start <name> 

Così, se il driver viene installato con il nome "KmdfHelloWorld" il comando dovrebbe essere:

sc start KmdfHelloWorld 
0

Attualmente, sto scrivendo un GPIO Controller/driver per Windows 8.1 & Windows 10 e hanno avuto problemi simili. Il modo più semplice per avviare il driver è configurare e fornire un computer per i test dei driver e l'utilizzo di Visual Studio per distribuire, installare e avviare il driver su una macchina remota.

È buona norma scrivere il driver, quindi distribuirlo e testarlo da remoto (su un altro computer o una macchina virtuale come VirtualBox), in quanto ciò riduce le possibilità di incasinare il computer su cui si sta scrivendo il codice.

Per disposizione un computer, ho usato la seguente pagina MSDN: https://msdn.microsoft.com/en-us/library/windows/hardware/dn745909?f=255&MSPPError=-2147217396

eseguendo i test preconfezionati, si può effettivamente avere VS e Windows relazione sullo stato del driver, ottenere informazioni di debug, e anche impostare punti di interruzione. Fidati di me, per i principianti questo è il modo più semplice per farlo.

Inoltre, non sarebbe male registrarsi e creare la funzione di callback per lo stato di funzionamento predefinito, in questo modo il driver esegue effettivamente qualcosa durante l'esecuzione. A tal fine, utilizzare EVT_WDF_DEVICE_D0_ENTRY come definito per lo EVT_WDF_DRIVER_DEVICE_ADD.

Happy Coding!