AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ISO-Image einer CDDA mit CreateFile und ReadFile möglich?
Thema durchsuchen
Ansicht
Themen-Optionen

ISO-Image einer CDDA mit CreateFile und ReadFile möglich?

Ein Thema von Garfield · begonnen am 3. Nov 2006 · letzter Beitrag vom 23. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

ISO-Image einer CDDA mit CreateFile und ReadFile möglich?

  Alt 3. Nov 2006, 09:14
Im Projekt von Bochs2Delphi gibt es eine Routine um von einer CD-ROM ein ISO-Image zu erstellen:

Delphi-Quellcode:
procedure TFormCreateIso.ripDrive(const driveRoot, fileIso: String);
const
  chunk_size = 4096 * 10;
var
  buffer:PChar;
  _fileHandle,bytesReaded,Written:LongWord;
  _totBytes:int64;
  _r:boolean;
  fp:file of byte;
begin
  cmrip.Enabled:=false;
  cmClose.Enabled:=false;
  cmStop.Enabled:=false;
  GetMem(buffer,chunk_size);
  _fileHandle:=CreateFile(PChar('\\.\' + driveRoot),GENERIC_READ,0,nil,OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN,0);
  bytesReaded:=chunk_size;
  _totBytes:=0;
  _r:=true;
  stopRun:=false;
  try
    if _fileHandle = INVALID_HANDLE_VALUE then
      begin
        raise Exception.Create('Errore opening: ' + '\\.\' + driveRoot);
        exit;
      end;
    AssignFile(fp,fileIso);
    Rewrite(fp);

    Written:=chunk_size;
    while (bytesReaded = chunk_size) and (_r) and (Written = chunk_size) and (not stopRun) do
      begin
        _r:=ReadFile(_fileHandle,buffer^,chunk_size,bytesReaded,nil);
        BlockWrite(fp,buffer^,chunk_size,Written);
        Inc(_totBytes,bytesReaded);
        if _totBytes mod (chunk_size * 10) = 0 then
          begin
            lblTot.Caption:=IntToStr(_totBytes);
            Application.ProcessMessages;
          end;
      end;
  finally
    CloseFile(fp);
    if _fileHandle <> INVALID_HANDLE_VALUE then
      CloseHandle(_fileHandle);
    if buffer <> nil then FreeMem(buffer);
    cmrip.Enabled:=True;
    cmClose.Enabled:=True;
    cmStop.Enabled:=True;
  end;
end;
Mit Mode1 CDs funktioniert es problemlos, bei Mode2 CDs (CDDA, VCD, SVCD) bekommt man zwar ein gültiges _FileHandle, jedoch ist beim ersten ReadFile Schluss, weil bytesReaded = 0 ist.

Gibt es eine Möglichkeit, dies anzupassen?

Nachtrag: Ich muss mich korrigieren. Bei einer SVCD wird der Datentrack inklusive Struktur gespeichert.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#2

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 4. Nov 2006, 11:45
Jetzt habe ich das gefunden:

http://www.codeproject.com/useritems/SimpleAudioCD.asp
http://www.insidepro.com/kk/020/020r.shtml
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE
MuTzE

Registriert seit: 24. Sep 2003
59 Beiträge
 
#3

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 4. Nov 2006, 12:37
http://isolib.xenome.info/
A8N32-SLI Deluxe | AMD 64 X2 3800+ @ 2700 MHz | Corsair TWINX1024-3200XL @ 270 MHz | ASUS EN7800GTX @ 490/1300 | Samsung SP2504C | Plextor PX-712SA | Logitech UltraX Media Keyboard | Razer Copperhead Chaos Green | Razer eXactMat | Sennheiser PC150
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#4

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 4. Nov 2006, 14:11
Für CDDA dürfte es gehen. Bei CD Extra ging Dancemammals Freeburner nicht. Deshalb nehme ich an, dass er für VCD und SVCD auch nicht geht. Der Unterschied liegt ja nur in der Trackreihenfolge. Also CD Extra erst Audio und dann Daten, bei VCD und SVCD erst Daten und dann Video.

isolib_RevToMix.zip kenne ich noch nicht. Müsste man sehen, inwieweit der Freeburner Source übernommen wurde. Danke für den Hinweis.
__

Nachtrag: Beim Entpacken von http://isolib.xenome.info/releases/f...b_RevToMix.zip kommt eine Passwortabfrage. Und das bei Gnu LGPL.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 4. Nov 2006, 14:59
Da es eine interne Revision war, welche zusammen gemixt wurde.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#6

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 4. Nov 2006, 16:07
Da die TIsoLib für meine Zwecke wahrscheinlich nicht das richtige ist, habe ich mir den FreeBurner 1.0.0.2 angesehen. Möglicherweise hat Dancemammal die TIsoLib erweitert?

Beim Test Project waren einige Units manuell einzufügen. Vermutlich weil ich die ISO9660-Komponente nicht installiert habe. Dann mussten noch ein paar Uint16 und Uint32 in Word und DWord geändert werden, damit Turbo Delphi das Projekt kompilierte.

Die TOC von CDDA und SVCD(2 Daten und ein Video Track) wurden eingelesen. Ein ISO-Image konnte nicht erstellt werden. Leider Ziel nicht erreicht.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 4. Nov 2006, 16:34
Zitat von Garfield:
Möglicherweise hat Dancemammal die TIsoLib erweitert?
Ja, hat er. Er hat die ISOLib als Grundlage genommen und dann erweitert.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#8

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 4. Nov 2006, 16:53
Leider nicht in die Richtung, welche ich brauche.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#9

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 24. Nov 2006, 20:12
Ich habe mir den Freeburner noch einmal angesehen und versucht mit der Testapplication Images von CDs zu ziehen. Die AudioCDs waren leer und beim Zugriff auf DatenCDs fror das System (Win2000) ein.

Ich habe es mit dieser Function versucht:

Delphi-Quellcode:
 // Sektoren lesen
//==============================================================================
function ReadCDAudioSector(cdHandle: THandle; Startsektor, Sektorlesen : Integer;
                      var Data : TRawData; var Fehler : String) : Boolean;
var
  RawReadInfo : RAW_READ_INFO;
  nb : Cardinal;
begin
  Result := False;

  RawReadInfo.DiskOffset.QuadPart := Startsektor * CB_CDROMSECTOR;
  RawReadInfo.TrackMode := CDDA;
  RawReadInfo.SectorCount := Sektorlesen;

  nb := 0;

  if cdHandle <> INVALID_HANDLE_VALUE then
  Result := DeviceIoControl(cdHandle,
                            IOCTL_CDROM_RAW_READ,
                            @RawReadInfo,
                            SizeOf(RawReadInfo),
                            @Data,
                            Sektorlesen * CB_AUDIO,
                            nb,
                            nil);
  Fehler := GetLastErrorMsg;
end;
Dabei habe ich das CDHandle mit der Funktion geholt:

Delphi-Quellcode:
function GetDriveHandle(cDrive: Char): THandle;
begin
  Result := CreateFile(PChar('\\.\'+cDrive+':'),
                       GENERIC_READ or GENERIC_WRITE,
                       FILE_SHARE_READ or FILE_SHARE_WRITE,
                       nil,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL,
                       0);
end;
Beim Befehl DeviceIOControl erhalte ich immer die Meldung: "Ungültiger Parameter".

Anschliessend habe ich das ausprobiert:

Delphi-Quellcode:
function READ_RAW_SECTOR_FROM_CD( hCD : THandle;
                                     HTL : String;
                                 var Data : Array of Byte;
                                     StartSector : DWord;
                                     AnzahlSector : DWord;
                                     flags : Byte)
                                 : Boolean;
const
  RAW_READ_CMD = $BE; // ATAPI RAW READ
  PACKET_LEN = 2352; // Sektorlänge
  SCSI_IOCTL_DATA_IN = 1;
  IOCTL_SCSI_PASS_THROUGH = $04D004;
var
  srb : SCSI_PASS_THROUGH_DIRECT;
  nb : Cardinal;
Begin
  Result := False;
  ZeroMemory(@srb, SizeOf(srb));
  ZeroMemory(@Data, SizeOf(Data));

  if hCD <> INVALID_HANDLE_VALUE
  then begin
    srb.Length := sizeof(SCSI_PASS_THROUGH);
    srb.PathId := StrToInt(HTL[1]); // SCSI controller ID
    srb.TargetId := StrToInt(HTL[3]); // target device ID
    srb.Lun := StrToInt(HTL[5]); // logical unit device ID
    srb.CdbLength := 12;
    srb.SenseInfoLength := 0; // SenseInfo
    srb.DataIn := SCSI_IOCTL_DATA_IN;
    srb.DataTransferLength := PACKET_LEN * AnzahlSector;
    srb.TimeOutValue := 200; // TimeOut
    srb.DataBuffer := @Data;
    srb.SenseInfoOffset := 0; // SenseInfo

    // CDB
    srb.Cdb[0] := RAW_READ_CMD;
    srb.Cdb[1] := $0; // Format Disk
    srb.Cdb[2] := HIBYTE(HIWORD(StartSector));
    srb.Cdb[3] := LOBYTE(HIWORD(StartSector));
    srb.Cdb[4] := HIBYTE(LOWORD(StartSector));
    srb.Cdb[5] := LOBYTE(LOWORD(StartSector));
    srb.Cdb[6] := LOBYTE(HIWORD(AnzahlSector));
    srb.Cdb[7] := LOBYTE(LOWORD(AnzahlSector));
    srb.Cdb[8] := HIBYTE(LOWORD(AnzahlSector));
    srb.Cdb[9] := flags;
    srb.Cdb[10] := 0; // Sub-Channel Data Bits
    srb.Cdb[11] := 0; // reserved

    Result := DeviceIoControl(hCD,
                              IOCTL_SCSI_PASS_THROUGH,
                              @srb,
                              sizeof(srb),
                              @srb,
                              0,
                              nb,
                              Nil);
  end;
end;
Hier friert das Programm beim DeviceIOControl ein.

Beide Sourcen habe ich als C im Internet gefunden.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: ISO-Image einer CDDA mit CreateFile und ReadFile möglic

  Alt 1. Dez 2006, 17:45
Was passiert wohl, wenn du versuchst eine schreibgeschützte CD mit Schreibrechten zu öffnen
Zitat von #9:
Result := CreateFile(PChar('\\.\'+cDrive+':'),
GENERIC_READ or GENERIC_WRITE,

Zum ersten Code (#1):

Zitat von #9:
chunk_size = 4096 * 10;
Mal nachgesehen, ob die Sektoren wirklich 4096 Byte groß sind?
Vielleicht nochmals mit einer passenden Größe versuchen
und eventuell ohne FileCache (FILE_FLAG_NO_BUFFERING).


FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN ... hier könnte man es mal ohne FILE_ATTRIBUTE_NORMAL testen ...
Zitat von MSDN:
FILE_ATTRIBUTE_NORMAL

The file has no other attributes set. This attribute is valid only if used alone.
... wer weiß was Windows in so'nem Fall (nicht) macht?


[add]
ansonsten etwas warten ... demnächst werde ich mich "leider" auch mal wieder mit sowas (Datenträger direkt auslesen) befassen müssen -.-''
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:57 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