obiecte Capitolul 3 nucleu

if (pWideCharStr == NULL) return (FOK);

// converti șirul de la nultibaytovuyu shirokosimvolnuyu

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

// versiune apel shirokosimvolnuyu a funcției de a efectua această lucrare

// conversia înapoi la multibyte șirul shirokosimvolnuyu

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

// eliberează memoria alocată pentru shirokobaytovuyu șir

HeapFree (GetProcessHeap (), 0, pWideCharStr);

Și, în sfârșit, în fișierul antet care a venit cu DLL, prototipuri ale acestor funcții ar fi astfel:

BOOL StringReverseW (PWSTR pWideCharStr);

BOOL StringReverseA (PSTR pMultiByteStr);

#define StnngReverse StringReverseW #else

#define StringRevcrsc StringReverseA # endif // UNICODE

Studiind API Windows, vom începe cu obiectele de bază și descriptorii lor (mânere). Acest capitol se concentrează pe un concept relativ abstract, adică. E. noi nu intra în specificul anumitor obiecte nucleu, ia în considerare proprietățile lor generale.

Aș prefera să înceapă cu ceva mai concret, dar fără o înțelegere clară a subiectelor de bază, nu deveni un profesionist adevărat în dezvoltarea programelor bazate pe Windows. Aceste obiecte sunt folosite de către sistem, iar aplicațiile noastre de management pe care procesele de mai multe resurse diferite, fire, fișiere, și așa mai departe. D. Conceptele prezentate aici vor avea loc în întreaga carte. Cu toate acestea, am înțeles că o parte din material se stabileste in cap atâta timp cât nu începe să lucreze cu obiecte nucleu folosind funcții reale. Și când citiți următoarele capitole probabil va din timp în timp pentru a reveni la acest capitol.

Ce este un obiect nucleu

Crearea, deschiderea și alte operațiuni de obiecte de kernel vor fi pentru tine, ca un dezvoltator de aplicații bazate pe Windows, o zi la rutina de zi. Sistemul vă permite să creați și să

operează cu mai multe tipuri de obiecte, inclusiv indicativele de securitate

(obiecte de acces token), fișiere (obiecte de fișiere), proiecțiile fișierelor (file object-cartografiere), porturi de finalizare IO (obiecte de port I / O finalizare), locuri de muncă (obiecte de locuri de muncă), cutiile poștale (obiecte mailslot), myutsksami ( obiecte mutex), canal (obiecte pipe), procese (obiecte de proces), semafoarele (obiecte semafoarelor), fire (obiecte) și filet

cronometre așteptate (obiecte timer waitable). Aceste obiecte sunt create exemplu Windowsfunktsiyami, CreateFtleMapping face ca sistemul

a crea obiect „cartografiere fișier.“ Fiecare obiect nucleu - într-adevăr doar un bloc de memorie alocat kernel-ul și pot fi accesate numai pentru el. Acest bloc este o structură de date în care elementele conțin informații ale obiectului. Unele elemente de securitate (descriptor, numărul contra de utilizatori și altele.) Sunt prezente în toate obiectele, dar cele mai multe dintre ele sunt specifice pentru un anumit tip de obiect. De exemplu, „proces“ obiect are un identificator, prioritatea de bază și completarea automată a codului și „fișierul“ obiect - offset în octeți, modul de divizare și modul de descoperire

Deoarece structura obiectelor nucleu sunt disponibile numai pentru kernel-ul, aplicația nu poate găsi în mod independent, aceste structuri în memorie și de a modifica direct conținutul lor este Microsoft a introdus în mod intenționat limitare la orice program nu a încălcat integritatea structurilor nucleu de obiecte. Aceeași restricție permite Microsoft să introducă, elimina sau a edita elemente ale structurilor, ns distrugand orice aplicații.

Dar întrebarea este: dacă nu putem modifica direct aceste structuri, modul în care aplicațiile noastre funcționează pe obiectele kernel? Răspunsul este că în Windows

oferă un set de funcții, de prelucrare a unor norme strict definite ale structurii obiectelor nucleu. Vom avea acces la nucleu obiecte numai prin aceste funcții. Când apelați o funcție care creează un obiect nucleu, returnează un mâner care identifică descriptorul obiect creat pentru a fi considerată ca valoare „netransparente“, care poate fi utilizat de orice fir de proces dumneavoastră. Acest descriptor va trece Windows-funcția, spune sistemul ce kernel-ul obiecta vă interesează. Dar vom vorbi despre descriptorii mai târziu (în acest capitol).

Pentru o mai mare fiabilitate a sistemului de operare Microsoft a făcut în așa fel încât valoarea descriptorilor depind de procesul particular. Prin urmare, dacă treci o valoare (folosind orice mecanism de comunicare interproces) flux de un alt proces, orice apel din descriptorul de proces cu valoarea obținută în procesul dumneavoastră, va da o eroare. Dar volzuytes, la sfârșitul capitolului, ne uităm la trei mecanisme de utilizare corectă a mai multor procese de obiect nucleu.

Contabilizarea de bază obiectelor de utilizator

Kernel obiecte fac parte din kernel-ul, și nu procesul. Cu alte cuvinte, în cazul în care procesul de apeluri o funcție care creează un obiect nucleu, și apoi se termină, obiectul nucleu nu poate fi distrus. În cele mai multe cazuri, un astfel de obiect este încă distrusă; dar, în cazul în care kernel-ul obiect creat este utilizat de un alt proces, kernel-ul va interzice distrugerea obiectului, atâta timp cât acesta refuză și procesul de ea.

Nucleul știe cât de multe procese folosesc specifice poskol obiect nucleu ku, fiecare obiect are un număr de numărul de utilizatori. Acest contor - unul dintre elementele de date care sunt comune pentru toate tipurile de obiecte nucleu. În momept de luare a contra-obiect

1. Atunci când atribuit unui obiect nucleu existent mânere alt proces, contorul este incrementat cu 1. Atunci când orice proces este finalizat, contoarele tuturor obiectelor nucleu folosite de el sunt reduse automat cu 1. De îndată ce numaratoarea unui obiect este șters, nucleul distruge obiectul.

obiecte de kernel pot fi protejate de un descriptor de securitate (descriptor de securitate), care descrie cel care a creat obiectul și care are dreptul de a accesa. descriptor de securitate este utilizat în mod obișnuit la scrierea aplicațiilor bazate pe server; creând o aplicație client, puteți ignora acest kernel obiecte de proprietate.

Aproape toate funcțiile care creează obiecte nucleu, să ia un pointer la o structură

SECURITY_ATTRIBUTES ca argument, de exemplu:

typedef struct _SECURITY_ATTRIBUTES

LPVOID lpSecurityDescriptor; BOOL bInherttHandle;

Deși structura se numește SECURITY__ATTRIBUTES, un singur element de cc se referă la protecția - lpSecuntyDescnptor. Dacă trebuie să restricționeze accesul la un obiect nucleu ați creat, creați un descriptor de securitate și a inițializa structura

SECURITY_ATTRIBUTES urmează:

MÂNER hFileMapping = CreateFileMapping (INVALID_HANDLE_VALUE, sa, PAGE_REAOWRITE, 0, 1024, "MyFileMapping");

Luarea în considerare a elementului bInheritHandle voi amâna la secțiunea referitoare la moștenire, deoarece acest element nu are nimic de-a face cu protecție.

Dorind pentru a avea acces la obiectul nucleu existent (în loc de a crea unul nou), specificați ce acțiuni intenționați să desfășurați pe obiect. De exemplu, dacă am vrut să citesc datele dintr-un fișier existent de proiecție, aceasta ar cauza funcției

OpenFileMapping astfel;

MÂNER hFileMapping = OpenFileMapping (FILE_MAP_READ, FALSE, "MyFileMapping");

FILE_MAPREAD care trece primul parametru la OpenFileMapping funcție, eu vă informez că imediat ce am fost dat acces la dosar de proiecție, voi citi datele de la ea. Funcția OpenFileMapping înainte de a reveni chsm un descriptor valid, verifică tipul obiectului de protecție. Dacă eu, ca un utilizator înregistrat, permite existenta nucleu obiect „cartografiere fișier“, OpenFileMapping returnează un descriptor valid. Dar dacă am refuzat accesul,

se întoarce NULL, și apel GetLastError dă un cod de eroare de 5 (sau ERROR_ACCESS_DENIED). Dar, din nou, în cea mai mare parte a protecției de aplicare nu este utilizat, așa că nu voi insista asupra acestui subiect

Imaginați-vă că, atunci când rulați aplicația citește date de la o parte din cheia de registry pentru a face acest lucru korrekchno, acesta ar trebui să cauzeze funcția RegOpenKeyEx, trecând valoarea KEY_QUERY_VALUE care permite operația de citire, în această secțiune.

În cazul în care dezvoltatorul un gând puțin asupra protecției și a schimbat valoarea

KEY_ALL_ACCESS pe KEY_QUERY_VALUE (numai și totul!), Produsul său ar putea funcționa în ambele sisteme de operare

În afară de obiecte nucleu, programul poate utiliza alte tipuri de obiecte - meniuri, ferestre, cursoare mouse-ul, perii, și fonturi. Acestea se referă la obiectul de utilizator sau GDI nou la programare pentru Windows poate obține confuz, încercând să se facă distincția utilizatorului sau a unor obiecte GDI de obiecte nucleu. De unde știi, de exemplu, al cărui subiect - Utilizator sau de bază - este această pictogramă? Aflați dacă obiectul nu aparține miezului, cel mai simplu mod de a analiza funcția care creează obiectul. Aproape toate funcțiile care creează obiecte nucleu, există o opțiune pentru a specifica atributele de securitate - cum ar fi