Erreur DeviceIoControl ??? pk acces refusé ?

cs_akk Messages postés 12 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 16 septembre 2003 - 4 sept. 2003 à 19:08
cs_akk Messages postés 12 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 16 septembre 2003 - 4 sept. 2003 à 21:22
Bonjour,

Voila lorsque j'execute ce code :
(on passe le nom du lecteur en parametre exemple : main C)

#include <windows.h>
#include 
#include <winioctl2.h>
#include <tchar.h>
#include <stdio.h>  
#include <stdlib.h> 

char DriveLetter;
char szappname[] = "DiskInfo";

void DisplayLastError()
{
  LPVOID lpMsgBuf = 0;
  DWORD dwErr = GetLastError();
  if(dwErr) 
    {
      FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL, dwErr, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),(LPTSTR) &lpMsgBuf, 0, NULL);
      if(lpMsgBuf) 
{
  cout<<"Erreur : "<<(LPCTSTR)lpMsgBuf<<endl;
  LocalFree(lpMsgBuf);
}
    }
}

void InfoPartition()
{

  char szbuff[24];
  
  BYTE buff[sizeof(DISK_GEOMETRY)*20];
  DWORD len;
  
  *((DWORD*) szbuff) = 0x5C2E5C5C; /*car doit etre de la forme  \\.\F: */
  szbuff[4] = DriveLetter;
  szbuff[5] = ':';
  szbuff[6] = 0;
  cout<<"PATH : "<<szbuff<<endl;

  HANDLE hdev;
  hdev = CreateFile(szbuff,0,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);

  if(hdev == INVALID_HANDLE_VALUE) 
    {
      cout<<"INDISPONIBLE"<<endl;
      return;
    }
 
  if(DeviceIoControl(hdev,IOCTL_DISK_GET_DRIVE_LAYOUT , 0, 0, &buff, sizeof(buff), &len, 0)) 
    {
      if(!len) return;

      DRIVE_LAYOUT_INFORMATION *dli;
      dli = (DRIVE_LAYOUT_INFORMATION*) buff;
      printf("DISK INFO [LAYOUT INFO] : \n"); 
      printf("Number of partition : %i\n",dli->PartitionCount);
      printf("Signature : %i\n",dli->Signature);
    }
  else
    DisplayLastError();

  CloseHandle(hdev);
}

int main(int argc,char **argv)
{
  
  if (argc != 2) 
    {
      printf("info [Drive Letter]");
      return 0;
    }
  DriveLetter=argv[1][0];
  printf("Information du disque %c :\n",DriveLetter);
  InfoPartition();

  return 0;
}


J'obtiens une fois compilé une erreur d'accès apres avoir lancé mon programme !!!!

Je ne sais vraiment pas pourquoi et c'est pour ca que je pose la question en esperant qu'une personne pourra me repondre !!

Merci

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 19:15
le mien tournait chez toi ?
BruNews, ciao...
0
cs_akk Messages postés 12 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 16 septembre 2003
4 sept. 2003 à 19:22
oui mais je ne pouvais pas le compiler !
IOCTL_DISK_GET_DRIVE_LAYOUT_EX est introuvable a la compilation et tous les *_EX

Alors j'ai decidé de le refaire pour mieux comprendre son fonctionnement mais j'ai une erreur que je n'arrive pas a expliquer erreur d'acces !!!

PS : en tous cas merci car j'ai compris le fonctionnement c'est parfait !!! ... si j'arrive a corriger cet erreur !! :-)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 19:29
#define _WIN32_WINNT 0x0500
ben regarde la difference, il manque cela avant <windows.h>

BruNews, ciao...
0
cs_akk Messages postés 12 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 16 septembre 2003
4 sept. 2003 à 19:39
Non ca ne change rien toujours acces refusé et si je mets IOCTL_DISK_GET_DRIVE_LAYOUT_EX a la place de IOCTL_DISK_GET_DRIVE_LAYOUT et bien le compilateur me dit que IOCTL_DISK_GET_DRIVE_LAYOUT_EX n'est pas declaré !!!

Ah oui pour info je compile avec gcc !! et je pense que ca peut venir de la ! il n'y a pas definition de IOCTL_DISK_GET_DRIVE_LAYOUT_EX dans winioctl.h !

Je ne sais pas !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 19:43
bah oui mais faire du win32 avec de l'exotique, c'est abuser.
BruNews, ciao...
0
cs_akk Messages postés 12 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 16 septembre 2003
4 sept. 2003 à 20:17
Avec visual C++ ca marcherai ??
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 20:20
evidemment puisque le mien va bon.
BruNews, ciao...
0
cs_akk Messages postés 12 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 16 septembre 2003
4 sept. 2003 à 21:05
Bon et bien je viens d'installer Visual C++ 6.0
J'essaie de compiler et ... toujours la meme erreur !
alors voila je t'envoie mon code et si tu pouvais le compiler et me dire si ca marche ce serait cool !!!! mais vraiment !!!

IOCTL_DISK_GET_DRIVE_LAYOUT_EX indeclaré !!
et si je mets a la place
IOCTL_DISK_GET_DRIVE_LAYOUT

et bien j'obtiens toujours accès refusé !!

tiens je t'envoie le code si tu veux bien regarder :


#define _WIN32_WINNT 0x0500
#include <windows.h>
#include 
#include <winioctl.h>
#include <tchar.h>
#include <stdio.h>  
#include <stdlib.h> 

char DriveLetter;
char szappname[] = "DiskInfo";

void DisplayLastError()
{
  LPVOID lpMsgBuf = 0;
  DWORD dwErr = GetLastError();
  if(dwErr) 
    {
      FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL, dwErr, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),(LPTSTR) &lpMsgBuf, 0, NULL);
      if(lpMsgBuf) 
{
  cout<<"Erreur : "<<(LPCTSTR)lpMsgBuf<<endl;
  LocalFree(lpMsgBuf);
}
    }
}

void InfoPartition()
{

  char szbuff[24];
  
  BYTE buff[sizeof(DISK_GEOMETRY)*20];
  DWORD len;
  
  *((DWORD*) szbuff) = 0x5C2E5C5C; /*car doit etre de la forme  \\.\F: */
  szbuff[4] = DriveLetter;
  szbuff[5] = ':';
  szbuff[6] = 0;
  cout<<"PATH : "<<szbuff<<endl;

  HANDLE hdev;
  hdev = CreateFile(szbuff,0,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);

  if(hdev == INVALID_HANDLE_VALUE) 
    {
      cout<<"INDISPONIBLE"<<endl;
      return;
    }

  if(DeviceIoControl(hdev,IOCTL_DISK_GET_DRIVE_LAYOUT, 0, 0, &buff, sizeof(buff), &len, 0)) 
    {
      if(!len) return;

      DRIVE_LAYOUT_INFORMATION *dli;
      dli = (DRIVE_LAYOUT_INFORMATION*) buff;
      printf("DISK INFO [LAYOUT INFO] : \n"); 
      printf("Number of partition : %i\n",dli->PartitionCount);
      printf("Signature : %i\n",dli->Signature);

    }
  else
    DisplayLastError();

  
  CloseHandle(hdev);
}

int main(int argc,char **argv)
{
  DriveLetter='C';
  printf("Information du disque %c :\n",DriveLetter);
  InfoPartition();

  return 0;
}


Merci !
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 21:13
parce que tu as un vieux sdk, passe un message que je te renvoie un WinIoCtl.h + recent.
bnutiles@wanadoo.fr
BruNews, ciao...
0
cs_akk Messages postés 12 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 16 septembre 2003
4 sept. 2003 à 21:22
C'est parti !
0
Rejoignez-nous