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 !