Odczyt sektora z płyty CD

0

Jak w temacie...

Niestety, nie wiem jak to zrealizować... Może przytoczy ktoś jakiś przykład w Delphi lub WinAPI.

Pisze program do odczytu danych z CD-ROM z pominięciem windowsa i utknełem na dobre

pozdro
.TSD.

0

bez windowsa jak mówisz to trudno będzie.
Ale jakbyś chciał pod winą to masz sterowniki ASPI.

0

Jezeli dalej nie wiesz jak odczytać sektory CD to napisz do mnie (email: [email protected]) podając swój adres a odpiszę jak to się robi (nie jest to trudne).

0

Twardy: napisz na forum to moze tez sie zegos naucze i inni

0

Oto sposób odczytania sektorów CD (jeden sektor to 2048 bajtów), na przykładzie mojego programu ( w Borland Pascalu):

Program ReadCD;

Uses WinProcs,WinTypes;

{$D Copyright (C) Twardy}

Type
   PRMCS = ^TRMCS;
   TRMCS = record
    edi, esi, ebp, RESERVED, ebx, edx, ecx, eax:Longint;
    wFlags, es, ds, fs, gs, ip, cs, sp, ss:Word;
   End;

   TDriveInfo = record
    Drive: byte;
    NumHeads,
    NumCyls,
    SectPerTrack,
    SectPerCyl: Word;
    AllCyl:Longint;
   End;

Const
   CD_SECTOR_SIZE = 2048;
   CARRY_FLAG = $0001;




Function MAKEWORD(bLow,bHigh: Byte):Word; assembler;
asm
 mov ah,bHigh
 mov al,bLow
End;

Function SimulateRM_Int (bIntNum: Byte ;lpCallStruct:PRMCS):Boolean;  assembler;
asm
 push di
 mov  ax,0300h
 mov  bl,bIntNum
 mov  bh,01h
 xor  cx,cx
 les  di,lpCallStruct
 int  31h
 jc @END1
 mov ax,01h
@END1:
 pop di
End;


Function ReadCD (Drive: Byte; dwStartSector: Longint; lpBuffer:Pointer):Boolean;

Var gdaBuffer:Longint;
    RMlpBuffer:Longint;
    PMlpBuffer:Longint;
    callStruct:TRMCS;
    s:string;

Begin
 ReadCD:=False;

 gdaBuffer := GlobalDosAlloc (CD_SECTOR_SIZE);
 RMlpBuffer := MAKELONG(0, HIWORD(gdaBuffer));
 PMlpBuffer := MAKELONG(0, LOWORD(gdaBuffer));

 FillChar(callStruct,SizeOf(callStruct),0);

 callStruct.eax :=$1508;
 callStruct.ebx := LOWORD(RMlpBuffer);
 callStruct.es  := HIWORD(RMlpBuffer);
 callStruct.ecx := Drive;
 callStruct.edx := 1;

 callStruct.esi :=HIWORD(dwStartSector);
 callStruct.edi :=LOWORD(dwStartSector);

 If SimulateRM_Int($2F,@callStruct) then
  If (callStruct.wFlags and CARRY_FLAG)=0 then begin
   Move(Pointer(PMlpBuffer)^,lpBuffer^,CD_SECTOR_SIZE);
   ReadCD:=True;
  End else begin
   Str(callStruct.wFlags,s);
   S:=Concat('Error: ',S);
   MessageBox(0,PCHAR(@s[1]),'Błąd odczytu dysku',MB_OK or MB_ICONHAND);
  End;
 GlobalDosFree(LOWORD(gdaBuffer));
End;


Var Buf:array[1..CD_SECTOR_SIZE]of byte;
    Plik:File;
Begin
 Assign(Plik,'Data.dat');
 Rewrite(Plik,1);
 if not ReadCD(4,7+16,@BUF) then begin
  Close(Plik); Erase(Plik); Exit;
 End;
 BlockWrite(Plik,Buf,SizeOf(Buf));
 Close(Plik);
 messagebox(0,'Odczyt sektora powiódł się','Informacja',MB_OK or MB_ICONASTERISK);
End.

Program odczytuje 7 esktor CD i zapisuje go do pliku Data.dat.
UWAGA! Napisałem numer sektora do odczytu 7+16. Nie wiem dlaczego pierwszy odczytany sektor zaczyna się od nr 16.

0

albo createfile \.\\cdrom0 a potem readfile ile bajtów itp

0

Tak, ale tylko w systemie opartym na NT

1 użytkowników online, w tym zalogowanych: 0, gości: 1