Windows - Az NTFS fájlrendszer programozói megközelítésben - Reparse Points

NTFS programozása 5. rész

Cikksorozatunk zárásaként egy speciális NTFS tulajdonságról tárgyalunk, a reparse point-okról. Arról, hogy hol jelennek meg a Windows-ban illetve a fájlrendszerben. Példaként megnézzük, hogy miként érhető el a felhasználói felületről és programokból egyaránt egy - a Unix rendszerekben is meglévő - funkció, mely szintén erre az NTFS szolgáltatásra épül.
A Reparse Points kifejezést újraelemző pontoknak lehetne fordítani, de ez sem árul el többet a működéséről, ezért maradunk inkább az eredeti angol kifejezés mellett.
Lényege, hogy egy fájlhoz vagy mappához egy a felhasználó által meghatározott adatblokk kapcsolható, tartalmára vonatkozóan nincsenek előírások, de mérete maximum 16 kB lehet. Nem jelenik meg fájlként, azonban jelen van a merevlemezen, beépülve a fájlrendszerbe, jelenlétét helyfoglalásával mérhetjük. Amikor egy alkalmazás megnyitja a reparse point-tal ellátott fájlt vagy mappát, elsőként az adatblokk tartalma olvasódik be és a benne foglaltak szerint folytatódik a megnyitási művelet. Általában a fájlstruktúrát megjelenítő szűrőket szoktak definiálni.
A szűrők az eszközmeghajtók kategóriájába sorolhatók és a fájlrendszer magasabb szintjén állnak, közel az alkalmazási réteghez. Köztes elhelyezkedésüknek megfelelően alkalmasak a programok és a fájlrendszer közötti I/O műveletek ellenőrzésére és megváltoztatására. Lehetséges az adatok menet közbeni módosítása vagy egyéb programok elindítása.
Egyik alkalmazási példa az EFS titkosítás. A merevlemezen tárolt információ egy részét vagy egészét saját kulcsunkkal kódoljuk, de mindent ugyanúgy használhatunk tovább, mint előtte: indíthatunk programokat, olvashatunk dokumentumokat. Mi történik a háttérben? Megnyitunk egy kódolt állományt, először a reparse point által meghatározott adat töltődik be, ami elvégzi a dekódolást és csak ezután folytatódik a fájl tényleges megnyitása.
Nem okoz lassulást a reparse point-ok használata?
De igen, minden esetben, bár meg kell jegyezni, hogy ez erősen függ attól, hogy milyen műveletet kell végrehajtani a megnyitás előtt. Ezzel kapcsolatban nézzünk meg egy másik alkalmazási területet: Unix rendszerekben nincsenek meghajtó betűjelek. Egyik ok, hogy korlátozott számban állnak rendelkezésre (az angol ábécé 26 betűjét használhatjuk) másik, hogy jelentősen csökkenhet az egész fájlrendszer áttekinthetősége (ha leülünk egy ismeretlen gép elé nem biztos, hogy azonnal rájövünk, mit rejt a K: vagy az U: meghajtó). Ehelyett egyetlen mapparendszer van és a különböző partíciók almappaként jelennek meg. Például a C:\CDROM mappa tulajdonképpen a CD meghajtóra mutat. Ha van benne lemez, akkor látjuk a tartalmát, ha nincs, akkor üresnek látszik a mappa. Az elnevezéseket (pl.: C:\CDROM) mi határozhatjuk meg, így lehetőség nyílik az adott struktúrának leginkább megfelelő mapparendszer kialakítására, amiben pusztán a könyvtárnevek alapján egyértelműen behatárolható, hogy milyen kötetek, merevlemezek vagy egyéb tárolók alkotnak rendszert.
Reparse point-okat mi magunk is készíthetünk, de ehhez szükséges az NTFS fájlrendszer részletes, nagyon mély ismerete, bármiféle kísérletezés esetén fennáll a teljes adatvesztés lehetősége. Ezen okokból kifolyólag a Microsoft nem ajánlja, hogy bárki nekiálljon. Helyette rendelkezésre állnak API függvények és a Windows Scripting Host (WSH) lehetőségei a meglévők programból történő használatára.
Nézzük meg, hogy a kötetek fent leírt csatlakoztatását (mount), hogy lehet programozási eszközökkel megvalósítani. A felhasználók számára rendelkezésre áll egy barátságos eszköz a Vezérlőpult > (Teljesítmény és karbantartás) > Felügyeleti eszközök > Számítógép-kezelés (Control Panel > (Performance and Manintenance) > Administrative Tools > Computer Management) konzoljának "Lemezkezelés" ("Disk Management") részében. Hogy miért barátságos? Indítsunk el egy parancssori ablakot és írjuk be:
mountvol /?
Megjelenik a csatlakoztatást végző segédprogram. Látható, hogy az egyes kötetekre GUID számuk alapján kell hivatkozni. Máshogy nem is nagyon lehet, mert meghajtó betűjelek még nem vagy már nem tartozhatnak hozzájuk.
Szerencsére a csatlakoztatható eszközök GUID számokkal együtt megjelennek a lista végén, így kicsit könnyebbé téve a felhasználó életét. Programokból a következő függvény meghívásával érhetők el a GUID-ok:

TCHAR szUniVolName[1024];
GetVolumeNameForVolumeMountPoint(
   szVolToMount, szUniVolName, 1024)
Visszatérési érték sztring típusú és formátuma megegyezik a mountvol által elvártakkal:
\\?\Volume{GUID}
Ezután már csak a csatlakoztatást kell elvégezni:
SetVolumeMountPoint(szMountVol, szUniVolName)
A csatlakoztatás megszüntetése az alábbi függvénnyel lehetséges:
DeleteVolumeMountPoint(VolumeMountPoint)

Az NTFS fájlrendszer programozói megközelítésben cikksorozat