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.