Jak w C przeczytac sektor po sektorze np z dyskietki zeby pozniej moc zapisac je do pliku tworzac "obraz napedu" ??
najlepiej przerwaniem asemblera, bo innego sposobu odczytania bootsektora nie znam :)
ehhh.... wolałbym to jakos zrobic bez uzycia asm i winapi :(
po prostu otwórz plik "\\.\A:" i czytaj z niego paczkami 512 albo 1024... bajtów
błędu nie wywala, jak dyskietki nie ma w napędzie to odczytasz same zera
Na partycji C odczytasz nawet bootsector
// ciekawostka, daj to koniecznie do faq [mf]
hmm pod winda najlepiej uzyc winapi, pod unixem wystarczy read i /dev/fd0 a pod dosem masz przerwanie 13h
sapero napisał(a)
po prostu otwórz plik "\\.\A:" i czytaj z niego paczkami 512 albo 1024... bajtów
błędu nie wywala, jak dyskietki nie ma w napędzie to odczytasz same zeraNa partycji C odczytasz nawet bootsector
// ciekawostka, daj to koniecznie do faq [mf]
u mnie pod Win XP bez zadnych SP ten sposób nie dziala. uzywam delphi 7, funkcji fileopen, fileseek i fileread a potem wrzucam kody poszczegolnych zczytanych znakow do memo. Implementuje to '\.\C:' bo nie mam stacji dyskietek w laptopie. w memo mam same 0
nie wierzysz to zobacz http://people.freenet.de/sapero/readsector.png
\\.\PHYSICALDRIVE0 pokazuje coś innego
dziala :) "chyba dobrze" tylko mam jeszcze dwa pytanie:
- dlaczego tak sie podaje sciezke do floppa ?? :|
- czemu mam czytac po np:512 bajtow ?? przieciez rownie dobrze moge bajt po bajcie odczytywac i potem do pliku do zapisywac :)
Sapero [browar] --- dzieki za pomoc :)
w opisie ReadFile pisze że bufor odczytu musi być wielokrotnością wielkości sektora danego woluminu, ale nie dotyczy to dysków twardych
cóż to jest 512 bajtów? Tyle co 2 stringi :)
a \.\ oznacza samo Device, czyli nie sam nośnik
na win9* trzeba inaczej:
DIOC_REGISTERS reg
char buffer[512]
int head, cyinder, sector
head = 0
cyinder = 0
sector = 0
// head = 0 for head 0 or 0x0100 for head 1
hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0,FILE_FLAG_DELETE_ON_CLOSE, NULL)
reg.regEAX = 512 //wielkość bufora
reg.regEBX = &buffer
reg.regECX = cylinder<<8 + sector
reg.regEDX = head
reg.regFlags = 0x0001
fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_INT13, & reg, 28, & reg, 28, & byteCnt, NULL)
cylinder, head i sector musisz podać
SEEK file,512*((sector-1)+(cylinder18)+(head80*18))
a co do tego '-1' przy sektorze - nie ja ten wzór pisałem
może bardziej czytelny kod na codeguru
& reg i & byteCnt sklej bo sie zmienia na (R)
oki... teraz juz wszystko kumam :)) potrzebowalem tego do zrobienia programu zaliczeniowego ..... dodam moze jeszcze jakąs prosta kompresje && szyfrowanie :P
sapero napisał(a)
nie wierzysz to zobacz http://people.freenet.de/sapero/readsector.png
\\.\PHYSICALDRIVE0 pokazuje coś innego
to akurat dziala, zwrocilo mi pare krzaczkow + napis "LILO" wiec jestem pewien ze dziala :) natomiast \.\C: mi nie dzialalo :(