Ceci est une ancienne révision du document !


Identifier de manière unique un disque dur

STORAGE_DEVICE_UNIQUE_IDENTIFIER

source : https://learn.microsoft.com/fr-fr/windows-hardware/drivers/ddi/storduid/ns-storduid-_storage_device_unique_identifier

ChatGPT me sort un programme :

program project1;
 
{$mode objfpc}{$H+}
 
uses
 {$IFDEF UNIX}
  cthreads,
   {$ENDIF}
  Classes,
  crt, SysUtils,
  Windows;
 
{ you can add units after this }
 
 
const
  IOCTL_STORAGE_QUERY_PROPERTY = $002D1400;
type
  TStoragePropertyQuery = record
    PropertyId: DWORD;
    QueryType:  DWORD;
    AdditionalParameters: array [0..15] of byte;
  end;
 
  TStorageDeviceIDDescriptor = record
    Version:     DWORD;
    Size:        DWORD;
    Identifiers: array [0..0] of byte;
  end;
 
var
  hDevice:       THandle;
  query:         TStoragePropertyQuery;
  descriptor:    TStorageDeviceIDDescriptor;
  bytesReturned: DWORD;
  ch: char;
 
begin
  // Ouvrir le périphérique de stockage
  hDevice := CreateFile(pchar('\\.\PhysicalDrive0'), GENERIC_READ, FILE_SHARE_READ or
    FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if hDevice = INVALID_HANDLE_VALUE then
  begin
    Writeln('Impossible d''ouvrir le périphérique de stockage.');
    Exit;
  end;
 
  try
    // Préparer la requête pour la propriété STORAGE_DEVICE_UNIQUE_IDENTIFIER
    query.PropertyId := 0 {StorageDeviceProperty};
    query.QueryType  := 0 {PropertyStandardQuery};
 
    // Obtenir la propriété STORAGE_DEVICE_UNIQUE_IDENTIFIER
    if not DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
      @query, SizeOf(query), @descriptor, SizeOf(descriptor), bytesReturned, nil) then
    begin
      Writeln('Erreur lors de la récupération de la propriété STORAGE_DEVICE_UNIQUE_IDENTIFIER.');
      Exit;
    end;
 
    // Afficher l'identifiant unique du périphérique de stockage
    Writeln('Identifiant unique du périphérique de stockage:');
    Writeln(Format('%s', [PChar(@descriptor.Identifiers)]));
    //Writeln(Format('%.*s', [descriptor.Size, @descriptor.Identifiers]));
 
  finally
    // Fermer le périphérique de stockage
    CloseHandle(hDevice);
  end;
 
  ch:=ReadKey;
 
end.

Mais il y a un problème a l'affichage… j'ai pas le temps de voir pourquoi !

Il faut exécuter le programme en mode admin.

Sources & Ressources

Vous pourriez laisser un commentaire si vous étiez connecté.