Bonjour,


J'ai récemment installé le "Driver Kit" avec Visual Studio 2019 pour découvrir la programmation de pilote de périphérique.

J'ai bien installé aussi la version 14.21 de MSVC.

J'ai créé un nouveau projet (Empty WDM Driver), j'ai modifié la "Version de l'ensemble d'outils MSVC" dans les paramètres de mon projet.

J'ai commencé par rencontrer des problèmes lors de la compilation : j'ai dû entourer mon code de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
extern "C" {
 
...
 
}
pour que ça fonctionne, sans quoi j'avais une erreur LNK2019 symbole externe non résolu _DriverEntry@8 référencé dans la fonction _GsDriverEntry@8 MyDriver2. Je ne sais pas si cette erreur est "normale", ou si elle provient d'un problème de configuration.

J'ai également dû désactiver l'avertissement 4100 (paramètre formel non référencé).

Ensuite, j'ai enfin réussi à compiler mon projet.

J'ai voulu le tester avec une machine virtuelle, m'inspirant de ce tutoriel :


J'ai démarré une machine virtuelle (VirtualBox) sous Windows 10, j'y ai activé le "mode de test" avec bcdedit, j'y ai désactivé le contrôle de compte utilisateur UAC. J'ai installé manuellement le certificat de test de mon pilote avec le fichier CER, puis avec le fichier PFX exporté.

Avec OSR Loader, j'ai chargé le fichier SYS créé par Visual Studio. L'enregistrement s'effectue normalement, mais quand je clique sur "Start service", le logiciel m'affiche l'erreur "Le chargement du pilote a été bloqué". Mon pilote n'apparaît pas dans la fenêtre du Gestionnaire de périphérique (même en cochant "afficher les périphériques cachés"), mais il apparaît quand j'utilise la commande "driverquery".

Comment dois-je faire pour tester mon pilote sur ma machine virtuelle, et pour voir la sortie débogage (dans la vidéo il utilise la fonction "KdPrint" pour afficher les informations de débogage) ?

Je sais par ailleurs que Visual Studio permet de déboguer directement dans la machine distante, mais je n'ai pas réussi à configurer cette fonctionnalité.

Pour le moment, je me suis plus ou moins contenté de recopier le code affiché dans la première partie de la vidéo tutoriel, afin de tester :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
#include "ntddk.h"
 
DEVICE_TYPE const DeviceType = FILE_DEVICE_UNKNOWN;
 
UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\mydriver1");
 
UNICODE_STRING SymLinkName = RTL_CONSTANT_STRING(L"\\??\\mydriver1link");
 
PDEVICE_OBJECT DeviceObject;
 
#pragma warning( push )
 
#pragma warning( disable : 4100 )   
 
extern "C" {
 
VOID Unload(PDRIVER_OBJECT DriverObject) {       
 
   IoDeleteDevice(DeviceObject);      
 
   IoDeleteSymbolicLink(&SymLinkName);      
 
   KdPrint(("Device unloaded\r\n"));    
 
}   
 
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {   
 
     NTSTATUS status;   
 
     DriverObject->DriverUnload = Unload;    
 
     status = IoCreateDevice(DriverObject, 0, &DeviceName, DeviceType, FILE_DEVICE_SECURE_OPEN, FALSE, &DeviceObject);   
 
     if (!NT_SUCCESS(status)) {    
 
          KdPrint(("Creating device failed\r\n"));    
 
          return status;      
 
     }    
 
     status = IoCreateSymbolicLink(&SymLinkName, &DeviceName);      
 
     if (!NT_SUCCESS(status)) {    
 
         KdPrint(("Creating symbolic link failed\r\n"));    
 
         IoDeleteDevice(DeviceObject);        
 
         return status;    
 
     }      
 
     KdPrint(("Device loaded\r\n"));      
 
     return status;  
 
}
 
}
 
#pragma warning( pop )

Cordialement,

E__Man.