Forum » Programiranje » [C/C++] Branje sektorjev
[C/C++] Branje sektorjev
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.
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
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
Kle mas neki na to temo. Interrupts
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
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;
}
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Backup SW za Windows okoljeOddelek: Programska oprema | 3632 (2742) | |
» | Samba hitrostOddelek: Pomoč in nasveti | 2579 (1939) | e-marko |
» | [c] Enaki datotekiOddelek: Programiranje | 1026 (886) | Spura |
» | [VC++] Uporaba INI fajla v isti mapi kot exe ?Oddelek: Programiranje | 1250 (1104) | Person |
» | winxp in linux izmenjava datotekOddelek: Operacijski sistemi | 1542 (1443) | grozni |