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

Datum Beschreibung
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.