Bonjour,

Je cherche à accéder à la partition Recovery d'un PC.
Pour ce faire, j'interroge la BCD et je trouve un path du style : \Device\HarddiskVolume1

Si j'explore les disque avec le gestionnaire de disque, je trouve effectivement une partition sans lettre de lecteur.

Le code suivant me permet de retrouver les volumes non montés, et de les monter avec une lettre de lecteur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
for i := 0 to 99 do begin
      vol := PChar('\\.\PhysicalDrive' + IntToStr(i));  // Parcours des disques physiques
      H := CreateFile(Vol, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
      if H = INVALID_HANDLE_VALUE then begin // Pas d'autres disques
         Break;
      end;
      CloseHandle(H);
      for j := 1 to 20 do begin // Parcours des partition du disque en cours
         BreakCycle := False;
         NextLetter := GetNextAvailableLetter;
         DefineDosDevice(DDD_RAW_TARGET_PATH or DDD_NO_BROADCAST_SYSTEM, PChar(string(NextLetter + ':')), PChar('\Device\Harddisk' + IntToStr(i) + '\Partition' + IntToStr(j)));
         H := CreateFile(PChar('\\.\' + NextLetter + ':'), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
         if H = INVALID_HANDLE_VALUE then begin // pas d'autres partitions sur le disque
            Break;
         end;
      end;
   end;
J'ai volontairement simplifié pour la clarté (le code original contrôle que les volumes ne sont pas déjà montés etc.), vu que le code fonctionne. Ma question est ailleurs.


Le code suivant me donne la liste des volumes sous la forme \\?\volume{GUID} :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
  H := FindFirstvolumeW(@VolName, MAX_PATH+1);
  while FindNextvolumeW(H, @VolName, MAX_PATH+1) do begin
      VolNameGuid := WideCharToString(VolName);
  end;
  FindVolumeClose(H);
1. J'attribue donc une lettre de lecteur à un volume dont le chemin est du type \Device\Harddsik0\Partition1
2. La BCD indique de son côté le chemin \Device\HarddiskVolume1
3. Le CreateFile fonctionne uniquement avec des chemins du type \\?\volume{GUID} ou \Device\Harddsik0\Partition1, mais pas \Device\HarddiskVolume1 ...

Ma question est donc : Comment puis-je rapprocher les informations données par la BCD (\Device\HarddiskVolume1) et celles fournies par l'API \\?\volume{GUID} ou \Device\Harddsik0\Partition1 ?

Merci