2010-02-15 8 views
15

J'ai toujours entendu dire que Delphi peut faire à peu près tout ce que C++ peut faire ... sauf écrire des pilotes Windows. Est-ce correct, et si oui, pourquoi?Puis-je écrire des pilotes Windows avec Delphi 2010?

J'ai récemment lu un article de blog en ligne qui peut indiquer un possible solution for writing drivers with Delphi, mais il a 3 ans et je ne sais pas à quel point cette information est exacte. Donc, avec la dernière version de Delphi (2010), serait-il techniquement possible d'écrire un pilote Windows?

+6

Delphi ne peut pas non réparer un cœur brisé (mais pour être juste, c'est une extension GCC en C++) – Shog9

+2

Mais Delphi peut-elle vous garder au chaud la nuit? – PostMan

+0

Bien essayé. http://www.virustotal.com/file-scan/report.html?id=8526bd7996583e572d069e8de46de9a111a8136ed964b571b7d512fdf4fccdcc-1289846438 –

Répondre

17

Il peut être techniquement possible d'écrire quelques pilotes avec Delphi, mais jusqu'à une générale réponse va, je dirais: vous ne pouvez pas écrire facilement les pilotes avec Delphi. Tout d'abord, il existe une différence entre les pilotes (UMDF) en mode utilisateur et les pilotes en mode noyau (KMDF). Les pilotes UMDF devraient être possibles avec Delphi. pilotes KMDF ne sont pas facilement possible cependant, parce que

1) éditeur de liens de Delphi ne peut pas les produire et

2) format de fichier objet de Delphi est différent du format COFF l'éditeur de liens Microsoft utilise par défaut. 3) Delphi RTL fait l'hypothèse qu'il vit en mode utilisateur et peut faire certaines choses que l'on ne devrait pas faire dans kernel-land (je pense par exemple à la façon dont les exceptions sont gérées, aussi à la gestion de la mémoire), vous devez être très prudent sur les fonctions RTL à utiliser en toute sécurité. Il y a aussi des difficultés avec les unités System et SysInit (voir le commentaire de Ritsaert Hornstra à une autre réponse ici). Je ne dis pas que ce ne sont pas des problèmes qui ne peuvent pas être surmontés (voir le lien que vous avez créé) si vous êtes vraiment dévoué, mais ce ne sera pas simple.

Deuxièmement, les pilotes KMDF (je ne sais pas sur UMDF, en fait - quelqu'un peut-il faire un commentaire?) Pour Win64 doivent être en code 64 bits. Depuis actuellement, il n'y a pas de compilateur Delphi 64 bits, leur écriture est définitivement un non-non.

+0

+1, tous les bons points. En plus de cela, être capable de créer un pilote avec Delphi vous laisserait sans moyen de le déboguer correctement - Delphi ne peut pas le faire lui-même, ni créer de symboles de débogage dans un format que l'un des débogueurs MS peut utiliser. Alors, quel serait vraiment le point de surmonter ces problèmes? – mghie

+0

L'exigence de pilote 64 bits est en fait une exigence du programme de logo Vista/Windows 7. Cela ne s'applique pas au conducteur en soi, mais à l'appareil. – MSalters

+0

C'est exactement l'information que je cherchais. Je vous remercie! – Mick

7

Vous pouvez écrire un pilote Windows dans n'importe quelle langue compilant une DLL au format PE, sans dépendances externes (autres que celles autorisées pour le chargement dans le noyau), appeler des fonctions avec liaison STDCALL et exporter des fonctions avec liaison STDCALL.

Les dépendances externes non-approuvées vont être la partie difficile que je pense. :)

+1

Bon point sur les non-dépendances externes non approuvées, John (+1). Ma réaction réflexe était "bien sûr". Mais OP aura du mal parce que Delphi fournira _winmain() – Mawg

+0

Il doit également prendre en charge les pointeurs de fonction, car un 'DRIVER_OBJECT' qui ne pointe sur aucune des fonctions du pilote n'est pas très utile. Et certains des champs d'en-tête PE doivent être mis à des valeurs spéciales (bien que je suppose que cela pourrait être corrigé après la liaison). – bk1e

+0

@ bk1e: bon point. En théorie, l'éditeur de liens pourrait également remplir des parties du DRIVER_OBJECT, mais les pointeurs de fonction supportés par le langage seraient aussi beaucoup plus propres. –

2

Je suis d'accord avec les deux réponses précédentes. Je l'ai effectivement fait dans un cas particulier: Un moniteur d'impression. C'est un cas particulier de pilote qui s'exécute en mode utilisateur, et je pourrais en écrire un en Delphi. Il y avait certainement certains avantages à utiliser Delphi là-bas.

Mais le dernier écueil qui n'a pas encore été mentionné (je pense) est que vous avez besoin de traduire des zillions de structures complexes et des macros à partir de fichiers d'en-tête DDK. Traduire certaines macros alambiquées, en particulier, peut être très délicat.