Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako da direktno čitam sektore sa diska?

[es] :: Pascal / Delphi / Kylix :: Kako da direktno čitam sektore sa diska?

[ Pregleda: 2295 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

terence

Član broj: 78133
Poruke: 10
*.pat-pool.le.sbb.co.yu.

ICQ: 104200400


Profil

icon Kako da direktno čitam sektore sa diska?30.08.2006. u 22:36 - pre 213 meseci
Jednostavno treba mi da pročitam određene sektore sa diska (FAT tabela i sl.) i da malo "prelistam" fajlove

Kod koji to radi bi trebalo ovako da izgleda:

var
handle,hFile: THandle;
lpBuffer: array [0..255] of char;
lpNumberOfBytesRead: Cardinal;
begin
handle:=CreateFile(PAnsiChar('\\.\C:'), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
if handle=INVALID_HANDLE_VALUE then
raise Exception.Create('Invalid handle!');

SetFilePointer(handle,0,nil,FILE_BEGIN);
if ReadFile(handle, lpBuffer, SizeOf(lpBuffer), lpNumberOfBytesRead, nil) then
begin
lpBuffer[lpNumberOfBytesRead]:=#0;
ShowMessage(String(lpBuffer));
end;
CloseHandle(handle);

On otvara handle, ali pri čitanju uporno dobijam 0 bajtova pročitanih.
Zna li neko zašto?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako da direktno čitam sektore sa diska?31.08.2006. u 00:12 - pre 213 meseci

> Jednostavno treba mi da pročitam određene sektore sa diska (FAT tabela i sl.) i da malo "prelistam" fajlove

Pokušaj sa \\.\PhysicalDrive0.

> CreateFile(PAnsiChar('\\.\C:'), GENERIC_READ,

Stavi GENERIC_READ or GENERIC_WRITE.

SetFilePointer(handle,0,nil,FILE_BEGIN);
if ReadFile(handle, lpBuffer, SizeOf(lpBuffer), lpNumberOfBytesRead, nil) then

Ako ove funkcije ne uspeju stavi RaiseLastWin32Error kako bi video tačan razlog.

> On otvara handle, ali pri čitanju uporno dobijam 0 bajtova pročitanih.
> Zna li neko zašto?

Za neke od tih stvari program mora imati admin prava.
 
Odgovor na temu

terence

Član broj: 78133
Poruke: 10
*.le.sbb.co.yu.

ICQ: 104200400


Profil

icon Re: Kako da direktno čitam sektore sa diska?31.08.2006. u 12:28 - pre 213 meseci
PhysicalDrive je sinonim za isto, pa je i greška koju prijavljuje ista
Probao sam sa RaiseLastOSError (RaiseLastWin32Error je zastarelo) i oba pokazuju
'The parameter is incorrect' nakon izvršenja ovog dela.

Znači FileRead i ReadFile javljaju isti problem i to samo kad se čita sa drajva.
Čitanja iz fajla je besprekorno.

Evo dela koda:

lpNumberOfBytesRead:=FileRead(handle, buff, 255);
if lpNumberOfBytesRead<>$FFFFFFFF then
begin
lpBuffer[lpNumberOfBytesRead]:=#0;
ShowMessage(String(lpBuffer));
end

U attachmentu imate source pa probajte sami da to izvedete. Veoma je kratak.
Pritiskom na dugme start aktivira se čitanje prvih 255 bajta i javi grešku odmah
else
RaiseLastOSError();
Prikačeni fajlovi
 
Odgovor na temu

obucina

Član broj: 38191
Poruke: 723

Jabber: obucina


+7 Profil

icon Re: Kako da direktno čitam sektore sa diska?31.08.2006. u 14:24 - pre 213 meseci
lpNumberOfBytesRead:=FileRead(handle, buff, 255);
if lpNumberOfBytesRead<>$FFFFFFFF then
begin
lpBuffer[lpNumberOfBytesRead]:=#0;
ShowMessage(String(lpBuffer));
end

Funkcije koje koristis poticu iz SysUtils.pas, a tebi trebaju f-je iz Windows.pas

lpNumberOfBytesRead:=FileRead(handle, buff, 255);

zamenis sa

Windows.ReadFile(handle, buff, 255, lpNumberOfBytesRead, nil);

I citanje prodje bez greske, ali ti ne vrati nista... lpNumberOfBytesRead je 0. Drugo, citas u buff, a prikazujes lpBuffer.
 
Odgovor na temu

terence

Član broj: 78133
Poruke: 10
*.pat-pool.le.sbb.co.yu.

ICQ: 104200400


Profil

icon Re: Kako da direktno čitam sektore sa diska?31.08.2006. u 18:21 - pre 213 meseci
Odgovorili su mi.
Greška je bila što sam dok sam eksperimentisao učitavao necelobrojne količine *512.
Čim sam stavio n*512 radilo je.
Inače buff sam stavio umesto lpBuffer kada mi je javljao problem sa parametrima pa sam probao drugačije parametre.

Takođe, naveo sam da sam probao i jednu i drugu ReadFile i FileRead da smanjim broj parametara smatrajući da mi je neki parametar problematičan.
ReadFile je korišćen u početku ali je stavljen u komentare, kao što možeš da primetiš

hvala
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako da direktno čitam sektore sa diska?31.08.2006. u 18:48 - pre 213 meseci
> PhysicalDrive je sinonim za isto,

Razlikuju se, jedan daje handle čitavog diska a drugi samo particije.
 
Odgovor na temu

terence

Član broj: 78133
Poruke: 10
*.le.sbb.co.yu.

ICQ: 104200400


Profil

icon Re: Kako da direktno čitam sektore sa diska?01.09.2006. u 07:29 - pre 213 meseci
Tačno.
Loše sam se izrazio želeći da potenciram da mi oba parametra nisu radila zanemarujući na suptilnu razliku drive i logical drive, kad nije htelo da čita.

A kad funkcioniše, razlika postaje nebo i zemlja.

Hvala na primedbama, preciznost je bitna, a i na pomoći
 
Odgovor na temu

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Re: Kako da direktno čitam sektore sa diska?01.09.2006. u 07:31 - pre 213 meseci
Da se nadovezem na ovaj problem jednim svojim... <postovao sam ranije temu, ali nisam dobio odgovor na to> Dakle radi se o tome da mi treba programcic koji ce da cita sve greske na odredjenim sektorima na disketi, te podatke sacuva negde u nekoj datoteci, a ja na osnovu podataka iz datoteke da mogu da te iste greske na istim sektorima namerno napravim na nekoj drugoj disketi... E sad kako sve to odraditi...?
Nadam se da ste me razumeli...
Molim da se post ne brise ako malo odstupa od teme <nadam se da nece i da ne odstupa>
Pozdrav, citamo se...
 
Odgovor na temu

terence

Član broj: 78133
Poruke: 10
*.le.sbb.co.yu.

ICQ: 104200400


Profil

icon Re: Kako da direktno čitam sektore sa diska?01.09.2006. u 12:36 - pre 213 meseci
Da rezimiram, možda nekom zatreba rešenje, sledeća procedura lepo radi:
poziv: GetSectors('\\.\F:',0,nSectorsToRead,lpBuffer);

Kažete koji startni sektor hoćete, koliko da pročita i gotovo...
E sada neobično je da mi nije radilo bez FILE_SHARE_READ or FILE_SHARE_WRITE
Znači samo FILE_SHARE_READ nije htelo što inače prvo pada na pamet.


procedure TForm1.GetSectors(FileName: String; Start, Number: Cardinal; Buffer: Pointer);
var
handle: THandle;
nBytesToRead, lpNumberOfBytesRead: Cardinal;
dwPointer: Cardinal;
begin
nBytesToRead:=512*Number;

handle:=CreateFile(PAnsiChar(FileName), // filename
GENERIC_READ, // open for reading
FILE_SHARE_READ or FILE_SHARE_WRITE, // share read or write obavezno!
nil, // no security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
0); // no attr. template
if handle=INVALID_HANDLE_VALUE then
raise Exception.Create('Invalid handle!');

dwPointer:=SetFilePointer(handle,Start,nil,FILE_BEGIN);
if dwPointer = $FFFFFFFF then
raise Exception.Create('Invalid set!');

if not ReadFile(handle, Buffer, nBytesToRead, lpNumberOfBytesRead, nil) then
raise Exception.Create('Invalid Read!');
// RaiseLastOSError();

CloseHandle(handle);
end;
 
Odgovor na temu

terence

Član broj: 78133
Poruke: 10
*.le.sbb.co.yu.

ICQ: 104200400


Profil

icon Re: Kako da direktno čitam sektore sa diska?01.09.2006. u 12:42 - pre 213 meseci
Citat:

Dakle radi se o tome da mi treba programcic koji ce da cita sve greske na odredjenim sektorima na disketi, te podatke sacuva negde u nekoj datoteci, a ja na osnovu podataka iz datoteke da mogu da te iste greske na istim sektorima namerno napravim na nekoj drugoj disketi


Sumnjam da si se dobro izrazio...
Verovatno si mislio na kloniranje bad sektora koje se koristi pri zaštiti od kopiranja.

 
Odgovor na temu

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Re: Kako da direktno čitam sektore sa diska?01.09.2006. u 14:51 - pre 213 meseci
Da, upravo na tako nesto...
 
Odgovor na temu

terence

Član broj: 78133
Poruke: 10
*.pat-pool.le.sbb.co.yu.

ICQ: 104200400


Profil

icon Re: Kako da direktno čitam sektore sa diska?01.09.2006. u 19:17 - pre 213 meseci
Well, po onome što ja znam o tome je da ne možeš da upišeš bad sector. Šta god ti upišeš predstavlja validan podatak. Bad sector se javlja kada se disketa zezne fizički i onda provera pomoću checksum-a prijavljuje da je došlo do greške. Nešto slično parity bitu u memoriji kompjutera. Mi ne možemo upisati pogrešan podatak u memoriju računara na koju će ovaj parity bit da reaguje. Bar ne pomoću standardnih poziva koje je propisao proizvođač, a ne vidim ni razlog da uopšte postoje takve procedure. To je jednostavno za detekciju fizičkih grešaka.

E sada, fazon je bio u tome da se fizički oštete neki sektori, i onda se to nije moglo kopirati pomoću standardnih metoda. Eventualno, kako pri formatiranju diskete sistem formira spisak bad sektora koje upisuje na disketu da bi ih preskakao pri radu, zaštita može da iskoristi taj spisak. Međutim, u tom slučaju ne vidim zašto takvu "ispravnu" disketu ne bi diskdupe duplikatori disketa lako prekopirali?
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Kako da direktno čitam sektore sa diska?

[ Pregleda: 2295 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.