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.
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.
bez windowsa jak mówisz to trudno będzie.
Ale jakbyś chciał pod winą to masz sterowniki ASPI.
Jezeli dalej nie wiesz jak odczytać sektory CD to napisz do mnie (email: m_twardy@interia.pl) podając swój adres a odpiszę jak to się robi (nie jest to trudne).
Twardy: napisz na forum to moze tez sie zegos naucze i inni
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.
albo createfile \.\\cdrom0 a potem readfile ile bajtów itp
Tak, ale tylko w systemie opartym na NT