Tabel descriptori obiect nucleu
În același timp, funcțiile care creează obiecte utilizator sau GDI, există un parametru de tip
PSECURITY_ATTRIBUTES, și exemplu în acest sens - funcția CreateIcon
HICON CreateIcon (HINSTANCE hinst. Int nWidth,
int nHeight, cPlanes BYTE, BYTE cBitsPixel,
BYTE CONST * pbANDbits, CONST BYTE * pbXORbits);
Tabelul 3-1 prezintă modul în care masa de mâner, care face parte din proces, după cum puteți vedea, este doar o serie de structuri de date Fiecare structură conține un pointer la un obiect nucleu, o mască de acces, și unele steaguri
Dacă treci un index invalid (descriptor), funcția eșuează și GetLastError returnează 6 (ERROR_INVALID_HANDLE). Acest lucru se datorează faptului că de fapt mânere sunt coduri în tabel, valorile lor sunt legate de un anumit proces și nedeyovitelny în alte procese.
Dacă apelul funcției, creând un obiect nucleu nu are succes, atunci returnează de obicei 0 (NULL). O astfel de situație este posibilă numai în caz de lipsă acută de memorie, sau dacă ai probleme cu protecție. Din păcate, unele funcții întoarce în astfel de cazuri, ne 0 și -1 (INVALID_HANDLE_VALUE) De exemplu, în cazul în care CreateFile nu se poate deschide fișierul specificat, îl returnează INVALID_HANDLE_VALUE. fii foarte
atenți atunci când verificarea valorii de returnare a unei funcții care creează un obiect nucleu. Deci, pentru a verifica CreateMutex INVALID_HANDLE_VALUE sens:
MÂNER hMutex = CreateMutex (.);
if (hMutex == lNVALID_HANDLE_VALUE)
// acest cod nu va fi executat
// returnează o eroare atunci când CreateMutex NLlLL
În mod similar, lipsit de sens, și codul de mai jos:
HANDIE hFile = CreateFile (.); în cazul în care (hFile - NULL>
// si acest cod nu va fi executat
// returnează când o eroare CreateFile lNVALID_HANDLE_VALUE (-1)
obiect nucleu închidere
Indiferent de modul în care creați un obiect nucleu, după ce a lucrat cu el trebuie să numim CloseHandle zakrp
BOOL CloseHandle (HANDLE hobj);
Această funcție verifică mai întâi descriptori de masă din procesul de asteptare pentru a vă asigura că identifică dacă indicele trecut (inventar
În cazul în care mânerul necredincioșilor, există una din cele două lucruri. În modul normal de executie proces CloseHandle returneaza FALSE, un GetLastError - cod
ERROR_INVALID_HANDLE. Dar când procesul în modul de depanare, sistemul pur și simplu notifică o depanator eroare.
Înainte de a reveni controlul CloseHandle șterge înregistrarea din tabelul de descriptori: a tspsr descriptor valid în procesul de dumneavoastră și nu se poate folosi. În acest caz, intrarea este ștearsă, indiferent dacă obiectul este distrus de kernel-ul sau nu! După apelarea CloseHandle nu mai aveți acces la acest-
nucleu obiect mu; dar, în cazul în care contorul nu este resetat, obiectul rămâne în memorie Totul este normal, aceasta înseamnă pur și simplu că obiectul este utilizat de un alt procedeu (sau procese). În cazul în care restul procesului va finaliza activitatea lor cu acest obiect (de asemenea, prin apelarea CloseHandle), acesta va fi distrus.
Ce se întâmplă dacă ați uitat să apelați CloseHandle - dacă o scurgere de memorie este? Ei bine, da și nu. scurgeri de resurse (același obiect nucleu) este destul de posibil, în timp ce procesul continuă să fie difuzate. Cu toate acestea, după finalizarea procesului de sistemul de operare este garantat pentru a elibera toate resursele deținute de proces, iar în cazul obiectelor nucleu funcționează astfel: în momentul în care procesul este scanari complete de descriptori masa lui și se închide orice mânere deschise.