AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SPTI - CD-Laufwerk steuern (lesen) und CD/DVD auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

SPTI - CD-Laufwerk steuern (lesen) und CD/DVD auslesen

Ein Thema von himitsu · begonnen am 24. Feb 2007 · letzter Beitrag vom 25. Mär 2007
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

SPTI - CD-Laufwerk steuern (lesen) und CD/DVD auslesen

  Alt 24. Feb 2007, 13:29
Moin ihr,

ich hab jetzt zwar schon seit Wochen gesucht und auch Unmassen von Webseiten, Foren, OpenSource-Brennerkomponenten und dergleichen durchgeforstet, aber so richtig fündig bin ich dennoch nicht geworden.

Vorallem da viele der Komponenten mit ASPI arbeiten, oder ASPI und SPTI mischen, so daß ich da einfach nicht durchseh.


So, was ich nun will ist erstmal die möglichen Lesegeschwindigkeiten auslesen und dann selber die mininmale und maximale Lesegeschwindigkeit setzen.

Wenn möglich noch die Fehlererkennung/korrektur des Laufwerks beeinflussen.

Außerdem die Sektoren welche auf "normalem" Wege nicht lesbar sind nochmals nochmals über 'nen RAW-Zugriff, notfalls auch die fehlerhaften Daten auszulesen.

Und am liebsten hätte ich dann beim Auslesen noch gern einen Status über den Zustand des ausgelesenen Sectors.


Beim RAW-Auslesen hänge ich leider noch ... alle Beispiele im Netz (welche ich fand) handelten nur von AudioCDs.
Ich möchte einfach nur die Daten der letzten/aktuellen Session einer Daten/Mixed-CD/DVD auslesen können.



'nen kleinen unstoppbaren Kopierer hab ich derzeit als Programmchen geschrieben, welcher auch recht gut arbeitet, nur daß halt das CD-Laufwerk nicht direkt beeinflußt werden kann.
Die Geschwindigkeit wird automatisch geregelt und das wollte ich abstellen, da ich eh in mehreren Schritten auslese und da sowas etwas störend ist.

(dat Programmchen häng ich gern heut abend/montag früh noch an ... wenn ich es nicht wieder vergesse mitzunehmen ._.)
$2B or not $2B
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#2

Re: SPTI - CD-Laufwerk steuern (lesen) und CD/DVD auslesen

  Alt 24. Feb 2007, 13:43
Moin,

Was hast du denn schon an Code? Damit man sehen kann, inwiefern man darauf aufbauen kann. Im Prinzip brauchst du nur eine Tabelle mit SCSI-Befehlen, die du in einer vorhandenen Funktion einbauen könntest. So gibt es zum Lesen z.B. den Befehlscode 28 (hex).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: SPTI - CD-Laufwerk steuern (lesen) und CD/DVD auslesen

  Alt 26. Feb 2007, 19:53
Das ist ja das Problem, im Prinzip hab ich noch nichts.

Vermutlich geht es ja irgendwie mit DeviceIoControl und IOCTL_SCSI_PASS_THROUGH*, aber welche Parameter ich da übergeben muß und vorallem wie, das weiß ich halt nicht.

Wie gesagt, ich bin zwar noch am suchen (hab daheim halt nur kein INet und hier nicht unbedingt all zuviel Zeit, daher hab ich mir einige vorallem OpenSourceProjekte runtergeladen und schau dort drin nach.

Allerdings setzten viele da ja nur auf ASPI (was ich nicht möchte/will) und die Anderen verwenden Beides, also ASPI und SPTI gemischt, wobei die anscheinend erstmal ASPI verwenden und wenn das nicht geht, dann versuchen auf SPTI auszuweichen. Leider haben die dann allerdings intern alles so verschachtelt, daß es dann z.B. nur einen Befehl gibt, womit die z.B. 'nen Sektor auslesen und dieses dann über für mich noch total wirre Wege dann an die entsprechende Stelle leiten, so daß ich einfach noch nicht rausfinden konnte was wirklich für SPTI nötig ist.


Ich brauche also erstmal irgendeinen Einstieg und wenn es auch nur ein "gutes" Suchwort ist,
welcher sich am Besten mal nur mit SPTI beschäftig.

Ach ja, warum unbedingt SPTI, weils Windows (NT...) von Haus aus unterstützt und nicht erst ein ASPI-Treiber benötigt wird.



In meinem Programm ist davon jedenfalls noch nichts drin ... drum suche ich ja schließlich.
Und mal sehn ob ich die Sourcen zum Programm später mit freigebe.
(es wird dann also ... wenn es mal fertig ist ... unter Freeware, oder OpenSource nochmals richtig erscheinen)

Aber erstmal muß ich irgendwie noch mit SPTI klarkommen.

Zitat:
So, hier mal mein bißheriges Versuchsprogramm (siehe Anhang).

Wie gesagt eine Optimierung für CD/DVD-Laufwerke müßte noch rein.
Es muß ja nicht sein, daß die Geschwindigkeit sich ständig ändert (unnötige Zeitverschwendung), oder diese ständig/sinnlos im Keller rumdümpelt -.-''
Speziell denke ich da beim Kopierprozess an:
- maximum Speed bei Mode 1
- 50% Speed bei Mode 2
- und Mode 3 mit minimum Speed und wenn möglich hier noch etwas mehr in Richtung Fehlerkorrektur verbessert


Zum Programm selber ... 's ist eigentlich recht einfach gestrickt.
Derzeit kann jeweils nur eine Datei kopiert werden, welches aber auch 'nen kleinen Vorteil hat.
So kann man z.B. auch ein ISO-Image 'ner CD/DVD erstellen (als Quelldatei z.B. einfach sowas wie "\\.\CDRom0", oder "\\.\E:" angeben).
Und auch ein grober (sektorenweiser) Vergleich zweier Dateien wäre möglich.

OK, Design/Dediehnung is noch so toll und was das BitMap (SectorÜbersicht) angeht, da läßt sich noch einiges machen, aber jetzt is mir der Lesevorgang noch wichtiger.
  • wie gesagt ... kopiert derzeit nur eine einzige Datei
  • reagiert schonmal etwas langsam
    der Kopierprozess läuft halt im Hauptthread
    (wegen der einfacheren Fehlersuche und für weitere Tests)
  • es wird in mehreren Schritten kopiert
    - zuerst mit mehreren Sektoren aufeinmal
    - dann die fehlerhaften Sektoren nochmal Sektor für Sektor
    - und wenn dann immernoch was fehlt nochmals sektorweise in 'nem erweiterten Modus
  • der Kopierstatus wird in Zieldatei[/b].usr[/b] gespeichert
    darum kann er später wieder geladen und für einen weiteren Kopiervorgang wiederverwendet werden
  • für [Load] und [Fill] wird keine Quelldatei benötigt
  • [SectorSize]: mit -1 wird die aktuelle Sektorengröße ausgelesen
    aber man kann auch selber einen Wert angeben (z.B. für den Dateivergleich)
    Es muß sich aber immer um ein Vielfaches der reellen Sektorgrößen (Quell- und Zieldatei) sein.
  • [Copy]: startet den Kopiervorgang
    über die CheckBoxen darunter ist es auch möglich den Kopierstatus zurückzusetzen und/oder die ersten beiden Kopiermethoden zu überspringen
  • [Test]: vergleicht Quell- und Zieldatei
  • [Fill]: fehlende/fehlerhafte Sektoren werden mit dem angegebenem Wert (0..255, also Byte),
    oder mit dem Inhalt der angegebenen Datei gefüllt.
    Aus der Datei wird der erste "Sektor" ausgelesen (die Datei muß also mindestens eine Größe von SektorSize aufweisen) und als FüllSektor verwendet.
  • [Status]:
    Farben (pro Sektor ein Pixel):
    grau: noch nicht gelesen
    Hellgrün: erfolgreich gelesen
    Rot: Lesefehler
    Dunkelgrün: Lesefehler, aber der Sektor wurde früher schonmal erfolgreich ausgelesen
  • und natürlich wird außer in Zieldatei und Zieldatei.usr nirgends was gespeichert/verändert

Da der Lesestatus ja gespeichert und im Normalfall nur fehlende Sektoren erneut gelesen werden,
kann man den Lesevorgang abbrechen und später fortsetzten,
oder den Lesevorgang beliebig oft wiederholen (z.B. nach 'ner CD-Reinigung/-Reperatur...)
und auch ein kombinieren zweier Dateien wäre möglich (einfach 'ne andere, gleichgroße Quelldatei angeben).

Ach ja, Status- und Fehlermeldungen verstecken sich in der Titelleiste.

PS: da die Fehlererkennung ja nur über 'ne kleine Prüfsumme (CRC) läuft, ist es dennoch möglich, daß einige fehlerhafte Sektoren als OK durchgehen ... dieses läßt sich aber auch nicht ändern, notfalls kann man aber nochmal einen "Test" drüberlaufen lassen.
Miniaturansicht angehängter Grafiken
project8_copyfile_318.gif  
Angehängte Dateien
Dateityp: exe project8_copyfile_124.exe (230,0 KB, 16x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: SPTI - CD-Laufwerk steuern (lesen) und CD/DVD auslesen

  Alt 27. Feb 2007, 20:52
so, ich hab zwar heut früh mal angefangen die Grundlagen zu legen/zusammenzustellen, aber dennoch fehlen mir einfach die Befehle.

'ne Liste, wie du schon sagtest, wäre da wirklich hilfreich.


Der Grundaufbau ist ja schon fast klar, aber welche Werte für welche Funktion gesetzt werden müssen ...
Delphi-Quellcode:
SPTDWB.Length := SizeOf(SCSI_PASS_THROUGH);
SPTDWB.CdbLength := 10;
SPTDWB.SenseInfoLength := SizeOf(SPTDWB.SenseBuf);
SPTDWB.DataIn := SCSI_IOCTL_DATA_IN;
SPTDWB.DataTransferLength := SizeOf(TDeviceConfigHeader);
SPTDWB.TimeOutValue := 120;
SPTDWB.DataBuffer := @DCH;
SPTDWB.SenseInfoOffset := SizeOf(SCSI_PASS_THROUGH) + SizeOf(SPTDWB._fill);

SPTDWB.Cdb[0] := $46;
SPTDWB.Cdb[1] := $02;
SPTDWB.Cdb[3] := $00;
SPTDWB.Cdb[7] := HiByte(SizeOf(TDeviceConfigHeader));
SPTDWB.Cdb[8] := LoByte(SizeOf(TDeviceConfigHeader));

If DeviceIoControl(Handle, IOCTL_SCSI_PASS_THROUGH_DIRECT, @SPTDWB, SizeOf(SCSI_PASS_THROUGH),
  @SPTDWB, SizeOf(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER), W, nil) Then
Angehängte Dateien
Dateityp: pas _spti_148.pas (8,8 KB, 28x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: SPTI - CD-Laufwerk steuern (lesen) und CD/DVD auslesen

  Alt 27. Feb 2007, 22:11
Vielleicht findest du in der Version 0.03a noch was nützliches: www.isolib.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: SPTI - CD-Laufwerk steuern (lesen) und CD/DVD auslesen

  Alt 25. Mär 2007, 15:50
isolib kannte ich schon, aber ich glaub langsam entsteht was Brauchbares


Na ja, hab das zwar noch nicht eingebaut/aktiviert, aber hier dennoch erstmal was "Neues".

Hatte da oben ja noch ein/zwei (schwerwiegende) Fehler und Verbesserungswürdiges entdeckt.

Vorallem die Quelldateigröße wird jetzt (hoffentlich) richtig erkannt und mit der Steuerung isses nun och etwas einfacher.

Es können nun mehrere Dateien (nicht mehr nur jeweils Eine) auf einmal kopiert werden.
Quelle mit Platzhaltern und Ziel als Pfad
> Quelldatei > D:\*.*
> Zieldatei > C:\Ziel\

Möglich natürlich auch Quellangaben wie "D:\a*.*", oder "D:\*.txt" ... wo dann jeweils nur Dateien/Verzeichnisse, welche auf diese Masken passen im Verzeichnis gesucht werden.
Auf die Maske passende Unterverzeichnisse werden immer abgearbeitet.

Dann wurden noch Fehler in den Logdaten behoben, einige weitere Optimierungen beim Auslesen und weitere Dinge eingebaut/überarbeitet.
Angehängte Dateien
Dateityp: exe project8_copyfile_xpstyle_255.exe (244,5 KB, 20x aufgerufen)
Dateityp: exe project8_copyfile_697.exe (244,0 KB, 5x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz