Meilleur auteur de réponses
Comment créer un driver sous Windows 7, (architecture x64 - 64 bits) ?

Question
-
Bonjour à tous,
Je voudrais connaître la méthode pour créer des drivers pour des cartes électroniques, fixées sur le bus PCI Express d'un PC.
Je suis novice dans le monde de la programmation, je connais juste un peu le langage C++ (1 an et demi), et j'ai réellement besoin de votre aide!
En effet, j'ai besoin de développer des drivers pour une machine tournant avec Windows 7 Professionnel, 64 bits. Dans mon entreprise, des drivers pour nos cartes électroniques existent et fonctionnent déjà très bien, mais c'est seulement pour des environnements Windows XP, 32 bits. Nous n'avons jamais construit ces drivers pour le nouvel O.S. de Microsoft, ni pour une machine x64.
Actuellement, je code en C++, via MS Visual Studio .NET 2003. Et, ici, pour ces drivers, j'utiliserai cet IDE pour écrire le code ainsi que the WDK (Windows Driver Kit) 7600.16385.1 pour le compiler. J'ai également installé la documentation du pack WDK (avec toutes les fonctions, les "samples" etc.).
Mais, je ne sais pas par où commencer... Je ne suis pas sur d'utiliser la bonne méthode ou les bons outils... Et je n'ai jamais construit le moindre driver à ce jour! Je suis perdu!
S'il vous plaît, y a-t-il quelqu'un pour m'aider?
Merci infiniment.
Très cordialement.
clad83.
Réponses
-
Les drivers sous windows suivent des models.
Chaque système support un certain nombre de modèle.
Si vous disposez déjà de drivers pour XP, ils suivent un modèle : WDM (http://en.wikipedia.org/wiki/Windows_Driver_Model) ou WDF (http://en.wikipedia.org/wiki/Windows_Driver_Foundation).
Je crois que Seven accepte toujours ces 2 types de models.
Pour le passage en 64bits, il faut juste adapter les options de compilation pour utiliser la chaine de compilation 64 bits.
Paul Bacelar, Ex - MVP VC++- Proposé comme réponse Alex Petrescu vendredi 17 septembre 2010 09:19
- Marqué comme réponse Alex Petrescu mardi 21 septembre 2010 09:22
-
Voici un document pour connaître le bon DriverModel en fonction du type de périphérique :
http://msdn.microsoft.com/en-us/library/ff554652(v=VS.85).aspx
Si le code du driver a correctement été conçu pour passer en 64bits, oui vous n'aurez pas à retoucher au code, mais même le meilleur programmeur du monde fait des erreurs.
Free, c'est l"équivalent du mode Release en programmation User (classique). Moi, je commencerais par Checked, équivalent du mode Debug, histoire de déplayer le terain.
Pour déterminer le model, le plus simple est de voir la fonction DriverEntry et de voir le type d'appel qu'il y fait. Exemple : http://msdn.microsoft.com/en-us/library/ff540807(v=VS.85).aspx
Pour tester le Driver, il vous faut toujours une "box" 64 bits.
Paul Bacelar, Ex - MVP VC++- Proposé comme réponse Alex Petrescu vendredi 17 septembre 2010 09:19
- Marqué comme réponse Alex Petrescu mardi 21 septembre 2010 09:23
Toutes les réponses
-
Bonjour,
Je vous propose cet article sur le développement des pilotes, pour comprendre les principes. Il faut savoir que le développement des pilotes n’est pas facile, surtout si vous êtes débutant en programmation et vous n’avez jamais écrit un pilote. Si vous commencez maitriser les principes de développement pour un pilote, je vous invite à utiliser les forums MSDN France pour des questions spécifiques.
Cordialement,
Alex
________________
Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
-
Bonjour Alex,
Tout d'abord, merci de vous intéresser à mon sujet.
En fait, je n'ai pas vraiment le choix, même si je suis un "novice" en programmation. C'est ce qu'on m'a demandé dans le cadre de mon travail. Je me doute que je suis parti pour un long chemin de croix, mais de toute façon, il faudra que j'y parvienne, coûte que coûte!
Concernant le lien que vous m'avez envoyé, j'ai lu ce tutoriel sur Code Projects il y a quelques jours, j'y ai appris beaucoup de choses (surtout générales). Cependant, d'après ce que j'en ai compris, c'est que cette méthode était utilisée (et utilisable) sur un environnement style Windows NT ou Windows XP !!!
Le principe a apparemment changé sous Windows Vista et Windows 7 :-(
Selon vous, y a-t-il quand même quelques parties communes réutilisables entre ces O.S. ou doit-on vraiment repartir de zéro? Car comme je l'ai indiqué dans la présentation de mon sujet, des drivers pour nos cartes électroniques existent déjà pour un environnement Win XP - 32bits, et ils fonctionnent tous très biens !
Là, je suis vraiment coincé, je dois développer ces drivers pour faire tourner les cartes sur un bus PCI Express d'une machine exploitant un Windows 7 x64...
Merci pour votre aide!
Cordialement.
clad83
PS : On va dire que je ne maîtrise pas du tout les principes de développement de pilotes, ai-je cependant le droit de poster sur les forums MSDN?
-
Les drivers sous windows suivent des models.
Chaque système support un certain nombre de modèle.
Si vous disposez déjà de drivers pour XP, ils suivent un modèle : WDM (http://en.wikipedia.org/wiki/Windows_Driver_Model) ou WDF (http://en.wikipedia.org/wiki/Windows_Driver_Foundation).
Je crois que Seven accepte toujours ces 2 types de models.
Pour le passage en 64bits, il faut juste adapter les options de compilation pour utiliser la chaine de compilation 64 bits.
Paul Bacelar, Ex - MVP VC++- Proposé comme réponse Alex Petrescu vendredi 17 septembre 2010 09:19
- Marqué comme réponse Alex Petrescu mardi 21 septembre 2010 09:22
-
Je crois que Seven accepte toujours ces 2 types de models.
Bonjour,
Si c'est le cas, alors cela signifierait que je n'ai pas à retoucher le code ?!?!
Il me suffirait de compiler ce code, via la bonne console de compilation, issue du WDK (j'utilise la version 7600), et nommée "Windows 7 x64 Free Build Environment" ?
Concernant le type de modèle, comment savoir lequel est utilisé dans les drivers déjà écrits, tournant sous un Win XP 32 bits ? Y a-t-il un moyen simple de le découvrir ?
Cdlt.
-
Voici un document pour connaître le bon DriverModel en fonction du type de périphérique :
http://msdn.microsoft.com/en-us/library/ff554652(v=VS.85).aspx
Si le code du driver a correctement été conçu pour passer en 64bits, oui vous n'aurez pas à retoucher au code, mais même le meilleur programmeur du monde fait des erreurs.
Free, c'est l"équivalent du mode Release en programmation User (classique). Moi, je commencerais par Checked, équivalent du mode Debug, histoire de déplayer le terain.
Pour déterminer le model, le plus simple est de voir la fonction DriverEntry et de voir le type d'appel qu'il y fait. Exemple : http://msdn.microsoft.com/en-us/library/ff540807(v=VS.85).aspx
Pour tester le Driver, il vous faut toujours une "box" 64 bits.
Paul Bacelar, Ex - MVP VC++- Proposé comme réponse Alex Petrescu vendredi 17 septembre 2010 09:19
- Marqué comme réponse Alex Petrescu mardi 21 septembre 2010 09:23
-
Voici un document pour connaître le bon DriverModel en fonction du type de périphérique :
http://msdn.microsoft.com/en-us/library/ff554652(v=VS.85).aspx
Si le code du driver a correctement été conçu pour passer en 64bits, oui vous n'aurez pas à retoucher au code, mais même le meilleur programmeur du monde fait des erreurs.
Free, c'est l"équivalent du mode Release en programmation User (classique). Moi, je commencerais par Checked, équivalent du mode Debug, histoire de déplayer le terain.
Pour déterminer le model, le plus simple est de voir la fonction DriverEntry et de voir le type d'appel qu'il y fait. Exemple : http://msdn.microsoft.com/en-us/library/ff540807(v=VS.85).aspx
Pour tester le Driver, il vous faut toujours une "box" 64 bits.
Paul Bacelar, Ex - MVP VC++Très bien, je vous remercie pour le lien. Je vais voir si je peux apprendre quelque chose sur les anciens drivers, et le type de modèle qu'ils utilisaient...
Je comprends parfaitement, et je suis à des années-lumières d'être le meilleur programmeur du monde ^^. J'utiliserai ainsi le mode Checked, bien plus utile pour le débugage.
Quant aux anciens drivers, sachez que je les ai recompilé sous une box "Windows 7 x64", plusieurs erreurs apparaissent, et notamment dans l'utilisation de certaines fonctions, qui à mon sens sont devenues obsolètes :-(
Il va donc falloir retoucher au source, et y apporter les modifications en conséquence !!!
PS : voici un aperçu du code, concernant la fonction DriverEntry :
NTSTATUS DriverEntry(IN PDRIVER_OBJECT drvObj, IN PUNICODE_STRING regPath)
{
NTSTATUS status;
status = ProbePCI(drvObj, regPath);
if (NT_SUCCESS(status))
{
/*
* Create dispatch points for device control, create, close.
*/
drvObj->MajorFunction[IRP_MJ_CREATE] = fctDispatch;
drvObj->MajorFunction[IRP_MJ_CLOSE] = fctDispatch;
drvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = fctDispatch;
drvObj->MajorFunction[IRP_MJ_READ] = fctReadWrite;
drvObj->MajorFunction[IRP_MJ_WRITE] = fctReadWrite;
drvObj->DriverUnload = fctUnload;
drvObj->DriverStartIo = fctStartIo;
}
return status;
}Cordialement.
clad83
-
-
-