Pb avec API DeviceIOControl

Pb avec API DeviceIOControl - C - Programmation

Marsh Posté le 07-07-2004 à 23:45:46    

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.

Reply

Marsh Posté le 07-07-2004 à 23:45:46   

Reply

Marsh Posté le 08-07-2004 à 00:05:31    

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

Reply

Marsh Posté le 08-07-2004 à 00:29:00    

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.

Reply

Marsh Posté le 08-07-2004 à 00:38:17    

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?

Reply

Marsh Posté le 08-07-2004 à 00:41:22    

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

Reply

Marsh Posté le 08-07-2004 à 00:49:32    

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
Reply

Marsh Posté le 08-07-2004 à 08:34:41    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed