Táblázat deszkriptorok kernel objektum
Ugyanakkor, a funkciókat, hogy hozzon létre felhasználói objektumok vagy a GDI, van egy paramétert
PSECURITY_ATTRIBUTES, és példa erre - a funkció CreateIcon
HICON CreateIcon (HINSTANCE hinst. Int nWidth,
int nHeight, BYTE cPlanes, BYTE cBitsPixel,
CONST BYTE * pbANDbits, CONST BYTE * pbXORbits);
3-1 táblázat azt mutatja, hogy a fogantyú táblázat, amely tartozik a folyamat, mint látható, ez csak egy sor adatszerkezetek Minden szervezet egy mutatót tartalmaz valamilyen kernel objektum hozzáférési maszk, és néhány zászlók
Ha át egy érvénytelen index (leíró), a funkció nem működik, és GetLastError visszatér 6 (ERROR_INVALID_HANDLE). Ez annak a ténynek köszönhető, hogy a ténylegesen fogantyúk kódok a táblázatban, az értékek kötődnek egy adott folyamat, és nedeyovitelny más folyamatokban.
Ha a funkció hívás, ami a kernel objektum sikertelen, akkor rendszerint visszatér 0 (NULL). Egy ilyen helyzet csak akkor lehetséges, ha a kritikus hiánya memória, vagy ha problémái vannak védelmet. Sajnos néhány funkció visszatér az ilyen esetekben ne 0 és -1 (INVALID_HANDLE_VALUE) Például, ha CreateFile nem tudja megnyitni a megadott fájlt, akkor visszaadja INVALID_HANDLE_VALUE. legyen nagyon
óvatos, amikor ellenőrzi a visszatérési értéke egy függvény, amely létrehoz egy kernel objektumot. Így CreateMutex ellenőrizze INVALID_HANDlE_VALUE értelmetlen:
FOGANTYÚ hMutex = CreateMutex (.);
if (hMutex == lNVALID_HANDLE_VALUE)
// ez a kód nem indul el, mint
// hibát jelez, amikor CreateMutex NLlLL
Hasonlóképpen, értelmetlen, és az alábbi kódot:
Kézirádiója hFile = CreateFile (.); if (hFile - NULL>
// és ezt a kódot nem indul el, mint
// visszatér, ha hiba CreateFile lNVALID_HANDLE_VALUE (-1)
Zárás kernel objektum
Nem számít, hogy létrehoz egy kernel objektum után vele dolgozni kell hívni CloseHandle zakrp
BOOL CloseHandle (fogantyú hobj);
Ez a funkció az első ellenőrzi asztal jellemzőket tartozó hívó folyamat, hogy megbizonyosodjon arról, hogy meghatározza, hogy az átadott index (leltár
Ha a fogantyút a hitetlenek, van egy két dolgot. A normál végrehajtási mód CloseHandle folyamat visszatér HAMIS, a GetLastError - kód
ERROR_INVALID_HANDLE. De amikor a folyamat debug módban a rendszer egyszerűen értesíti hiba debugger.
Mielőtt a CloseHandle visszatérő vezérlés törli a rekordot a táblázatból deszkriptorok: a leíró tspsr érvényes a folyamatot, és nem tudja használni. Ebben az esetben a bejegyzés törlésre függetlenül attól, hogy az objektum megsemmisül a kernel, vagy sem! Miután felhívta CloseHandle már nem férnek hozzá this-
mu objektum kernel; de ha a számlálót nem nullázza, a tárgy marad a memóriában minden normális, egyszerűen azt jelenti, hogy az objektum által használt másik folyamat (vagy folyamatok). Amikor a többi folyamat teljes munkájukat ezzel tárgy (is hívja CloseHandle), akkor meg kell semmisíteni.
Mi van, ha elfelejtettem felhívni CloseHandle - akár a memória szivárgás? Nos, igen és nem. Erőforrás szivárgás (azonos rendszermag objektum) nagyon is lehetséges, míg a folyamat még mindig fut. Azonban befejezésekor a folyamat az operációs rendszer garantálja, hogy enyhíti az összes tulajdonában lévő erőforrások a folyamat, és abban az esetben, kernel objektumok működik: amikor a folyamat befejeződött vizsgál az asztalnál jellemzők és zárja be a nyitva kezeli.