Montag, 7. Mai 2012

yab - den Inhalt der Partitions- Tabelle ermitteln

Obwohl "yab" ja leider keine Anbindung an die verschiedenen Haiku- API's besitzt und auch nicht direkt auf Hardware zugreifen kann, bedeutet das noch lange nicht, das es nicht doch einen Weg gibt.
Dank des, sehr mächtigen, "system$"- Befehls und ein wenig Kommandozeilen- Gewurschtel ist es durchaus möglich z.B. die Partitions- Tabelle auszulesen.
Für diesen Zweck nutzen wir einmal mehr den Befehl "dd" mit dessen Hilfe wir ein fach den ersten Sektor der Festplatte in eine Datei schreiben. Dies kann folgendermaßen geschehen.

dd if=/dev/disk/ata/0/master/raw of=sector.tmp count=1


Wichtig an dieser Stelle ist, das das entsprechende "raw"- Device verwendet wird, da wir bei "0", "1", etc. den ersten Sektor der jeweiligen Partition, nicht aber der eigentliche Festplatte lesen würden.

So, nachdem nun also den ersten Sektor der Festplatte in die Datei "sector.tmp" geschrieben haben, können wir nun damit beginnen die entsprechenden Informationen zu extrahieren. Interessant sind für uns in diesem Zusammenhang nur die 64 Byte, welche ab Position 446 zu finden sind. Den genauen Aufbau der Partitionstabelle möchte ich mir an dieser Stelle jedoch sparen, da dies den Rahmen etwas sprengen würde. Nachlesen kann man das Ganze aber unter folgendem Link.


http://de.wikipedia.org/wiki/Partitionstabelle


Die Arbeit nimmt uns die untenstehende Sub- Routine ab. Sie ist wie immer mit reichlich Kommentaren gewürzt und sollte damit recht verständlich sein. Als Ergebnis erhalten wir eine Zeichenkette in der Form.


"80|00|00|00|eb|....."

Der Aufruf der Sub- Routine kann z.B. folgendermaßer erfolgen.

print _GetPartitionTable$("/dev/disk/ata/0/master/raw")

Was genau man mit diesen Informationen wie anstellen kann, werde ich Euch in den nächsten Folgen einer "yab- Tutorial- Reihe" zeigen.



// es muß immer der "raw"- Eintrag des entsprechenden
// Laufwerks übergeben werden
export sub _GetPartitionTable$(Drive$)

  // lokale Variablen Definition
  local SystemInfo$
  local ByteInHex$
  local Result$
  local i
  local Filename$
 
  Filename$ = "sector.tmp"
  SystemInfo$ = ""
  ByteInHex$ = ""
  Result$ = ""
 
  // Array für die 64 Byte der Partitions- Tabelle
  dim PTable(64)
 
  // prüfen ob das angegebene Laufwerk vorhanden
  // und das richtige ist
  if right$(Drive$, 4) <> "/raw" then

    // sollten die letzten 4 Zeichen des Laufwerk- Strings
    // nicht "/raw" lauten, beenden und nichts zurückgeben
    return
  
  else
 
    // den ertsen Sektor der Festplatte mit "dd" in die temporäre
    // Datei "sector.tmp" schreiben
    SystemInfo$ = system$("dd if=" + Drive$ + " of=" + Filename$ + " count=1")
  
    // prüfen ob die erstellte Datei "sector.tmp" auch
    // vorhanden ist
    if not (system("test -f " + Filename$)) then
  
      // die Datei "sector.tmp" öffnen ...
      open Filename$ for reading as #1
  
      // ... und an die entsprechende Stelle springen
      seek #1, 446
   
      // alle 64 Byte der Partitions- Tabelle lesen
      for i = 1 to 64
  
        // das Array PTable() nimmt alle Einträge der
        // Partitions- Tabelle auf
        PTable(i) = peek(#1)
   
      next i

      // die Datei "sector.tmp" wieder schließen
      close #1
  
      // die einzelnen Werte aus der Partitions- Tabelle ermitteln
      // und zur Übergabe in einen String schreiben
      for i = 1 to 64
   
        // den jeweiligen Hex- Wert jedes Bytes ermitteln ...
        ByteInHex$ = hex$(PTable(i))
    
        // ... und prüfen ob dieser zweistellig ist, falls nicht ...
        if len(ByteInHex$) < 2 then
    
          // ... diesen zweistellig machen
          ByteInHex$ = "0" + ByteInHex$
     
        endif
    
        // alle Bytes zu einem String zusammenfassen, durch "|" trennen ...
        // (durch die Trennung läßt sich der String später besser
        // weiterverarbeiten)
        Result$ = Result$ + ByteInHex$ + chr$(124)
    
      next i
   
      // ... und diesen zurückgeben
      return Result$

    else
  
      // sollte die Datei "sector.tmp" aus irgendeinem Grund
      // nicht vorhanden sein, dann beenden und nichts zurückgeben
      return
   
    endif
  
  endif

  // die temporäre Datei "sector.tmp" wieder löschen
  SystemInput$ = system$("rm " + Filename$)
 
end sub


(getestet mit Haiku R1 Alpha 3 und yab 1.5)

Keine Kommentare:

Kommentar veröffentlichen