2012-09-19 1 views
0

J'essaie d'identifier si un lecteur est un lecteur réservé au système (PhysicalDrive0 ou C-Drive) en utilisant la fonction DeviceIoControl. Cependant, mon code retourne toujours vrai pour tous les lecteurs.Identification du lecteur système réservé à l'aide de la fonction DeviceIoControl en C++

HANDLE hDevice;    // handle to the drive to be examined 
BOOL bResult;     // results flag 
DWORD junk;     // discard results 

PARTITION_INFORMATION_MBR *pdg 

hDevice = CreateFile(TEXT("\\\\.\\C:"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | 
     FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 


bResult = DeviceIoControl(
      hDevice,      // device to be queried 
      IOCTL_DISK_GET_PARTITION_INFO_EX, // operation to perform 
      NULL, 0,      // no input buffer 
      pdg, sizeof(*pdg),    // output buffer 
      &junk,       // # bytes returned 
      (LPOVERLAPPED) NULL    // synchronous I/O 
     ); 
  • bResult isalways retour 0, ce qui indique que la fonction a réussi.
  • Même pdg->PartitionType contient des informations inutiles et ne renvoie pas true.
+0

Vous pourriez vouloir prendre de plus près: * Valeur de retour: Si l'opération se termine avec succès, la valeur de retour est non nulle. Si l'opération échoue ou est en attente, la valeur de retour est zéro. Pour obtenir des informations d'erreur étendues, appelez GetLastError. * – chris

+0

DeviceIoControl a récupéré avec succès les informations de partition et il est (stocké dans votre structure 'PARTITION_INFORMATION_EX') donc il a retourné 0 (succès). Vous devez maintenant regarder votre structure 'PARTITION_INFORMATION_EX' et voir si les informations que vous avez demandées sont là ou non. –

Répondre

0

bResult isalways retour 0, ce qui indique que la fonction a réussi.

Correct Incorrect, the documentation states Si l'opération aboutit, la valeur renvoyée est différente de zéro. Beaucoup de choses pourraient être mal, au moins vos paramètres ne sont pas droit et GetLastError seraient retournés ERROR_INSUFFICIENT_BUFFER:


Vous donnez DeviceIoControl un pointeur non initialisé, mais il prévoit que pdg des points à un tampon, dans ce cas, avec la taille d'un pointeur sur PARTITION_INFORMATION_MBR. Le déréférencement des pointeurs sauvages appelle un comportement indéfini. En outre, selon the documentationDeviceIoControl avec OCTL_DISK_GET_PARTITION_INFO attend une structure PARTITION_INFORMATION_EX si


changement

PARTITION_INFORMATION_MBR *pdg(;) 

à

PARTITION_INFORMATION_EX pdg; 

Vous avez une structure avec le stockage automatique, pour lequel vous pouvez donner DeviceIoControl un pointeur temporaire, avec l'opérateur &.

bResult = DeviceIoControl(
     hDevice,      // device to be queried 
     IOCTL_DISK_GET_PARTITION_INFO_EX, // operation to perform 
     NULL, 0,      // no input buffer 
     &pdg, sizeof(pdg),    // output buffer 
     &junk,       // # bytes returned 
     (LPOVERLAPPED) NULL    // synchronous I/O 
    ); 
Questions connexes