3. fejezet kernel objektumok
ha (pWideCharStr == NULL) visszatérő (Fok);
// átalakítani a karakterláncot nultibaytovuyu shirokosimvolnuyu
MultiByteToWideChar (CP_ACP, 0, pMulti8yteStr, -1, pWideCharStr, nLenOfWideCharStr);
// hívás shirokosimvolnuyu változata a funkció a munkák elvégzésével
// átalakítani vissza a húr shirokosimvolnuyu multibyte
WideCharToMultiByte (CP_ACP, 0, pWideCharStr, -1, pMultiByteStr, strlen (pMultiByteStr), NULL, NULL);
// felszabadítja a lefoglalt memóriát a húr shirokobaytovuyu
HeapFree (GetProcessHeap (), 0, pWideCharStr);
És végül, a header fájlban kapott DLL prototípusai ezeket a funkciókat lenne egy ilyen:
BOOL StringReverseW (PWSTR pWideCharStr);
BOOL StringReverseA (PSTR pMultiByteStr);
#define StnngReverse StringReverseW #else
#define StringRevcrsc StringReverseA #endif // UNICODE
Tanulás Windows API, kezdjük az alapvető objektumok és leírásokat (fogantyú). Ez a fejezet középpontjában egy viszonylag elvont fogalom, azaz a. E. nem megyünk be a sajátosságait az egyes kernel objektumok, úgy az általános tulajdonságait.
Inkább kezdeni valamit, egy kicsit konkrétabb, de anélkül, hogy tudták az alapvető tantárgyak, akkor nem lesz egy igazi profi a fejlesztés a Windows-alapú programok. Ezeket az objektumokat a rendszer által használt, és a menedzsment alkalmazások számos különböző források folyamatok, szálak, fájlokat, és így tovább. D. A fogalmak itt bemutatott fog bekövetkezni az egész könyvet. Ugyanakkor megértem, hogy része anyag ülepszik a fejedben, amíg nem kezdenek dolgozni kernel objektumok valós függvények. És amikor az olvasást a következő fejezetek akkor valószínűleg időről időre visszatérni ebben a fejezetben.
Mi a kernel objektum
Létrehozása, megnyitása és egyéb műveletek a kernel objektumok lesznek az Ön számára, mint a fejlesztő a Windows-alapú alkalmazások, a napi rutin. A rendszer lehetővé teszi, hogy hozzon létre és
működnek többféle tárgyak, beleértve a biztonsági tokeneket
(Hozzáférési token tárgyak), a fájlok (fájl objektumok), a nyúlványok a fájlok (file-objektumokhoz), kikötők IO befejezése (I / O befejezése port objektumok), a munkahely (job objektumok), postaládák (mailslot objektumok), myutsksami ( mutex tárgyak), csatorna (csővezeték objektumok), folyamatok (folyamat objektumok), szemaforok (szemafor objektumok), meneteknél (tárgyak), és
várható időzítő (timer waitable objektumok). Ezek az objektumok jönnek létre Windowsfunktsiyami például CreateFtleMapping hatására a rendszer
objektumot létrehozni "file mapping". Minden kernel objektum - tényleg csak egy blokk memória juttatott a kernel és ahová csak neki. Ez a blokk egy adatstruktúra, amelyben elemek információkat tartalmaznak a tárgy. Egyes elemek (biztonsági leíró, a számláló a felhasználók száma és a többiek.) Jelen vannak minden tárgyban, de a legtöbbjük számára specifikus objektum típusa. Például, az objektum „folyamat” rendelkezik egy azonosítóval, alap prioritás, és kódkiegészítés, és a tárgy „file” - az offset byte, split mód és felfedező módban
Mivel a szerkezet a kernel objektumok csak a kernel, az alkalmazás nem tud önállóan találják meg ezeket a struktúrákat a memóriában, és közvetlenül módosíthatják azok tartalmát a Microsoft bevezetett korlátozás szándékosan bármelyike program nem sérti integritását kernel struktúrák tárgyak. Ugyanez a korlátozás lehetővé teszi a Microsoft, hogy vezessenek be, törölni, vagy szerkeszteni elemei struktúrák ns romboló minden alkalmazást.
De a kérdés: ha nem tudjuk közvetlenül módosíthatja ezeket a struktúrákat, hogyan alkalmazások működnek a kernel objektumok? A válasz az, hogy a Windows
egy sor olyan funkciót, feldolgozása szigorúan meghatározott szabályok kernel objektumok szerkezetét. Kapunk hozzáférést a rendszermag objektumokat csak ezeket a funkciókat. Ha hívja a funkció, amely létrehoz egy kernel objektum, visszatér egy fogantyú, amely azonosítja a létrehozott objektum leíró kell tekinteni, mint a „nem átlátható” érték, amely használható bármely menet a folyamatot. Ez leíró adja át a Windows funkció, mondja a rendszer, amit a kernel kifogást érdekli. De fogunk beszélni később leírásokat (ebben a fejezetben).
A nagyobb megbízhatóság a Microsoft operációs rendszer tette, hogy az értéke leírások függ az adott folyamatot. Ezért, ha át egy értéket (bármely közötti kommunikációs mechanizmus) patak másik folyamat, minden hívást a folyamat leíró kapott értékkel a folyamat, ad egy hiba. De volzuytes, a fejezet végén, nézzük három mechanizmus helyes használatát több folyamatok kernel objektum.
Elszámolása az alapvető felhasználói objektumok
Kernel tárgyak tartoznak a kernel, és nem a folyamat. Más szóval, ha a folyamat meghív egy függvényt, amely létrehoz egy kernel objektumot, majd megszűnik, a kernel objektum nem lehet megsemmisíteni. A legtöbb esetben egy ilyen objektum még mindig meg kell semmisíteni; de ha a kernel kifogást létrehozott egy másik folyamat használja, a kernel fogja tiltani a megsemmisítése a cél, amíg nem hajlandó, és a folyamat is.
A kernel tudja, hány folyamatok használják speciális kernel objektum poskol ku, minden objektumnak számának megjelenítésére a felhasználók. Ez a számláló - az egyik adatelemek, amelyek közösek minden típusú kernel objektumok. A momept készítés számlálóobjektum
1. Ha hozzá van rendelve egy meglévő kernel objektum kezeli más folyamat, a számláló növekszik az 1. Amikor valamelyik folyamat befejeződött, a számlálók minden kernel által használt objektumok őt automatikusan csökken 1. Amint a gróf egy tárgy törlődik, a kernel elpusztítja az objektumot.
Kernel tárgyakat lehet védeni biztonsági leíró (biztonsági leíró), amely leírja, aki létrehozta az objektumot, és kinek van joga hozzáférni. Biztonsági leíró jellemzően írásakor szerver alapú alkalmazások; ami egy kliens alkalmazás, akkor figyelmen kívül hagyja az ingatlan kernel objektumok.
Szinte az összes funkciót, hogy hozzon létre kernel objektumok, hogy egy mutató egy szerkezet
SECURITY_ATTRIBUTES érvként, például:
typedef struct _SECURITY_ATTRIBUTES LPVOID lpSecurityDescriptor; BOOL bInherttHandle; Bár a szerkezet az úgynevezett SECURITY__ATTRIBUTES, csak egy eleme a CC tárgya védelmére - lpSecuntyDescnptor. Ha kell korlátozni a hozzáférést a rendszermag objektum készíts egy biztonsági leíró és kezdeti szerkezet SECURITY_ATTRIBUTES alábbiak szerint: FOGANTYÚ hFileMapping = CreateFileMapping (INVALID_HANDLE_VALUE, sa, PAGE_REAOWRITE, 0, 1024 "MyFileMapping"); Figyelembe véve a tétel bInheritHandle én elhalasztja a szakaszt öröklés, mivel ez az elem semmi köze védelmet. Akarta, hogy hozzáférjen a meglévő kernel objektum (létrehozása helyett egy újat), adja meg, hogy milyen lépéseket szándékozik végezni a tárgy felett. Például, ha akartam olvasni az adatokat a meglévő vetítési fájlt, akkor okozna a funkció OpenFileMapping ezáltal; FOGANTYÚ hFileMapping = OpenFileMapping (FILE_MAP_READ, HAMIS, "MyFileMapping"); FILE_MAPREAD átmegy az első paraméter a függvény OpenFileMapping, Tájékoztatom, hogy amint hozzáférést kapott a vetítési fájlt, elolvasom az adatok is. OpenFileMapping függvény előtt chsm vissza érvényes leíró, ellenőrzi a típus a védelem tárgya. Ha én, mint regisztrált felhasználó, lehetővé teszi a meglévő kernel objektum „file mapping”, OpenFileMapping visszatér egy érvényes leíró. De ha én megtagadták, NULL, és hívja GetLastError ad egy hibakódot 5 (vagy ERROR_ACCESS_DENIED). De ismétlem, a nagy részét a kérelem elleni funkciót nem használjuk, így nem fogok lakni ebben a témában Képzeljük el, hogy ha az alkalmazás futtatásához adatokat olvas néhány registry kulcs, hogy ezt korrekchno, hogy ne okozzon RegOpenKeyEx funkció átadva KEY_QUERY_VALUE értéket, amely lehetővé teszi az olvasási művelet ebben a szakaszban. Ha a fejlesztő egy kis gondolat védelméről és megváltoztatta az értéket KEY_ALL_ACCESS on KEY_QUERY_VALUE (csak-és mindent!), A termék működhetne a két operációs rendszer Emellett kernel objektumok, a program használata más típusú objektumok - menük, ablakok egérkurzorok, ecsetek, és betűtípusok. Arra hivatkoznak, hogy a Felhasználó tárgy vagy GDI új programozási for Windows összezavarodnak próbál különbséget tenni a Felhasználó vagy GDI tárgyak kernel objektumok. Honnan tudod, például, amelynek a tárgya - a Felhasználó vagy mag - ez az ikont? Tudja meg, hogy a tárgy nem tartozik a mag, a legegyszerűbb módja, hogy elemezze a függvényt, amely létrehozza az objektumot. Szinte az összes funkciót, hogy hozzon létre kernel objektumok, van egy lehetőség, hogy adja meg a biztonsági tulajdonságok - mint a