IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Accéder aux I/O ports


Sujet :

Windows

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Accéder aux I/O ports
    Bonjour,

    Je voudrais pouvoir accéder à l'écriture sur les I/O ports essentiellement pour pouvoir envoyer des interruptions clavier.

    J'ai trouvé des solutions commerciales payantes composées d'un driver dynamique (pas de reboot nécessaire) qui permet d'accéder ensuite aux I/O ports grâce à une API.

    Voilà, je sais qu'il y a des API windows pour envoyer des évènements claviers, mais j'ai besoin d'une solution qui envoie l'évènement clavier au plus bas niveau que possible.

    Connaissez-vous des alternatives à ces solutions payantes ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Le plus bas niveau que je connaisse sous Windows, c'est SendInput().
    Après, il y a peut-être encore en-dessous au niveau des drivers...

    Ou bien, pour avoir accès aux I/O ports, tu peux toujours prendre inpout32.dll, qui installe un driver pour donner à l'utilisateur l'accès à ces ports. Mais pour moi, c'est un trou de sécurité monstrueux...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Au niveau des drivers, il y a I8042prt Driver Reference qui te donne toutes les informations utile pour manipuler le clavier (et la souris).
    En googlant un peu j'ai trouver le projet SourceForge Port I/O library qui pourrait peut être t'aider (plus mis à jours depuis 2004)

    Amicalement, sloshy
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Si tu veux faire du très bas niveau sous Windows il te faudra le DDK (Kit de développement de drivers) que tu pourras télécharger sur le site de Microsoft. Ensuite t'as deux choix :

    - Créer un driver un mode kernel que tu commanderas depuis ton programme utilisateur. Dans ce cas tu ferais mieux d'utiliser des outils que d'autres on déjà fait avant toi, comme Inpout32 qui permet d'accéder aux ports du PC avec facilité. De plus si tu choisis cette option, tu peux oublier le DDK (à moins que tu veux t'amuser à recompiler le driver ...)

    - Modifier les droits de ton programme de façon à pouvoir accéder aux ports qui t'intéressent. C'est pas trivial vu qu'il faudra utiliser des fonctions non documentées (qu'il faut appeler en mode kernel) : LookupProcessByProcessId, Ke386SetIoAccessMap, Ke386QueryIoAccessMap et Ke386IoSetAccessProcess.

    Donc la méthode conseillée est : Inpout32.

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Melem Voir le message
    des fonctions non documentées (qu'il faut appeler en mode kernel) : LookupProcessByProcessId.
    Tellement undocumented qu'elle n'existe pas :-)

    C'est PsLookupProcessByProcessId forcément...

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos éléments de réponse qui m'offrent de nouvelles voies de recherche.

    Le but est effectivement que mon code ne passe pas par SendInput() car l'API Win32 de Windows est hookée en kernel-land par un programme qui soi-disant sert à protéger une application. Directinput() est notamment ainsi bloqué.

    J'essaye donc de résoudre le problème en passant au plus bas niveau et effectivement j'envisage maintenant d'avoir un driver "clavier" chargé en mode kernel et une API de communication dans une .dll.

    Je sais que cela existe, et bien que ce soit dans mes compétences, je préfère utiliser des roues qui existent déjà. Je vais jeter un coup d'oeil aux solutions que vous avez proposé, je vais voir s'il y en a une gratuite qui corresponde à ce besoin, je vous tiens au courant !

  7. #7
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Après quelques recherches, les directives "in" et "out" (asm) ont un équivalent dans le DDK sous forme de macro, à savoir READ_PORT_UCHAR() WRITE_PORT_UCHAR()
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

Discussions similaires

  1. Entrées/sorties pour accéder aux ports USB
    Par midou1988 dans le forum Assembleur
    Réponses: 5
    Dernier message: 18/02/2009, 00h33
  2. Accéder aux ports de l'ordinateur
    Par l'hachemi dans le forum x86 32-bits / 64-bits
    Réponses: 16
    Dernier message: 21/12/2007, 10h59
  3. [USB] [JNI] Utiliser JNI pour accéder aux ports USB
    Par Javatator dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/10/2005, 06h40
  4. Réponses: 9
    Dernier message: 03/12/2004, 11h35
  5. Avis aux experts : accéder aux dimensions d'un tableau.
    Par poulpi dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/11/2004, 09h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo