Du bist hier: Snippet-Verzeichnis » DOS (8)
Sprache:

Fixating CDR(W)s with DOS

Sprache: English
Programmiersprache: Pascal
Veröffentlicht von: cinek [nicht registriert]
Letzte Änderung: 15.05.2006
Aufrufe: 1732


Beschreibung

This Pascal code shows how tofixate/finalize (close sessions)on IDE-CDR-drives with DOS.Sometimes useful to save data frombroken sessions.

Code

1 uses ATAPI; 2 3 const IDEPORT_DATA=0; 4 var Output:PATAPIDevice; 5 Size,j:word; 6 i,WTrackNr:byte; 7 DataSize:longint; 8 RawData,Data:PByteArray; 9 answ:char; 10 T:PTOC; 11 SData:PWritePageParameters; 12 begin 13 Output:=New(PATAPIDevice,Init(DRV_MASTER,1,NORESET_DRIVE)); 14 Output^.RegisterIntHandler($0E); 15 Output^.RequestSense; 16 Getmem(Data,$8000); 17 Output^.ReadDiscInformation(Data^,$8000); 18 WTrackNr:=PDiscInformation(Data)^.LastTrackInLastSession; 19 20 Output^.ReadTrackInformation(Data^,RTI_TRACK,WTrackNr,$8000); 21 with PTrackInformation(Data)^ do 22 begin 23 if ((TrackType and $40)=0)or((NWAValid and 1)=0) then 24 begin 25 writeln('Cannot write to CD. Closed ? Broken ?'); 26 Halt; 27 end; 28 29 DataSize:=BigEndianLongint(FreeBlocks)*MAX_CDDADATABLOCK; 30 if DataSize>0 then 31 begin 32 writeln('Disc is not full yet.'); 33 writeln('Last possible WAV file size: ',DataSize); 34 DataSize:=DataSize div (44100*4); 35 write('Max. tracktime: ',DataSize div 60,':'); 36 if (DataSize mod 60)<10 then write('0'); 37 writeln(DataSize mod 60); 38 write('Really close this CD ?'); 39 readln(answ); 40 41 if UpCase(answ)='N' then 42 begin 43 Dispose(Output,Done); 44 Halt; 45 end; 46 end; 47 end; 48 Freemem(Data,$8000); 49 50 51 write('Init fixate: '); 52 Getmem(SData,MAX_SENSEBUFFER); 53 54 55 Output^.ModeSense(0,$05,SData^,Size); 56 with SData^ do 57 begin 58 TestFlagWriteType:=$00+$01; 59 MSFPCopyTrackMode:=0+0+0+0; 60 DataBlockType:=$00; 61 HostApplicationCode:=0; 62 SessionFormat:=0; 63 PacketSize:=0; 64 AudioPauseLength:=BigEndianWord(150); 65 FillChar(MediaCatalogNumber,Sizeof(MediaCatalogNumber),0); 66 FillChar(InternationalStandardRecordingCode, 67 SizeOf(InternationalStandardRecordingCode),0); 68 FillChar(SubHeader,Sizeof(SubHeader),0); 69 end; 70 71 if not Output^.ModeSelect(SData^,Size) then 72 begin 73 writeln('failed.'); 74 Freemem(SData,MAX_SENSEBUFFER); 75 Dispose(Output,Done); 76 Halt; 77 end; 78 Freemem(SData,MAX_SENSEBUFFER); 79 writeln('successful.'); 80 81 82 Output^.CloseTrackSession(CTST_SESSION,0,true); 83 while (Output^.GetStatus and AST_BSY)>0 do; 84 if (Output^.GetStatus and AST_CHECK)=0 then 85 begin 86 write('Closing CD ... This takes about 2 minutes ... '); 87 while not Output^.TestUnitReady do; 88 write(' completed.'+#10+#13+'Ejecting ... '); 89 Output^.StartStopUnit(true,false,true); 90 writeln('done.'); 91 end else 92 begin 93 writeln('Fixation failed.'); 94 Output^.RequestSense; 95 writeln('Sensekey: ',Output^.SenseBuffer^.ILISenseKey); 96 writeln('ASC: ',Output^.SenseBuffer^.ASC); 97 writeln('ASCQ: ',Output^.SenseBuffer^.ASCQ); 98 end; 99 Dispose(Output,Done); 100 end. 101

Noch kein Kommentar vorhanden

Dieses Snippet kommentieren

Name *  

E-Mail (wird nicht angezeigt) *    

Website  

Kommentar *  

Sicherheitscode Sicherheitscode *    

RSS