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 :

DeviceIOControl et IOCTL_CDROM_RAW_READ


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 44
    Par défaut DeviceIOControl et IOCTL_CDROM_RAW_READ
    Bonjour à tous !

    J'ai un petit souci en voulant utiliser la fonction DeviceIOControl pour lire les premiers secteurs d'un cd-rom : après des semaines de recherches sur le net (la MSDN est très peu fournie pour ce cas précis), d'expérimentations et de prise de tête, je n'arrive toujours pas à le faire ...
    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
    char Fn[8] = { '\\', '\\', '.', '\\', 'E', ':', '\0' };
    HANDLE hCD;
    DWORD Dummy;
    RAW_READ_INFO ReadInfo;
    unsigned char pBuf[2352] = "";
    DWORD dwError=0;
    DWORD dwBytesRet = 0;
     
    hCD = CreateFile( Fn, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
    NULL, OPEN_EXISTING, 0, NULL );
     
    if ( !DeviceIoControl( hCD, IOCTL_STORAGE_CHECK_VERIFY,
    NULL,
    0,
    NULL,
    0,
    &Dummy,
    NULL) )
    {
      MessageBox(NULL,"Drive E:\\ isn't accessible",NULL,MB_OK);
    }else{
       ReadInfo.TrackMode = XAForm2;
       ReadInfo.SectorCount = 1;
       ReadInfo.DiskOffset.QuadPart = 0*2048; // 2048 est obligatoire quelquesoit le format, lecture du tout premier secteur
       if ( !DeviceIoControl( hCD,
            IOCTL_CDROM_RAW_READ,
            &ReadInfo,
            sizeof(ReadInfo),
            &pBuf,
            2352, // OutputBufferLength : 2352 donne erreur 1 (incorrect function), 2048 donne erreur 87 (invalid parameter)
            &Dummy,
            NULL ) )
       {
            dwError = GetLastError();
       }
    }
    J'ai testé toutes les combinaisons possibles :
    - YellowMode2 ou XAForm2 pour le TrackMode
    - 2048 ou 2352 pour la taille du secteur à récupérer (et du buffer).

    Mais la fonction ne s'exécute jamais et renvoie toujours une erreur. Dans le cas de l'exemple posté au dessus (OutputBufferLength = 2352), il y a bien un accès au lecteur, mais l'erreur 1 (incorrect function) est retournée.
    Dans le cas où OutputBufferLength = 2048, il n'y a pas d'accès au lecteur, et l'erreur 87 (invalid parameter) est retournée.

    Là où je ne comprends pas vraiment, c'est que si je cherche à lire des données audio (TrackMode = CDDA), ça fonctionne ...

    Si une âme charitable pouvait m'éclairer sur le non fonctionnement de ce code, et m'aider à le faire marcher, je lui en serais très reconnaissant

    Je n'ai jamais eu de problème avec l'ASPI, mais là ça commence à m'ennuyer sérieusement, je n'aime pas qu'on me résiste

    Merci de m'avoir lu !

  2. #2
    Membre chevronné Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Par défaut
    Salut collègue,

    Je crois me souvenir que l'action IOCTL_CDROM_RAW_READ ne fonctionne que si CreateFile réussit en accès exclusif (ne pas indiquer FILE_SHARE_READ nin FILE_SHARE_WRITE).

    D'autre part, je pense que tu peux simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char Fn[8] = { '\\', '\\', '.', '\\', 'E', ':', '\0' };
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char Fn[] = "\\\\.\\E:";

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 44
    Par défaut
    Héhé, merci de ton intérêt ami toulousain

    Malheureusement le fait de supprimer les flags FILE_SHARE_* ne change rien à l'affaire, je me retrouve juste dans l'impossibilité de lancer plusieurs fois d'affilé le IOCTL_STORAGE_CHECK_VERIFY, ce qui n'est pas vraiment important pour mon problème ...

    Je prends note pour la chaine, même si elle était destinée à être remplacée par des variables par la suite

  4. #4
    Membre chevronné Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Par défaut
    DSL que l'info ne fonctionne pas.

    En cherchant dans mes vieilles notes j'ai retrouvé deux tutoriels sur Code Project qui pourraient t'aider mais quelque chose me dit que tu les as déjà utilisés

    http://www.codeproject.com/audio/SimpleAudioCD.asp

    et

    http://www.codeproject.com/csharp/CSharpRipper.asp

    Le second est en C# mais tu n'es pas raciste ?

    Hope it helps

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 44
    Par défaut
    Citation Envoyé par pascal.barbier Voir le message
    DSL que l'info ne fonctionne pas.

    En cherchant dans mes vieilles notes j'ai retrouvé deux tutoriels sur Code Project qui pourraient t'aider mais quelque chose me dit que tu les as déjà utilisés

    http://www.codeproject.com/audio/SimpleAudioCD.asp
    Rhooo ... comment tu as deviné
    Ben en fait ce code là fonctionne chez moi lorsque le trackmode est CDDA, mais pas dans les deux autres cas (YellowMode2 ou XAForm2) ...


    Citation Envoyé par pascal.barbier Voir le message
    http://www.codeproject.com/csharp/CSharpRipper.asp

    Le second est en C# mais tu n'es pas raciste ?

    Hope it helps
    Je ne suis pas familier du C#, mais j'ai suffisamment d'expérience dans différents langages pour ne pas être totalement perdu
    Et malheureusement le problème est le même, à savoir qu'il ne concerne que le CDDA et pas les autres modes

    En tout cas je te remercie pour le temps passé à me répondre, c'est très sympa de ta part

Discussions similaires

  1. Fonction DeviceIoControl et ntddisk.h
    Par LostRailler dans le forum Windows
    Réponses: 1
    Dernier message: 22/10/2008, 18h57
  2. DeviceIOControl et IOCTL_CDROM_RAW_READ
    Par Runik dans le forum Windows
    Réponses: 0
    Dernier message: 01/10/2007, 19h04
  3. Portage appels DeviceIoControl windows sous linux
    Par nico2022 dans le forum Linux
    Réponses: 6
    Dernier message: 23/02/2007, 14h18
  4. [VB.NET][USB]Probleme de deviceiocontrol
    Par monyca dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/06/2006, 17h22
  5. Transmettre du "code" via DeviceIoControl ?
    Par - Robby - dans le forum Windows
    Réponses: 13
    Dernier message: 19/02/2006, 11h16

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