|
[ terence @ 30.08.2006. 22:36 ] @
| 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?
|
[ savkic @ 31.08.2006. 00:12 ] @
> 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.
[ terence @ 31.08.2006. 12:28 ] @
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();
[ obucina @ 31.08.2006. 14:24 ] @
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.
[ terence @ 31.08.2006. 18:21 ] @
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
[ savkic @ 31.08.2006. 18:48 ] @
> PhysicalDrive je sinonim za isto,
Razlikuju se, jedan daje handle čitavog diska a drugi samo particije.
[ terence @ 01.09.2006. 07:29 ] @
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
[ Vladica Savić @ 01.09.2006. 07:31 ] @
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...
[ terence @ 01.09.2006. 12:36 ] @
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;
[ terence @ 01.09.2006. 12:42 ] @
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.
[ Vladica Savić @ 01.09.2006. 14:51 ] @
Da, upravo na tako nesto...
[ terence @ 01.09.2006. 19:17 ] @
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?
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|