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.