Bon, puisque que beaucoup de personnes m'ont demandé en privé mon petit
programme, je le joins sur la guilde (il est tout petit).
Il s'agit d'un petit prog en C fait en 10 minutes qui se sert du fait
que quand on lit à une adresse de l'espace d'entrée/sortie,
on trouve 0xff si il n'y a rien à cette adresse, et une autre valeur
si qqe chose est présent.
C'est vraiment tout simple comme programme. Je l'avais pas fini,
(Les options ne sont pas gérées). Si quelqu'un a du temps pour
terminer proprement, il est le bienvenu.
Il faut etre root pour le lancer.
Il devrait se compiler avec :
gcc -o ioprobe ioprobe.c
si ca marche pas, en rajoutant -O3, ca devrait aller.
Si vous avez des commentaires, ou si ca ne marche pas, n'hésitez pas
à me le dire.
a+
> Ca, c'est non seulement utile, mais c'est super intéréssant (ne
> serait-ce
> que pour le code en lui-même) !!
>
> Si tu l'as sous la main, est-ce que tu peux me l'envoyer STP ?
>
> Merci d'avance.
>
>
> Olivier
>
>
/*************************************************/
/** IOProbe **/
/** This programm scan every ports IO **/
/** of a PC (just Intel plateform with Linux) **/
/** and print which one are used by any card **/
/** **/
/*************************************************/
/* Si on trouve la valeur FF a une adresse => port inutilise */
#include <asm/io.h>
//#include <sys/io.h>
#include <unistd.h>
#define TRUE 1
#define FALSE 0
int option_a = 0;
int option_p = 0;
int option_l = 0;
int option_v = 0;
int option_h = 0;
void usage()
{
printf("IOProbe version 1.0\n");
printf("Usage : IOProbe [-a] [-p port] [-l] [-v] [-h]\n");
printf(" Options : [-a] : Affiche tous les valeurs contenues dans chaque port\n");
printf(" [-p port] : Affiche seulement les infos concernant port\n");
printf(" [-l] : Donne uniquement les ports utilis?s\n");
printf(" [-v] : Retourne le num?ro de version\n");
printf(" [-h] : Affiche cet ?cran d'aide\n");
printf("ATTENTION : Le programme n'est pas termin?, Ne pas mettre d'options\n");
printf("Scan des ports d'entr?e/sortie PC\n");
printf("Auteur : Christophe Baillon (Janvier 2001/AFPA) - GPL\n\n\n");
}
void version()
{
printf("IOProbe version 1.0\n");
}
void parse(int argc, char **argv)
{
int c;
if (c > 0)
{
for (c = 1; c <= argc; c++){
if (strcmp(argv[c],"-a"))
{
printf("Affichage complet (-a)\n");
option_a = TRUE;
}
if (strcmp(argv[c], "-p"))
{
printf("Option -p\n");
option_p = TRUE;
}
if (strcmp(argv[c],"-l"))
{
printf("Option -l\n");
option_l = TRUE;
}
if (strcmp(argv[c],"-v"))
{
printf("Option -v\n");
option_v = TRUE;
}
if (strcmp(argv[c],"-h"))
{
printf("Option -h\n");
option_h = TRUE;
}
}
}
}
void scan_all()
{
int a;
unsigned char val;
for(a = 0x200; a <= 0x8ff; a = a + 0x10)
{
ioperm(a, 1);
val = inb(a);
usleep(10);
printf("Scan du port %x : %x \n", a, val);
}
}
void scan_used()
{
int a;
unsigned char val;
for(a = 0x200; a <= 0x3ff; a = a + 0x10)
{
ioperm(a, 1);
val = inb(a);
usleep(10);
if (val != 0xff)
printf("Port %x utilis?. Valeur : %x \n", a, val);
}
}
void scan_port(int port)
{
int val;
ioperm(port, 1);
val = inb(port);
if (val == 0xff)
printf("Port %x inutilis? (valeur : %x)\n", port, val);
else
printf("Le port %x est utilis? (valeur : %x)\n", port, val);
}
main(int argc, char *argv[])
{
if (argc > 1)
usage();
else
{
//parse(argc, argv);
scan_used();
}
}