Глава 3 ядрото обекти

ако (pWideCharStr == NULL) връщане (Фок);

// конвертира низа да nultibaytovuyu shirokosimvolnuyu

MultiByteToWideChar (CP_ACP, 0, pMulti8yteStr, -1, pWideCharStr, nLenOfWideCharStr);

// повикване shirokosimvolnuyu версия на функцията за извършване на тази дейност

// конвертирате обратно към низ shirokosimvolnuyu многобайтов

WideCharToMultiByte (CP_ACP, 0, pWideCharStr, -1, pMultiByteStr, strlen (pMultiByteStr), NULL, NULL);

// освободи паметта разпределени за shirokobaytovuyu на низ

HeapFree (GetProcessHeap () 0, pWideCharStr);

И накрая, в заглавния файл, който дойде с DLL, прототипи на тези функции ще бъдат такива:

BOOL StringReverseW (PWSTR pWideCharStr);

BOOL StringReverseA (PSTR pMultiByteStr);

#define StnngReverse StringReverseW #else

# определят StringRevcrsc StringReverseA # endif // UNICODE

Проучване Windows API, ние ще започнем с основните обекти и техните описания (дръжки). Тази глава се фокусира върху относително абстрактно понятие, т.е.. Д. ние не се навлиза в спецификата на някои ядрото обекти, помислете за своите общи свойства.

Бих предпочел да се започне с нещо малко по-конкретни, но без ясно разбиране на основните предмети, не е нужно да се превърне в истински професионалист в разработването на Windows-базирани програми. Тези обекти се използват от системата, а нашите приложения за управление на процеси, които много различни ресурси, теми, файлове, и така нататък. Г. Концепциите, представени тук, ще се появят в цялата книга. Въпреки това, аз разбирам, че част от материала се установява в главата си толкова дълго, колкото да не започне да работи с ядрото на обекти, използващи реални функции. И когато четете следващите глави вероятно ще от време на време да се върне към тази глава.

Какво е обект на ядрото

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

работи с няколко вида обекти, включително жетони за сигурност

(Достъп символични предмети), файлове (File обекти), проекциите на файлове (файлове картографиране обекти), пристанища IO завършване (I / O завършване пристанищни обекти), работни места (обекти за работа), пощенски кутии (mailslot обекти), myutsksami ( мутекси обекти), канал (тръбни обекти), процеси (процес обекти), семафори (семафор обекти), резби (резбата обекти) и

Очаква таймери (waitable таймер обекти). Тези обекти са създадени Windowsfunktsiyami например CreateFtleMapping кара системата

създаване на обект "файл картографиране." Всеки ядро ​​обект - наистина е само един блок от памет разпределени на ядрото и е достъпна само за него. Този блок е структура от данни, в която елементи съдържат информация на обекта. Някои елементи (дескриптор за защита, номерът на брояч на потребителите и др.), Които присъстват във всички обекти, но повечето от тях са специфични за определен тип обект. Например, "Процесът" на обект е с идентификатор, основен приоритет, и код на завършване, както и обект "файла" - изместването в байтове, разделен режим и режим откритие

Тъй като структурата на обектите на ядрото са достъпни само за ядрото, заявката не може самостоятелно да намерите тези структури в паметта и да променят директно тяхното съдържание е Microsoft ограничение въвежда умишлено и да е програма, не нарушава целостта на ядрото структури на обекти. Същото ограничение позволява на Microsoft да се въведе, премахват или редактират елементи на конструкции, НЧ, нарушаващи функциите на всички приложения.

Но въпросът е: ако не можем директно да променя тези структури, как нашите приложения работят на обекти на ядрото? Отговорът е, че в Windows

предоставя набор от функции, обработка на строго определени правила за ядрото обекти структура. Ние получите достъп до ядрото предмети само чрез тези функции. Когато се обадите функция, която създава обект ядрото, той се връща манипулатор, който идентифицира създаден обект Характеристиката да се разглежда като "непрозрачна" стойност, която може да се използва от всяка нишка си процес. Това ЕВРОВОК издържите Windows-функцията, казва системата какви са ядрото Обектът, който се интересува. Но ние ще говорим за по-късните описания (в тази глава).

За по-голяма надеждност на операционната система на Microsoft е направила така, че стойността на описания зависи от конкретния процес. Ето защо, ако премине на стойност (с помощта на който и да е комуникация между процесите механизъм) поток от друг процес, който и да е обаждане от дескриптора на процеса със стойността, получена в процеса, ще даде грешка. Но volzuytes, в края на главата, които наблюдаваме, три механизма правилно използване на множество процеси на ядрото обект.

Отчитане на основните потребителски обекти

Ядрото предмети принадлежат на ядрото, а не на процеса. С други думи, ако си процес изисква функция, която създава обект на ядрото, а след това се прекратява, обектът ядрото не може да бъде унищожен. В повечето случаи, такъв обект все още се унищожават; но ако ядрото се противопоставят сте създали се използва от друг процес, ядрото ще се забрани унищожаването на обекта, стига да откаже и на процеса на него.

Ядрото знае колко много процеси използват специфичен ядро ​​обект poskol Ку, всеки обект има сметка за броя на своите потребители. Този брояч - един от елементите на данните, които са общи за всички видове ядрото обекти. В momept вземане брояч обект

1. Когато прикачена към съществуващ ядрото манипулатори друг процес, броячът се увеличава с 1. Когато всеки процес е завършен, на гишетата на всички ядрото предмети, използвани от него се намалява автоматично с 1. Веднага след като броят на даден обект се изчиства, ядрото разрушава обекта.

Ядрото обекти могат да бъдат защитени от ЕВРОВОК за сигурност (дескриптор за защита), в който се описва, който е създал обекта и кой има право да го получи. дескриптор за защита обикновено се използва при писане на сървърни приложения; създаване на клиентско приложение, можете да игнорирате този имот ядрото обекти.

Почти всички от функциите, които създават ядрото на обекти, да вземе указател към структура

SECURITY_ATTRIBUTES като аргумент, например:

typedef структура _SECURITY_ATTRIBUTES

LPVOID lpSecurityDescriptor; BOOL bInherttHandle;

Въпреки че структурата се нарича SECURITY__ATTRIBUTES, само един елемент вв се отнася до защита на - lpSecuntyDescnptor. Ако е необходимо да се ограничи достъпът до обект на ядрото, която сте създали, създаване на дескриптор за сигурност и инициализира структура

SECURITY_ATTRIBUTES следва:

ДРЪЖКА hFileMapping = CreateFileMapping (INVALID_HANDLE_VALUE, SA, PAGE_REAOWRITE, 0, 1024, "MyFileMapping");

Разглеждането на точката bInheritHandle аз ще се отложи до раздела за наследството, тъй като този елемент няма нищо общо със защита.

Желаещи да получат достъп до съществуващата ядрото обекта (вместо да създаде нова), уточнява какви действия смятате да извърши над обекта. Например, ако аз исках да четат данни от съществуващ проекция файл, той ще доведе до функцията

OpenFileMapping по този начин;

ДРЪЖКА hFileMapping = OpenFileMapping (FILE_MAP_READ, фалшиви "MyFileMapping");

FILE_MAPREAD преминаване на първия параметър за OpenFileMapping функцията, аз Ви информираме, че веднага след като е получил достъп до прогнозния файл, ще прочете данните от него. OpenFileMapping функция преди chsm изведе валидна от описание: проверява вида на обекта на защита. Ако аз, като регистриран потребител, позволи на съществуващото ядро ​​обект "файл картографиране", OpenFileMapping връща валиден ЕВРОВОК. Но ако аз съм отказан достъп,

връща NULL, и призовават GetLastError дава код за грешка 5 (или ERROR_ACCESS_DENIED). Но отново, в по-голямата част от защитата на кандидатстване не се използва, така че аз няма да се спирам на тази тема

Представете си, че когато стартирате приложението чете данни от някои от ключа на системния регистър, за да направите това korrekchno, тя трябва да доведе функция RegOpenKeyEx, минавайки стойност KEY_QUERY_VALUE, която позволява на операция за четене в този раздел.

Ако предприемачът малко мисъл за защита и да се промени стойността

KEY_ALL_ACCESS на KEY_QUERY_VALUE (само-и всичко!), Неговата продукт може да работи и в двете операционни системи

Освен ядрото обекти, вашата програма може да се използват и други видове обекти - менюта, прозорци, мишка курсори, четки и шрифтове. Те се отнасят до предмета на потребителя или GDI нов за програмиране за Windows да се бърка, като се опитва да се прави разлика за потребителя или GDI обекти на ядрото обекти. Откъде знаеш, например, чийто предмет - потребителят или ядро ​​- е тази икона? Разберете дали обектът не принадлежи на ядрото, най-лесният начин да се анализира функция, която създава обекта. Почти всички функции, които създават ядрото на обекти, има опция да се уточни атрибути за сигурност - като