Таблица дескриптори ядро ​​обект

В същото време, функциите, които създават потребителски обекти или на GDI, има параметър тип

PSECURITY_ATTRIBUTES и пример за това - функция CreateIcon

HICON CreateIcon (HINSTANCE hinst. Int nWidth,

вътр nHeight, БАЙТ cPlanes, BYTE cBitsPixel,

CONST байт * pbANDbits, CONST байт * pbXORbits);

Таблица 3-1 показва как масата за дръжка, която принадлежи на процеса, както можете да видите, че това е просто набор от структури от данни Всяка структура съдържа указател към някои ядрото обект, маска за достъп, както и някои знамена

Ако преминете невалиден индекс (ЕВРОВОК), функцията се провали и GetLastError връща 6 (ERROR_INVALID_HANDLE). Това се дължи на факта, че всъщност дръжки са кодове, посочени в таблицата, стойностите им са обвързани с определен процес и nedeyovitelny в други процеси.

Ако извикването на функция, създаване на обект ядрото е неуспешна, след това обикновено се връща 0 (нула). Подобна ситуация е възможно само в случай на остър недостиг на памет, или ако имате проблеми със защита. За съжаление, някои функции връщат в такива случаи, СИ 0 и -1 (INVALID_HANDLE_VALUE) Например, ако CreateFile не можете да отворите даден файл, той се връща INVALID_HANDLE_VALUE. Бъдете много

Внимавайте, когато проверката на стойността връщане на функция, която създава обект ядро. Така че, за CreateMutex провери INVALID_HANDlE_VALUE безсмислен:

ДРЪЖКА hMutex = CreateMutex (.);

ако (hMutex == lNVALID_HANDLE_VALUE)

// този код никога няма да бъде екзекутиран като

// връща грешка, когато CreateMutex NLlLL

По същия начин, безсмислен и следния код:

HANDIE hFile = CreateFile (.); ако (hFile - NULL>

// и този код никога няма да бъде екзекутиран като

// връща когато грешка CreateFile lNVALID_HANDLE_VALUE (-1)

Закриване обект ядрото

Без значение как се създаде обект ядрото, след като е работил с него трябва да се обадя CloseHandle zakrp

BOOL CloseHandle (ДРЪЖКА hobj);

Тази функция първо проверява маса описания, принадлежащи към извикващия процес да се уверите, тя определя дали премина индекса (инвентаризация

Ако дръжката на неверниците, има едно от следните две неща. В нормален режим на изпълнение CloseHandle процес връща FALSE, а GetLastError - код

ERROR_INVALID_HANDLE. Но когато процесът в режим на отстраняване на грешки, системата просто не уведоми дебъгер за грешка.

Преди да върнат контрола CloseHandle изтрива запис от таблицата на описания: дескрипторната tspsr валидно в процеса и не можете да го използвате. В този случай, вписването се заличава, независимо дали обектът се унищожава от ядрото или не! След като нарече CloseHandle вече нямате достъп до това-

ц обект на ядрото; но ако броячът не се изключи, обектът остава в паметта Всичко е нормално, това просто означава, че обектът се използва от друг процес (или процеси). Когато останалата част от процеса ще приключи работата си с този обект (също като се обадите CloseHandle), тя ще бъде унищожена.

Какво става, ако сте забравили да се обадя CloseHandle - дали изтичане на памет е? Е, да, и не. изтичане на ресурса (един и същ обект на ядрото) е напълно възможно, а този процес все още работи. Въпреки това, след приключване на процеса на операционната система е гарантирано за облекчаване на всички ресурси, притежавани от този процес, както и в случай на ядрото обекти работи по следния начин: по време на процеса е пълно сканиране на трапезата му описания и затваря всички отворени дръжки.