Pb avec API DeviceIOControl - C - Programmation
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?
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.
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?
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
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 : 
 | 
 
 
Si c'est pas ça:  
 
 
edit: mais où est passée la parenthèse ouvrante du sizeof?
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.
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.