Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1312 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pb avec API DeviceIOControl

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb avec API DeviceIOControl

n°789705
bidoch78
Posté le 07-07-2004 à 23:45:46  profilanswer
 

Salut tout le monde,
 
Je cherche desesperement de faire fonction l'API DeviceIOControl mais il n'y a rien à faire elle ne passe pas sur mon PC.
 
Pour Info : je possede 2 HDD + 1 DVD + 1 CD
respectivement affecté C,D,E,F
 
Voila le code :
 
HANDLE hDevice = CreateFile("\\\\.\\E:", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
 
if (hDevice!=INVALID_HANDLE_VALUE)
 {
 GET_MEDIA_TYPES mType;
 DWORD bReturn;
 
 BOOL bResult=DeviceIoControl(hDevice,IOCTL_STORAGE_GET_MEDIA_TYPES_EX, NULL, 0, &mType, sizeof(mType), &bReturn, NULL);
   
 if (bResult)
  {
  if (mType.DeviceType==FILE_DEVICE_CD_ROM) cout << "CD-ROM";
  if (mType.DeviceType==FILE_DEVICE_DISK) cout << "DISK";
  }
 
 CloseHandle(hDevice);
 }
 
L'API CreateFile retourne bien un Handle, mais parcontre l'API DeviceIOControl retourne FALSE;
 
Si par contre j'affecte comme unité logique C ou D à la place d'une des unités E ou F, là ca passe.
 
Si quelqu'un à une idée, j'ai beau retourné MSDN ou les exemples sur le NET je ne vois pas.
 
Merci,
Yann.

mood
Publicité
Posté le 07-07-2004 à 23:45:46  profilanswer
 

n°789715
docmaboul
Posté le 08-07-2004 à 00:05:31  profilanswer
 

A mon avis, l'appel à DeviceIoControl est foireux au niveau des paramètres "&mType, sizeof(mType)". Elle vous dit quoi la msdn à ce propos?

n°789730
bidoch78
Posté le 08-07-2004 à 00:29:00  profilanswer
 

Voila un extrait de MSDN
 
BOOL DeviceIoControl(
  HANDLE hDevice,              // handle to device of interest
  DWORD dwIoControlCode,       // control code of operation to perform
  LPVOID lpInBuffer,           // pointer to buffer to supply input data
  DWORD nInBufferSize,         // size, in bytes, of input buffer
  LPVOID lpOutBuffer,          // pointer to buffer to receive output data
  DWORD nOutBufferSize,        // size, in bytes, of output buffer
  LPDWORD lpBytesReturned,     // pointer to variable to receive byte count
  LPOVERLAPPED lpOverlapped    // pointer to structure for asynchronous operation
);
 
en faite en fonction du dwIoControlCode la structure passée en lpOutBuffer est differente.
 
ce que je tiens à préciser c'est que ce code marche parfaitement à mon boulot, mais pas sur mon PC (en faite comme je precise plus haut, sur mes unités logique HDD ca marche tres bien, mais pas pour les CD-ROM) et les 2 postes sont en XP.

n°789745
docmaboul
Posté le 08-07-2004 à 00:38:17  profilanswer
 

bidoch78 a écrit :

en faite en fonction du dwIoControlCode la structure passée en lpOutBuffer est differente.


 
C'est tout le problème. Que spécifie la doc pour le code en question?

n°789748
bidoch78
Posté le 08-07-2004 à 00:41:22  profilanswer
 

extrait :
 
hDevice  
[in] Handle to the device. To obtain a device handle, call the CreateFile function.  
dwIoControlCode  
[in] Control code for the operation. Use IOCTL_STORAGE_GET_MEDIA_TYPES_EX for this operation.  
lpInBuffer  
Not used with this operation; set to NULL.  
nInBufferSize  
Not used with this operation; set to zero.  
lpOutBuffer  
[out] Pointer to a GET_MEDIA_TYPES structure.  
nOutBufferSize  
[in] Size of the output buffer, in bytes.  
 
http://msdn.microsoft.com/library/ [...] pes_ex.asp

n°789758
docmaboul
Posté le 08-07-2004 à 00:49:32  profilanswer
 

Bon, soit, avec krosoft, il vaut mieux douter de rien et aussi, j'invoque ce démon:
 

Code :
  1. GET_MEDIA_TYPES mType[128];
  2. /* idem */
  3. BOOL bResult=DeviceIoControl(hDevice,IOCTL_STORAGE_GET_MEDIA_TYPES_EX, NULL, 0, mType, sizeof(GET_MEDIA_TYPES)*128, &bReturn, NULL);
  4. /* presque pareil */


 
Si c'est pas ça: :kaola:
 
edit: mais où est passée la parenthèse ouvrante du sizeof?


Message édité par docmaboul le 08-07-2004 à 00:51:34
n°789808
bidoch78
Posté le 08-07-2004 à 08:34:41  profilanswer
 

Incroyable, tu viens de m'éclairer, j'ai l'impression que la structure à passer n'est pas la meme pour un CD-ROM (graveur) ton exemple marche bien en effet. En y regardant de plus pres lorsque je passe une unité HDD alors la variable de retour sur la taille du buffer écrit est = à 40 alors que lorsque je passe un CD-ROM (en faite mais deux lecteurs sont des graveurs, et au boulot c'est un CD-ROM normal donc c'est peut etre pour ca que ca passe la-bas), la taille du buffer ecrit est = à 72.
 
Merci encore.
Yann.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pb avec API DeviceIOControl

 

Sujets relatifs
installation de l'Api wxWidget ?[API WIN]Fenetre filles
[C++] API Win32[c#] API Tasks Schelude
[RESOLU][API WIN] List boxsite ou livre sur les api java ??
[JAVA] Intégrer ANT : API ou ligne de commande ?[Java] Pb avec l'API 1.4 de Logging - pb de Handler par défaut
VM et API J2MESources de l'API
Plus de sujets relatifs à : Pb avec API DeviceIOControl


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR