» »

[C/C++] Branje sektorjev

[C/C++] Branje sektorjev

goranv ::

Kako se napiše program v C-ju ali C++ za branje sektorjev na disku?
  • spremenilo: snow ()

kekz ::

Sam običajno ne moreš direktno čarati po disku. Za dostop do diska skrbi driver, to je del operacijskega sistema. Torej moraš v vsakem OSu za branje sektorjev iz kateregakoli programskega jezika klicati nek sistemski servis. To je torej OS dependent.
Nisi napisal za kateri OS te zanima.

Načeloma velja celo za DOS (ki niti ni pravi OS). Tam je šlo branje diska skozi bios in preko interruptov.
Na VMS je šlo preko sistemskega servisa QIO s podano funkcijo IO$_READLBLK (read logical block).
itd.

BlueRunner ::

UNIX/Linux:
Tukaj je vse datoteka in tako tudi lahko dostopaš do "surovih" sektorjev na disku. Linux ima tako npr. datoteke /dev/hda, /dev/sda, ... Samo datoteko lahko bereš kar z običajnimi read klici, paziti pa moraš, da je tvoje branje poravnano na sektorje. To pa pomeni, da boš moral pred branjem tako, ali pa drugače ugotoviti velikost enote, ki jo bereš, kot tudi velikost sektorja na posamični enoti. Verjetno je samoumevno, da moraš imeti za takšno branje datoteke najvišji nivo dostopa do sistema (root). Iskanje ustreznih datotek v /dev in velikosti sektorja pri posamezni enoti je odvsino od konkretne inkarnacije sistema, pod Linux jedrom 2.6.x pa si lahko izdatno pomagaš s sysfs, za malo bolj univerzalno rešitev pa boš moral verjetno preveriti in uporabiti različne ioctl klice (verjetno ti bo najbolj pomagal DIOCGMEDIASIZE).

Windows NT:
Tudi tukaj je marsikaj predstavljeno kot datoteka, res pa je, da teh datotek ne najdeš na "običajnem" datotečnem sistemu. Datoteke so tako poimenovane npr. "\\?\Devices\Harddisk0\Partition0", "\\?\Devices\Harddisk1\Partition2", ... Poimenovanje je tukaj neodvisno od tipa diska (IDE, SCSI, ...) ali strukture particijske tabele (običajna part. t., ali pa dinamična tabela). Diski se začno številčiti pri 0, particije pa pri 1. Particija 0 je "virtualna", ker je dejansko povezava na datoteko DR0, od koder se bere celotno vsebino diska (od sektorja 0 naprej). Kako so datoteke razvrščene, in kje se nahajajo, si lahko tudi sam pogledaš s programčkom WinObj, ki je del Platform SDK-ja, ločeno pa ga dobiš tudi na SysInternals. Tudi tukaj velja, da lahko bereš samo, če imaš ustrezen pristop do sistema, in, če so vse operacije poravnane na sektorje. Velikost sektorja v B pa najhitreje izveš direktno z API-jem DeviceIoControl(IOCTL_DISK_GET_DRIVE_GEOMETRY).

Če pa potrebuješ še za kakšen sistem, pa kar povej :)

kunigunda ::

Vcas smo to z interapti pocel, sam zdej ne vem ce Windowsi dovoljo to.

Kle mas neki na to temo. Interrupts

kekz ::

Pri spodobnih OS-ih dostop do diska ni več čez BIOS. Torej interrupti odpadejo ;)

yeti ::

Resolvaš iz mount pointa (npr C:\) v volume mount point, potem se izvoli igrati z ReadFile in WriteFile, na int 13 pa kar pozabi :D

Tule imas malo moje kode, ne da se mi delat sampla, odprto je z read only, izvoli si popravit, za okus bo dovolj:

struct VOLHANDLE
{
char mount[MAX_PATH];
char volname[MAX_PATH];
};

bool resolvemount(VOLHANDLE *hvolume, const char *mount)
{
if(!GetVolumeNameForVolumeMountPoint(mount, hvolume->volname, MAX_PATH))
return false;

return true;
}

bool openvolume(VOLHANDLE *hvolume)
{
hvolume->hVolume = CreateFile(hvolume->volname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if(INVALID_HANDLE_VALUE == hvolume->hVolume)
return false;

return true;
}

Zgodovina sprememb…

  • spremenil: yeti ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Backup SW za Windows okolje

Oddelek: Programska oprema
353574 (2684)          
»

Samba hitrost

Oddelek: Pomoč in nasveti
132547 (1907) e-marko
»

[c] Enaki datoteki

Oddelek: Programiranje
71013 (873) Spura
»

[VC++] Uporaba INI fajla v isti mapi kot exe ?

Oddelek: Programiranje
121239 (1093) Person
»

winxp in linux izmenjava datotek

Oddelek: Operacijski sistemi
71517 (1418) grozni

Več podobnih tem