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

C Discussion :

Probleme avec la fonction DEVICEIOCONTROL de l'API WIN32


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Probleme avec la fonction DEVICEIOCONTROL de l'API WIN32
    Bonjour,

    Je cherche a récupérer le numéro de série d'une clé usb (et non le numero du volume).

    Je souhaite utiliser une fonction de l'api win32 qui se nomme
    DEVICEIOCONTROL.

    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <string.h>
    #include <process.h>
    #include <WinIoCtl.h>
    #include <Winbase.h>
     
     
     
    typedef struct _MEDIA_SERIAL_NUMBER_DATA
    {
    ULONG SerialNumberLength;
    ULONG Result;
    ULONG Reserved[2];
    UCHAR SerialNumberData[];
    } MEDIA_SERIAL_NUMBER_DATA,*PMEDIA_SERIAL_NUMBER_DATA;
     
    void main()
    {
    HANDLE Handle = 0; // variable servant a stocker le handle pour l'acces au disque
    unsigned int temp=0,temp1=0, temp2 = 0;
    unsigned int *temporaire=&temp1;
    unsigned long i = 0;
    MEDIA_SERIAL_NUMBER_DATA val; // creation variable "val" de type MEDIA SERIAL NUMBER DATA
    MEDIA_SERIAL_NUMBER_DATA *pVal = &val;
    // initialisation de "val" pour le numéro de série
    val.SerialNumberLength=0;
     
    Handle = CreateFile("\\\\.\\I:",0,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);// creation du Handle du disque souhaité ici lecteur I
    i=DeviceIoControl(Handle,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,NULL,0,pVal,sizeof(val),temporaire,NULL);
    printf("valeur Handle %c fin\n",Handle); // permet de savoir si le HANDLE A BIEN FONCTIONNER
    printf("valeur retour %d fin\n",i); // Permet de savoir si la fonction deviceiocontrol a bien fonctionner
    printf("valeur serial %s fin\n",val.SerialNumberData); // affichage de la chaine numero de serie
    printf("valeur serial %h fin\n",val.SerialNumberData);
    printf("valeur nb de donne %d fin\n",temp1); // affichage du nombre d'octet renvoyé dans "val" par deviceiocontrol
    printf("valeur longeur num serie %d fin\n",val.SerialNumberLength); // affichage de la longueur du numéro de serie renvoyé par la fonction
    CloseHandle(Handle); // libère le handle
    }
    Le problème c'est que la fonction ne me renvoie pas de valeur correcte.

    Je soupsonne la difficulté sur le fait que la structure utilise un tableau dynamique qui est autorisé dans C99.

    La structure est un copier coller de msdn http://msdn.microsoft.com/en-us/library/aa363216.aspx
    merci pour votre aide car depuis une semaine je bloque la dessus

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    La structure MEDIA_SERIAL_NUMBER_DATA n'a pas comme dernier membre un tableau dynamique (au sens VLA). Elle possède un membre SerialNumberData qui est un tableau adaptable (flexible). C'est à dire qu'il est possible de placer un tableau en queue de la structure. Toutefois, ce tableau n'a pas de mémoire réservée pour une déclaration de variable du type MEDIA_SERIAL_NUMBER_DATA.

    Il faut créer un buffer pouvant contenir cette structure + la taille que tu veux donner au tableau SerialNumberData et le passer à DeviceIoControl .
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buf[sizeof(MEDIA_SERIAL_NUMBER_DATA)+100]; // ou en allocation dynamique si on préfère
    i=DeviceIoControl(Handle,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,NULL,0,buf,sizeof buf,temporaire,NULL);
    Pour accéder ensuite aux différents champs de la structure, tu transtypes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MEDIA_SERIAL_NUMBER_DATA * p = (MEDIA_SERIAL_NUMBER_DATA *)buf;
    printf("valeur serial %s fin\n",p->SerialNumberData);
    printf("valeur longeur num serie %d fin\n",p->SerialNumberLength);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    merci pour la réponse, je vais tester ceci.

    A la fonction deviceiocontrol tu envoie "buf" comme paramètre alors que la fonction attend un pointeur, ne faudrais pas t'il ecrire "&buf" ?

    Sinon une autre question sur ta solution pour acceder aux données.

    MEDIA_SERIAL_NUMBER_DATA * p = (MEDIA_SERIAL_NUMBER_DATA *)buf;
    printf("valeur serial %s fin\n",p->SerialNumberData);
    Tu cree un pointeur P de type MEDIASERIALNUMBERDATA mais ce que je ne comprend pas c'est l'affectation qui en suit.
    Ce que je comprend c'est que tu lui affecte l'adresse correspondant à la structure du tableau BUF?

    Ce n'est pas très claire.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    la fonction attend un pointeur, ne faudrais pas t'il ecrire "&buf" ?
    Non, buf est un tableau et est donc bien en tant qu'argument de la fonction l'adresse du début du tableau.

    Ce que je comprend c'est que tu lui affecte l'adresse correspondant à la structure du tableau BUF?
    La fonction va remplir buf. Ce que nous savons, c'est que la disposition des données placées dans le tableau est la même que la disposition des données dans une structure MEDIA_SERIAL_NUMBER_DATA. On transtype donc l'adresse du début du tableau en l'adresse du début d'une structure MEDIA_SERIAL_NUMBER_DATA, ce qui permet ensuite d'accéder facilement aux données comme si elles étaient placées dans une telle structure, plutôt que d'avoir à interpréter chaque byte du buffer.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    merci pour cette réponse rapide,

    maintenant j'ai compris

Discussions similaires

  1. Probleme avec la fonction Ontimer
    Par Djule dans le forum MFC
    Réponses: 8
    Dernier message: 27/11/2005, 17h52
  2. Probleme avec la fonction rename()
    Par TheZenZen dans le forum C
    Réponses: 6
    Dernier message: 08/10/2005, 15h59
  3. [LG] Problème avec la Fonction ReadLn en fin de programme
    Par killermano dans le forum Langage
    Réponses: 6
    Dernier message: 23/07/2005, 15h16
  4. [LG]Probleme avec une fonction
    Par xavier1936 dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2005, 22h48

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