Projekte > Optische Laufwerke > Laufwerke

Registry

Unter Windows 2000 und XP sind die Bezeichnungen der Laufwerke in der Registry gespeichert. Man findet sie unter dem Schlüssel HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\ sortiert nach Port, Bus, Target Id und Logical Unit Id. Zum Beispiel:

Die Registry und der oben genannte Schlüssel werden geöffnet. Dann wird die Liste der Unterschlüssel gelesen. Anschließend werden - wenn möglich - aus dem Schlüssel und der Liste die jeweiligen Unterschlüssel bis hinunter zur LUnID gebildet. Ist man bis dahin durchgekommen, wird der Wert der Variable Type ausgewertet. Für optische Laufwerke heißt er CdRomPeripheral. Stimmt der Type wird die Bezeichnung aus der Variablen Identifier ausgelesen.

In Demo sieht dies so aus:

...
var
  Reg          : TRegistry;
  RegRoot      : String;
  RegKey       : String;
  PortsList    : TStringList;
  TargetIDList : TStringList;
  LUnIDList    : TStringList;
  p, t, l      : Integer;
begin
  {
  ******************************************************************************
  *  Liste der optischen Laufwerke erstellen.
  }
  if Win32Platform = VER_PLATFORM_WIN32_NT
  then begin
    {
    *  Init
    }
    lvwDrives.Clear;
    {
    *  Registry öffnen und Pfad einstellen.
    }
    Reg         := TRegistry.Create;
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    RegRoot     := 'HARDWARE\DEVICEMAP\Scsi';
    {
    *  Wenn der Rootschlüssel existiert, diesen zum Lesen öffnen, die Portliste
    *  lesen und den Schlüssel schließen.
    }
    PortsList := TStringList.Create;
    if Reg.KeyExists(RegRoot) and Reg.OpenKeyReadOnly(RegRoot)
    then begin
      Reg.GetKeyNames(PortsList);
      Reg.CloseKey;
    end;
    {
    *  Wenn Einträge vorhanden sind, diese nacheinander prüfen.
    }
    if PortsList.Count > 0 then
    for p := 0 to PortsList.Count - 1
    do begin
      {
      *  Eine Busliste muss nicht geladen werden, da er anscheinend immer den
      *  Wert 0 besitzt. Deshla kann sofort die Target Id Liste geladen werden.
      }
      RegKey       := Format('%s\%s\Scsi Bus 0', [RegRoot, PortsList.Strings[p]]);
      TargetIDList := TStringList.Create;
      if Reg.OpenKeyReadOnly(RegKey)
      then begin
        Reg.GetKeyNames(TargetIDList);
        Reg.CloseKey;
      end;
      {
      *  Wenn Einträge vorhanden sind, diese nacheinander prüfen.
      }
      if TargetIDList.Count > 0 then
      for t := 0 to TargetIDList.Count - 1
      do begin
        {
        *  Logical Unit Id Liste laden.
        }
        RegKey    := Format('%s\%s\Scsi Bus 0\%s',
                            [RegRoot, PortsList.Strings[p],
                             TargetIDList.Strings[t]]);
        LUnIDList := TStringList.Create;
        if Reg.OpenKeyReadOnly(RegKey)
        then begin
          Reg.GetKeyNames(LUnIDList);
          Reg.CloseKey;
        end;
        {
        *  Wenn Einträge vorhanden sind, diese nacheinander prüfen.
        }
        if LUnIDList.Count > 0 then
        for l := 0 to LUnIDList.Count - 1
        do begin
          {
          *  Prüfen, ob in dem Schlüssel der Wert 'Type' existiert und
          *  'CdRomPeripheral' ist. Anschließend prüfen, ob der Wert
          *  'Identifier' mit der Beschreibung des Laufwerks existiert und
          *  lesen.
          }
          RegKey := Format('%s\%s\Scsi Bus 0\%s\%s',
                           [RegRoot, PortsList.Strings[p],
                            TargetIDList.Strings[t], LUnIDList.Strings[l]]);
          if Reg.OpenKeyReadOnly(RegKey)
          then begin
            if Reg.ValueExists('Type')
            and (Reg.ReadString('Type') = 'CdRomPeripheral')
            and Reg.ValueExists('Identifier') then
            with lvwDrives.Items.Add
            do begin
              Caption := Format('[%d:%d:%d]',
                                [ValueFromSCSI(RegKey, cPort),
                                 ValueFromSCSI(RegKey, cTargetID),
                                 ValueFromSCSI(RegKey, cLUnID)]);
              SubItems.Add(Reg.ReadString('Identifier'));
            end;
            Reg.CloseKey;
          end;
        end;
        LUnIDList.Destroy;
      end;
      TargetIDList.Destroy;
    end;
    PortsList.Destroy;
  end;
...
end;

Nach dem Lesen werden die Schlüssel wieder geschlossen, weil man zwar in die tiefere Ebene aber nicht nach oben navigieren kann.

Das Ergebnis des Beispiels sieht so aus:

Read Registry (podReadRegistry.7z - 225 kb) MD5 (1 kb). Stand: 28. April 2013

Änderungen an der Demo

28.04.2013Überarbeitung und neuer Name.
04.04.2013Überarbeitung.

 

Unter Windows 7 scheint dieser Registrypfad nicht vom System angelegt zu werden. Deshalb bleibt die Liste dort in der Demo leer. Jedoch kann es passieren, dass die Schlüssel bei der Installation virtueller Laufwerke angelegt werden.