Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lire des secteurs d'un CD

31 réponses
Avatar
Yoshito
Salut à tous

Je cherche à lire les secteurs d'un CD : on m'a dit de venir ici car
apparement vous êtes les meilleurs.

J'ai utilisé la fonction createfile puis deviceiocontrol, jusqu'ici aucuns
problèmes, j'ai pu récupérer la géométrie du CD.

C'est après que ça se corse, j'utilise ReadFile, ça ne marche pas, et
j'obtiens en permanence l'erreur 87 avec getlasterror, erreur qui dit qu'un
des paramètres est incorrect.

que dois-je faire ??

merci de laide.

Voici le code :

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winioctl.h>
#define CD "\\\\.\\e:"

int main()
{
HANDLE cdrom;
LPVOID *t;
BOOL resultat;
DWORD truc, truc2 = 0;
DISK_GEOMETRY buff;
unsigned char i;
char buffer[256];
printf("%p",buffer);


cdrom = CreateFile(CD, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);

if(cdrom == INVALID_HANDLE_VALUE) // cannot open the drive
{
MessageBox(NULL, "Le lecteur que vous avez indiqué est impossible à
ouvrir pour une raison absolument inconnue :p\nVous avez sans doute mal tapé
la lettre du lecteur.", "Erreur d'ouverture", MB_ICONEXCLAMATION);
return (FALSE);
}

resultat = DeviceIoControl(cdrom, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,
0, &buff, sizeof(buff), &truc, NULL);

if(resultat)
{
printf("%s :\n", CD);
printf("- Cylindres = %ld\n", buff.Cylinders);
printf("- Pistes/Cylindres = %ld\n", (ULONG)
buff.TracksPerCylinder);
printf("- Secteurs/Pistes = %ld\n", (ULONG) buff.SectorsPerTrack);
printf("- Octets/Secteurs = %ld\n", (ULONG) buff.BytesPerSector);
printf("\n");
}
else
{
printf("%ld",GetLastError());
MessageBox(NULL, "La géométrie du disque (têtes, cylindres, etc..)
est impossible à obtenir.", "Erreur de lecture", MB_ICONEXCLAMATION);
return (FALSE);
}


resultat = ReadFile(cdrom, &buffer, 253, &truc2, NULL);

if(resultat)
{
printf("%ld bytes lus", truc2);
}
else
{
printf("Erreur %ld", GetLastError());
}

CloseHandle(cdrom);
return 0;
}

10 réponses

1 2 3 4
Avatar
toutledos
Bizarre, j'ai envoyé un autre message mais manifestement le serveur a
eu un problème.

Donc je disais que j'ai trouvé la fonction.
Avatar
toutledos
Comment ouvrir un fichier à partir d'une variable de type IStream ?
Avatar
toutledos
Comment ouvrir un fichier à partir d'une variable de type IStream ?
Avatar
Christian ASTOR
On 29 déc, 19:47, wrote:
Comment ouvrir un fichier à partir d'une variable de type IStream ?



IStream::Read() puis on fait ce que l'on veut du buffer reçu
(WriteFile() par ex)
Avatar
toutledos
On 30 déc 2008, 12:51, Christian ASTOR
wrote:
On 29 déc, 19:47, wrote:

> Comment ouvrir un fichier à partir d'une variable de type IStream ?

 IStream::Read() puis on fait ce que l'on veut du buffer reçu
(WriteFile() par ex)



Je n'arrive pas à initialiser iStream avec un cocreateinstance, il me
manque le "class identifier" et le "interface identifier" comment les
trouver ?

merci
Avatar
Christian ASTOR
wrote:

Je n'arrive pas à initialiser iStream avec un cocreateinstance, il me
manque le "class identifier" et le "interface identifier" comment les
trouver ?



On la crée avec par ex SHCreateStreamOnFile(), CreateStreamOnHGlobal(),
IStorage, etc...
Avatar
toutledos
Ok merci.

Maintenant j'en suis rendu à utiliser la méthode :
IDiscFormat2RawCD::PrepareMedia pour préparer la gravure.

Il me retourne l'erreur 0x80070057 qui dit "One or more arguments are
not valid" pourtant cette méthode ne prend pas d'arguments !
Avatar
Eric
wrote in message
news:
Ok merci.

Maintenant j'en suis rendu à utiliser la méthode :
IDiscFormat2RawCD::PrepareMedia pour préparer la gravure.
Il me retourne l'erreur 0x80070057 qui dit "One or more arguments are
not valid" pourtant cette méthode ne prend pas d'arguments !



Il y a marqué qu'il faut utiliser IDiscFormat2RawCD::put_ClientName avant,
mais apparemment IDiscFormat2RawCD n'est pas au point :
http://social.msdn.microsoft.com/Forums/en-US/windowsopticalplatform/thread/2f865bf5-b9ab-4aea-a311-cb209e8c28eb/
Avatar
toutledos
On 4 jan, 10:59, "Eric" wrote:
wrote in message

news:

>Ok merci.

>Maintenant j'en suis rendu à utiliser la méthode :
>IDiscFormat2RawCD::PrepareMedia pour préparer la gravure.
>Il me retourne l'erreur 0x80070057 qui dit "One or more arguments are
>not valid" pourtant cette méthode ne prend pas d'arguments !

Il y a marqué qu'il faut utiliser IDiscFormat2RawCD::put_ClientName ava nt,
mais apparemment IDiscFormat2RawCD n'est pas au point :http://social.msdn .microsoft.com/Forums/en-US/windowsopticalplatform/...



J'ai utilisé put_ClientName avant.

J'étais tombé sur ce sujet mais bon je me suis dit que s'ils nous
vendent un OS, ils seraient surement foutus de donner un SDK valide,
apparement je connaissais mal microsoft.

Je vais devoir passer par une autre interface bas-niveau.
Avatar
toutledos
J'utilise IWriteEngine (pas trop le choix il me reste que ça !)

J'ai paramétré un peu :

result = writeEngine->put_Recorder(discRecorder2Ex);
if(result != S_OK)
{
printf("Impossible de choisir le graveur (WE) : 0x%Xn", result);
}

result = writeEngine->put_BytesPerSector( REDBOOK_SECTOR_SIZE );
if(result != S_OK)
{
printf("Impossible de paramétrer la taille d'un secteur : 0x%Xn",
result);
}

result = writeEngine->put_StartingSectorsPerSecond(2);
if(result != S_OK)
{
printf("Impossible de régler la vitesse de démarrage : 0x%Xn",
result);
}

result = writeEngine->put_EndingSectorsPerSecond(2);
if(result != S_OK)
{
printf("Impossible de régler la vitesse de fin : 0x%Xn", result);
}

et je mets la fonction d'écriture :

result = writeEngine->WriteSection(iStream, 0, 300); // Ici j'essaie
juste de graver les 300 premiers secteurs (les premieres données
arrivent au 245 secteur)
if(result != S_OK)
{
printf("Impossible de graver : 0x%Xn", result);
}

Avant l'execution j'efface le CD dans le poste de travail.
Lorsque je lance le programme, le CD se met à tourner pendant un
certain temps (je dirais 3-4 minutes) une fois terminé je regarde le
résultat via un éditeur héxa et rien n'a changé !

Ou est mon erreur ?
1 2 3 4