2010-01-30 11 views
5

J'essaye d'écrire aux ports 0x60 et 0x64, sans chance.Comment écrire sur les ports d'E/S sous Windows XP? (Delphi7)

code Delphi:

procedure PortOut(IOport: WORD; Value: BYTE); assembler; register; 
asm 
    XCHG DX,AX 
    OUT DX,AL 
end; 

Lors de l'appel Portout, je reçois un EPrivilege instruction privilégiée exception, car IN et OUT peut n'exécuter que Ring0.

Je voudrais savoir comment je peux obtenir des privilèges Ring0 mon application ou comment je pourrais écrire sur les ports 0x60 et 0x64 en utilisant une bibliothèque externe existante.

+0

Je l'ai résolu le problème plus rapidement en utilisant la réponse de stukelly; alexandrul a également posté une réponse parfaitement fonctionnelle. – Tom

+1

Si vous utilisez les différentes DLL de port IO, vous n'avez pas résolu le problème. Vous vous êtes seulement plongé plus profondément dedans. Je prévois BEAUCOUP de BSOD (ou tout ce qui les a remplacés dans Windows 7) dans l'avenir de votre logiciel. –

+0

@ttmrichter Actuellement, IO.DLL fonctionne incroyablement bien (sauf que c'est pour 32 bits seulement et l'auteur a dit qu'il serait très difficile d'en faire un pour x64 et il ne dérange pas). Je n'ai eu aucun problème et tout le monde est satisfait du résultat sur Windows 2000, XP et 7. – Tom

Répondre

6

Jetez un oeil à la IO.DLL from Geek Hideout.

IO.DLL permet le port continu d'E/S opérations pour Windows 95/98/NT/2000/XP en utilisant la même bibliothèque .

est un exemple: Parallel Port I/O Using Delphi V 6.0

+0

J'ai eu une erreur lors de l'exécution, mais l'ai résolu en utilisant http://www.mycockpit.org/forums/showthread.php?15624-Unable-to-extract-IO-SYS-on-XP – Tom

3

Bien sûr, cela pourrait causer des problèmes pour les périphériques qui sont commandés par un conducteur. Stuff comme IO.DLL est principalement destiné à des cartes d'interface pour lesquelles aucun pilote Windows existe, ou où le pilote Windows est en veille jusqu'à ce qu'il soit activé.

Et puisque le port 60h est le contrôleur de clavier, et que le clavieri est généralement utilisé, cela peut causer des problèmes.

Si vous n'interfacez pas de matériel ancien, mais que vous essayez simplement de transférer le code dos (TP), je vous conseille vivement de réécrire le code en fonction des API Windows normales.

6

La façon correcte de gérer ces situations est d'écrire un pilote Windows, mais cela ne peut pas être fait en Delphi par manque de support. Il nécessite le DDK et un compilateur C. Les autres solutions présentées ici fonctionnent, mais sachez que généralement vous pouvez accéder à n'importe quel port d'E/S, et pas seulement ceux que votre application requiert. Et cela pourrait être un problème de sécurité - si l'architecture x86 permet au programmeur système de définir l'IOPL (niveau de privilège d'E/S) et que la plupart des systèmes lui attribuent un anneau 0, il y a une raison. Les pilotes de ports d'E/S d'accès général sont utiles pour les tests et peut-être pour le prototypage ou comme mesures palliatives, mais je ferai très attention de les déployer, surtout si le système n'est pas strictement contrôlé. Si vous avez besoin de ce type d'accès, vous devez absolument comprendre comment fonctionne le noyau Windows et ses pilotes, et pourquoi - et implémenter votre propre pilote. La plupart du temps, Windows n'est pas non sécurisé en soi - il court vers de nombreux logiciels non sécurisés avec les mauvais privilèges qui le font.

+0

Bonne réponse. Ce qui est au moins aussi important que l'ensemble de l'anneau 0 est d'avoir un pilote pour coordonner et/ou interdire l'accès E/S de plusieurs processus ou même des threads. Vouloir un accès direct aux ports est un signe de penser encore en termes de DOS - ce n'était pas une idée de dieu même sous Windows 16 bits (avec plusieurs applications simultanées possibles). – mghie

0

Jeez,

Il a été longtemps pour moi. Je viens de lancer mon DPro 2006 pour regarder la VCL sur ce sujet et il a bombardé. (Je suppose que c'est ce que je reçois pour ne pas avoir fait de code Delphi ces deux dernières années sur cette machine ...et maintenir les correctifs à jour, en plus d'installer/désinstaller un million d'autres paquets payants et FOSS sur la boîte ....)

Mais il me semble que si vous avez attrapé les fichiers d'en-tête pour le Windows Driver Framework, ou consultez le site du projet JEDI, vous pourriez trouver quelque chose pour mettre en place un pilote Miniport ou autre.

Just my 0,02 $ en

/s/BezantSoft