Sistem Programlama Handle Kavramı



Yüklə 456 b.
tarix06.02.2018
ölçüsü456 b.
#26322


Sistem Programlama

  • Handle Kavramı

  • (Genişletilmiş)

  • Yrd.Doç.Dr.Nurettin Beşli


Handle Kavramı

  • Windows'da çalışırken pek çok durumda bir işe başlamadan önce işletim sisteminin o işe ilişkin bilgileri depolayacağı bir alan yaratması gerekir.

  • Bu alan dinamik olarak yaratılır.

  • Alanın yaratıldığı bölge Windows'un kendi içerisindeki heap bölgesidir.

  • Genellikle ismi CreateXXXX biçiminde olan bir fonksiyon ile bu alan yaratılır.



Handle Kavramı

  • Bu tür yaratıcı fonksiyonlar oluşturdukları veri yapısına ilişkin bir değeri handle değeri olarak verirler. Bu değer konu ile ilgili işlem yapan diğer fonksiyonlara parametre olarak geçirilir.

  • Çalışma bittikten sonra tahsis edilen bu alanın uygun bir fonksiyonla geri bırakılması gerekir.

  • Bu alanın geri bırakılması unutulmuşsa problem ortaya çıkmaz. Çünkü Windows proses sonlandığında o prosesin açmış olduğu handle alanlarını sisteme otomatik olarak iade eder.



Handle Kavramı

  • Handle yaratan CreateXXX isimli bir fonksiyon çağırıldığında verilen handle değerinin türü H ile başlayan türlerdendir. Örneğin:

  • HINSTANCE

  • HICON

  • HWND

  • Bu türlerin hepsi aslında void * biçimindedir.

  • Yani örneğin:

  • void *hWnd;

  • hWnd = CreateWindow(...);

  • işleminde herhangi bir hata söz konusu olmaz.



Handle Kavramı

  • Fonksiyonların geri verdiği handle değerleri tahsis edilmiş olan alana erişmek için kulanılır fakat doğrudan o alanı gösteren bir adres değildir. Yani handle değeri olarak veriln adres ile gerçek alana ulaşabilmek için bazı işlemler gerekebilir.

  • CreateXXX fonksiyonlarıyla tahsis edilen dinamik alanlara Windows sistem programlama terminolojisinde nesne(object) denir.

  • Buradaki nesnenin nesne yönelimkli programlamadaki nesneyle alakası yoktur.

  • Windows'da sistem nesneleri 3 grup halinde incelenebilir:

  • 1. KERNEL

  • 2. USER

  • 3. GDI



Proses Kavramı

  • Diskteki bir program çalışır duruma geldiğinde artık proses olarak isimlendirilir. Program kavramı yalnızca dosya belirtir, proses çalışmakta olan programdır.

  • Bir program çalıştırıldığında işletim sistemi prosesi yönetebişlmek için dinamik bir alan tahsis eder ve proses bilgilerini o alana yazar.

  • Windows terminolojisiyle işletim sisteminin bir proses listesi oluşturduğu söylenebilir.

  • Proses nesnesi ise bir KERNEL nesnesidir.



Proses Kavramı

  • Windows'da bir proses yaratmak için CreateProcess API fonksiyonu kullanılır.

  • Bu fonksiyon bir exe dosyanın ismini alarak onu çalıştırır.

  • Bu fonksiyon programı diskten belleğe yükleyerek çalıştırır.

  • Tabii bir proses listesi oluşturarak prosesin önemli bilgilerini oraya yerleştirir.

  • CreateProcess sonucunda birbirleriyle ilişkili iki önemli değer elde edilir.Bunlar proses handle ve proses ID değerleridir.



CreateProcess Fonksiyonunun Parametreleri

  • BOOL CreateProcess(

  • LPCTSTR lpApplicationName,

  • LPTSTR lpCommandLine,

  • LPSECURITY_ATTRIBUTES lpProcessAttributes,

  • LPSECURITY_ATTRIBUTES lpThreadAttributes,

  • BOOL bInheritHandles,

  • DWORD dwCreationFlags,

  • LPVOID lpEnvironment,

  • LPCTSTR lpCurrentDirectory,

  • LPSTARTUPINFO lpStartupInfo,

  • LPPROCESS_INFORMATION lpProcessInformation

  • );



CreateProcess Fonksiyonunun Parametreleri

  • Fonksiyonun birinci parametresi çalıştırılacak exe dosyanın ismidir.

  • Dosya ismi path içerebilir. Bu durumda dosya yalnızca path ile belirtilen dizin içerisinde aranır.

  • Eğer path içermiyorsa arama işlemi otomatik bazı dizinler içerisinde yapılmaktadır.

  • Fonksiyonun ikinci parametresi main ya da WinMain fonksiyonlarına geçirilecek komut satırı argümanlarını belirtir.

  • Pek çok program komut satırı argümanı olarak bir dosya ismini alacak biçimde yazılmıştır. Komut satırı argümanının ilk ayrık string'i birinci parametresiyle belirtilen dosya ismi olması gerekir. Yani komut satırı argümanı boşluklarla ayrılmış olarak girilebilir, ancak ilk boşluksuz string'in çalıştırılacak programı belirtmesi gerekir.



CreateProcess Fonksiyonunun Parametreleri

  • 1. Fonksiyon genellikle birinci parametre NULL, ikinci parametreyse en azından çalıştırılacak dosya ismini barındıracak şekilde çağırılır. Örneğin:

  • CreateProcess(NULL, "winword.exe mytext.doc", ...);

  • 2. İkinci parametre belirtilemek zorunda değildir ama belirtilecekse ilk string'in çalıştırılacak dosya ismini kesinlikle içermesi gerekir.

  • 3. İki parametre de kullanılırsa dosya ismi birinci parametresiyle belirtilen biçimde aranır.

  • 4. Fonksiyon UNIX'teki exec fonksiyonundan esinlenerek tasarlanmıştır.



CreateProcess Fonksiyonunun Parametreleri

  • Fonksiyonun üçüncü ve dördüncü parametreleri ileride ele alınacak olan güvenlik bilgileridir.

  • Bu parametreler NULL olarak geçilirse default durum ele alınır.

  • Fonksiyonun beşinci parametresi yaratılan prosesin yaratan prosesin handle bilgilerini kullanıp kullanamayacağını belirler. Bu paranmetre TRUE olarak geçilebilir.

  • Fonksiyonun altıncı parametresi yeni prosesin .alışma özellikleriyel ilgilidir. Bu parametre çeşitli sembolik sabitlerin bit OR ile birleştirilmesi ile girilebilir. Bu parametre tamamen 0 biçiminde de girilebilir. Bu durumda default bazı belirlemeler yapılmış olur. Bu parametrede aynı zamanda prosesin öncelik derecesi de belirtilebilmektedir. Prosesin öncelik derecesi prosesin kullandığı CPU zamanıyla ilgilidir.



CreateProcess Fonksiyonunun Parametreleri

  • Fonksiyonun yedinci parametresi kullanılacak çevre değişkenlerini belirten yazının adresini alır. NULL olarak girilebilir.

  • Fonksiyonun sekizinci parametresi programın default dizinini belirtmektedir. Pek çok API fonksiyonu parametre olarak dosya ismi almaktadır. Bu dosya ismi path ifadesi belirtilmeksizin kullanılırsa burada belirtilen dizin içerisinde işlem yapılır. NULL olarak geçilirse CreateProcess fonksiyonunu çağıran programın default dizini default dizin olarak kabul edilir.

  • Fonksiyonun dokuzuncu parametresi STARTUPINFO türünden bir yapının adresini alır. Bu yapının içi CreateProcess tarafından faydalı bilgiler tarafından doldurulmaktadır. Ancak bu yapının ilk elemanı yapının uzunluğunu tutan DWORD türünden bit değişkendir. Yapının bu elemanının fonksiyona gönderilmeden önce uygun bir biçimde doldurulması gerekir.



CreateProcess Fonksiyonunun Parametreleri

  • Örneğin:

  • STARTUPINFO si = { sizeof(STARTUPINFO) };

  • CreateProcess(....., &si,...);

  • Fonsiyonun onuncu parametresi PROCESS_INFORMATION isimli bir yapının adresini alır. Yani bu türden bir yapı değişkeni tanımlanıp adresi geçilmelidir. Bu yapının iki önemli elemanı yaratılan proses nesnesine ilişkin ID ve handle değeridir.



CreateProcess Fonksiyonunun Parametreleri

  • Aşağıda örnek bir CreateProcess çağırması görülmektedir:

    • BOOL bResult;
    • STARTUPINFO si = { sizeof(STARTUPINFO) };
    • PROCESS_INFORMATION pi;
    • bResult = CreateProcess(NULL, "NOTEPAD.EXE", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
    • if (!bResult) {
    • MessageBox(NULL, "Process creation error", "Error", MB_OK);
    • }


UNIX'te Prosesin Çalıştırılması

  • Windows sisteminde CreateProcess fonksiyonunu çağıran prosese parent process oluşturulan prosese ise child process denir.

  • Ancak parent-child ilişkisi Windows'da çok önemli değildir. Yalnızca handle tablosunun kullanımıyla sınırlıdır.

  • Halbuki UNIX'te prosesler arasındaki parent-child ilişkisi başka konuları kapsayacak biçimde daha geniştir.



UNIX'te Prosesin Çalıştırılması

  • UNIX'te fork sistem fonksiyonu bir prosesin özdeş kopyasını çıkartarak yeni bir kopyasını oluşturur.

  • Yeni kopyası da fork'tan itibaren çalışmaya devam edecektir.

  • Bir çalıştırılabilir dosyayı yükleyip çalıştıran fonksiyon ise exec'tir.

  • Ancak exec bir programı başka bir program olarak çalıştırır. Yani exec çağırmasının aşağısına yazılan hiçbir şey işlem göremez.

  • Programın akışı fork'tan çıkınca parent ve child prosesten hangisinde olunduğu fork fonksiyonunun geri dönüş değeriyle tespit edilir. Eğer geri dönüş değeri 0 dışı ise parent proseste, 0 ise child proseste olduğu anlaşılır.



UNIX'te Prosesin Çalıştırılması

  • Bu durumda bir program şöyle çalıştırılabilir:

    • if (!fork())
    • exec(.....);
  • Windows'da parent proses sonlandırılsa bile childproses çalışmaya devam eder.

    • Örneğin
    • Windows Explorer ile bir program çalıltırılsın, daha sonra Windows Explorer'ı kapatsak program çalışmaya devam eder.


Kernel Nesenleri

  • İşletim sisteminin içsel çalışmasına özgü olan nesnelere(handle alanlarına) kernel nesneleri denir. Örnek kernel nesnekleri şunlardır:

  • Process

  • Thread

  • Mutex

  • Event

  • File

  • Semaphore



Kernel Nesenleri

  • Örneğin CreateProcess fonksiyonu ile process kernel nesnesi yaratılmaktadır.

  • Process kernel nesnesiyle yaratılan alana özel olarak process database denilmektedir.

  • Process database ve diğer kernel nesneleri Microsoft tarafından dokümante edilmemiştir.

  • Kernel nesnelerinin içsel veri yapısı Windows sürümleriyle Microsoft tarafından değiştirilmektedir.



Kernel Nesenleri

  • Kernel nesnelerinin içsel yapısı dokümante edilmemiş olmasına karşın bütün kernel nesnelerinin ilk iki elemanı ortaktır ve bu bilgi pek çok makalede belirtilmiştir.

  • Kernel nesnelerinin ilk DWORD elemanı nesnenin hangi kernel nesnesi olduğunu anlatan bir sayıdır.

  • İkinci DWORD elemanı ise ilerde bahsedilecek olan nesnenin sayaç elemanıdır.

  • Kernel nesnelerinin geri kalan elemanları nesnenin türüne bağlı olarak değişebilmektedir.



Process Handle Tablosu

  • Her processin kernel nesnelerinin handle değerlerine ilişkin bir process handle tablosu vardır. Process handle tablosunun yeri process database içerisinde saklıdır.



Process Handle Tablosu

  • Bütün Kernel nesnelerine ilişkin handle değerleri aslında process handle tablosunda bir index belirtir. Kernel nesnesinin gerçek adresi buradan alınmaktadır.

  • Örneğin CreateFile API fonksiyonuyla bir dosya açılmış olsun:

  • hFile = CreateFile(............);

  • Bu handle bilindiğinde File Kernel nesnesine şöyle erişilir:

  • 1. İşletim sistemi handle'ın kullanıldığı process'i tespit eder.

  • 2. İlgili process'in process handle tablosunu bulur.

  • 3. Handle değerini index yaparak file kernel nesnesinin adresine erişir.



Process Handle Tablosu

  • Buradan çıkan en önemli sonuç bütün kernel nesnelerine ilişikin handle değerlerinin yalnızca o process için anlam taşıyan göreli bir değer olduğudur.

  • Örneğin A process'i CreateFile fonksiyonu ile bir dosya yaratıp elde ettiği handle değerini bir yöntemle B process'ine process'e iletse B process'i bu handle ile o dosyaya erişemez. Çünkü iki process'in process handle tabloları birbirlerinden farklıdır.



Process Handle Tablosu

  • Bir kernel nesnesi başka bir process tarafından ikinci kez yaratıldığında gerçekte yeni bir kernel nesnesi oluşturulmaz.

  • İşletim sistemi daha önce o nesnenin yaratılıp yaratılmadığına bakar, yaratılmışsa geröek nesnenin adresini process handle tablosunda boş bir girişe yazar, nesne sayacını bir arttırır ve handle değeri olarak o process'teki process handle tablosu index'ini verir.

  • Böyle bir durumda iki farklı process de farklı handle değerleriyle aslında aynı nesneye erişilmektedir.



Process Handle Tablosu

  • Örneğin:



Process Handle Tablosu

  • Bir process sonladığında process handle tablosu sayesinde process'in açmış olduğu bütün kernel nesneleri işletim tarafından otomatik olarak kapatılabilir. UNIX işletim sistemindeki kernel nesneleri de Windows'dakine çok benzer biçimde takip edilmektedir.

  • Process'ler de bir kernel nesnesidir. Bir process CreateProcess fonksiyonuyla başka bir process'i oluşturduğunda child process'in process database adresi parent process'in process handle tablosunda bir girişe yazılır. Yani elde edilen process'in handle değeri yine o process'e özgüdür.



Process Handle ve Process ID Değerleri

  • Bir process yaratıldığında CreateProcess fonksiyonu process ile ilgili handle ve ID biçiminde iki değer verir.

  • Process ile ilgili işlem yapan bazı API fonksiyonları handle değerini, bazıları ise ID değerini parametre olarak ister.

  • Bir process CreateProcess fonksiyonuyla başka bir process'te yaratılmış olabilir ve OpenProcess fonksiyonuyla başka bir process tarafından da açılmış olabilir. Bu durumda aynı process database'e ilişkin iki farklı process handle değeri söz konusu olur. Yani process handle değerleri process'e özgü değerlerdir.



Process Handle ve Process ID Değerleri

  • Buradan çıkan sonuç şudur: Yalnızca process handle değeri ile process database'e erişilemez. O handle'ın hangi process'e ilişkin olduğunu da bilmek gerekir.

  • Oysa process ID değeri doğrudan process database'i gösteren bir adres bilgisidir ve bütün sistemde tektir.

  • Bir process CreateProcess ile bir process yaratmış olsun. Başka bir process de yaratılmış olan bu process üzerinde işlemler yapacak olsun. Yani örneğin A process'i B process'ini yaratmış olsun. C process'i de B process'i üzerinde işlemler yapacak olsun. B process'ini A process'i yarattığına göre B process'inin handle ve ID değeri A'dadır. Bu bilgiyi A'nın C'ye aktarmış olması gerekir.

  • Handle bilgisinin aktarılması anlamsızdır, ID değerinin aktarılması gerekir.



Process Handle ve Process ID Değerleri

  • Bir process'in ID deeğri bilindiğinde OpenProcess API fonksiyonu ile onun handle değeri alınabilir.

  • OpenProcess şunları yapar:

  • - Process'in ID değerini parametre olarak alır.

  • - Buradan process database'inin adresini elde eder.

  • - Bu adresi kendi process'inin process handle tablosundaki boş bir girişe yazar.

  • - Geri dönüş değeri olarak bu girişin index numarasını verir.



CloseHandle API Fonksiyonu

  • Bütün kernel nesneleri CreateXXXX API fonksiyonlarıyla yaratılır ve CloseHandle API fonksiyonuyla boşaltılır.

  • Örneğin CreateProcess fonksiyonuyla bir process yaratıldığında sistem bir kenel nesnesi yani bir process database'i oluşturacaktır.

  • Bu nesne Closehandle fonksiyonuyla yok edilir.



Nesne Sayacının Kullanımı

  • Her kernel nesnesinin bir sayaç elemanı vardır.

  • Kernel nesnesi yaratıldığında sayacı 1 olur.

  • Başka bir process aynı nesneyi yarattığında yeniden nesne yaratılmaz, sadece sayaç bir arttırılır.

  • CloseHandle fonksiyonu önce nesnenin sayacını bir eksiltir, eğer sayaç 0'a düşmüşse nesneyi siler, düşmemişse nesneyi silmez.



Process'lerin Bitirilmesi ve Process Nesnesinin Yok Edilmesi

  • Process ve thread'lere özgü olarak CloseHandle kullanıldığında nesne sayacı 0 olsa bile CloseHandle process ve thread nesnelerini silmez.

  • CloseHandle ile sayaç 0'a düşürülse bile bu durum process'i sonlandırmaz.

  • Process ve thread nesnelerinin silinmesi CloseHandle fonksiyonuyla değil process ve thread'i bitiren fonksiyonlarla yapılmaktadır.



Process'lerin Bitirilmesi ve Process Nesnesinin Yok Edilmesi

  • Benzer biçimde process'in bitmiş olması process nesnenin yok edileceği anlamına gelmez.

  • Process ve thread nesnelerinin silinmesi process ve thread'leri sonlandıran fonksiyonlar tarafından yapılabilir.

  • Bu fonksiyonlar sonlandırma işlemi bitince nesne sayacına bakarlar, nesne sayacı 0'sa nesneyi de yok ederler.



Örnek Olaylar

  • 1. A process'i B process'ini yaratmış olsun. Bu durıumda B process'inin nesne sayacı 1'dir. A process'i yaratma işleminden hemen sonra CloseHandle uygulamış olsun. Bu durumda nesne sayacı 0 olur. Ancak process durmaz. Bu durumda B process'ini sonlandıran fonksiyon nesne sayacına bakar, nesne sayacı 0 ise nesneyi siler.



Örnek Olaylar

  • 2. A process'i B process'ini yaratmış olsun. B process'i çok hızlı çalışıp sonlanmış olsun. Bu durumda sayaç hala 1'dedir. Process'i bitiren fonksiyon nesneyi silmeyecektir. Process nesnesi process'i yaratan process'in(A) CloseHandle fonksiyonunu çağırmasıyla silinir.



Örnek Olaylar

  • Yani CloseH1andle process ve thread nesnesi bitmiş ve sayacı 0'a düşmüşse nesneyi siler. Bitmemiş fakat sayacı 0'a düşmüşse silmez. Bu durumda nesneyi sonlandıran fonksiyon siler.

  • Windows Explorer CreateProcess ile bir process'i çalıştırır çalıştırmaz hemen CloseHandle ile nesne sayacını düşürür.

  • Bu durumda nesne Windows Explorer'ın çalıştırdığı program sonlandırıldığında otomatik olarak silinir.

  • CloseHandle fonksiyonu yalnızca nesne sayacını bir azaltmakla kalmaz, aynı zamanda nesnenin process handle tablosundaki girişini de siler.



Örnek Olaylar

  • Windows Explorer'ın process'i yarattıktan sonra CloseHandle ile silmesinin iki nedeni vardır:

  • 1. Nesnenin silinmesini programın sonlanmasını sağlayan kişiye bırakır.

  • 2. Explorer CloseHandle'la silme işlemini yapmasaydı kendi process handle tablosu sürekli büyürdü.



Process'lere İlişkin İşlem Yapan API Fonksiyonlaır



ExitProcess Fonksiyonu

  • Bu fonksiyon bir process içinde çağırıldığında kendi process'ini sonlandırır.

  • Başka bir process'i sonlandırmak için TerminateProcess kullanılabilir.

  • Prototipi:

  • VOID ExitProcess(UINT exitCode);



OpenProcess Fonksiyonu

  • Bu fonksiyon process ID bilindiğinde o process'e ilişkin handle değeri elde edilmek istendiğinde kullanılır.

  • Prototipi:

  • HANDLE OpenProcess(

  • DWORD dwAccess,

  • BOOL bInheritance,

  • DWORD dwProcessID

  • )



OpenProcess Fonksiyonu

  • Fonksiyonun birinci parametresi process ile ilgili yapılmak istenen şeylere ilişkin kısıtlamaları içerir.

  • Bu parametre PROCESS_ALL_ACCESS girilirse process'e ilişkin herşey yapılabilir.

  • Fonksiyonun ikinci parametresi yeni process'in handle kalıtımsallığını belirlemek için kullanılır. TRUE olarak girilmesinde bir sakınca yoktur.

  • Fonksiyonun üçüncü parametresi process'in ID değeridir.

  • Fonksiyon geri dönüş değeri olarak handle'ı verir.



GetCurrentProcess Fonksiyonu

  • Bu fonksiyon o anda çalışmakta olan, yani fonksiyonun çağırıldığı process'in handle değerini verir.

  • Aslında bu fonksiyon her zaman 0x7FFFFFFF değeriyle geri döner. Windows o anda çalışmakta olan process'in handle değerini kendisi global bir değişkende tutar. Aslında bu değer o anda çalışmakta olan process'in handle'ını temsil eder.

  • Prototipi:

  • HANDLE GetCurrentProcess(VOID);



GetCurrentProcess Fonksiyonu

  • Fonksiyonun geri dönüş değeri HANDLE türündendir.

  • Eğer bir fonsiyon o anda çalışmakta olan process'in handle değerini isterse GetCurrentProcess fonksiyonuyla bu değer elde edilebilir.

  • Bir process'in process handle tablosunda kendi process'ine ilişkin bir handle girişi yoktur.

  • Kendi process'ine ilişkin handle için bu özel değer kullanılmaktadır.

  • Sonuç: Kendi process'imizin handle değeri kendi process'imizin handle tablosunda yazmaz, GetCurrentProcess fonksiyonuyla elde edilir.



GetCurrentProcessId Fonksiyonu

  • Bu fonksiyon o anda çalışmakta olan process'in gerçek ID değerini elde eder.

  • Zaten sistem o anda çalışmakta olan process'in ID değerini bir değişkende saklamaktadır.

  • Prototipi:

  • DWORD GetCurrentProcessId(VOID);



Process Listelerinin Elde Edilmesi

  • Win32 sistemlerinde o anda çalılmakta olan tüm process'lere ilişkin process listesi özel fonksiyonlarla alınabilir.

  • Windows 9x ve 2000'de bunun için toolhelp.dll kullanılmaktadır.

  • Visual C++ geliştirme ortamıyla proje oluşturulurken bu dll dosyasına ilişkin import library dosyası doğrudan link işlemine dahil edilmemiştir.

  • Bu yüzden bu fonksiyonları kullanırken bu dll'in import library dosyasını link aşaması için ayrıca projeye eklemek gerekebilir.

  • Gerçi Microsoft kernel32.lib import library dosyası içerisine toolhelp fonksiyonlarının link bilgilerini de daha sonra yerleştirmiştir.

  • Bu durumda Win9x ve 2000'in sonraki sürümlerinde toolhelp.dll'in import library dosyasının proje dosyasına dahil edilmesine gerek kalmamıştır.



Process Listelerinin Elde Edilmesi

  • Process listesinin takip edilmesi için kullanılan fonksiyonlara tool help fonksiyonları denir.

  • Tool help fonksiyonlarının prototipleri tlhelp32.h dosyasındadır.

  • Bu dosya windows.h içerisinde include edilmemiş olduğundan dışarıdan ayrıca include edilmesi gerekir.



Tool Help Fonksiyonlarıyla Process Listesinin Alınması

  • Process listesinin alınması işlemine CreateToolhelp32Snapshot fonksiyonu ile başlanır.

  • Bu fonksiyondan bir handle değeri elde edilir.

  • Bu handle değeri ile diğer tool help fonksiyonları yardımıyla process listesi alınır.

  • Bu fonksiyon çağırıldıktan sonra diğer işlemler daha sonra yapılabilir.

  • Ancak elde edilecek process listesi bu fonksiyonun çağırıldığı andaki process listesidir. Prototipi:

  • HANDLE WINAPI CreateToolhelp32Snapshot(

  • DWORD dwFlags,

  • DWORD th32ProcessID

  • );



Tool Help Fonksiyonlarıyla Process Listesinin Alınması

  • Fonksiyonun birinci parametresi tool help fonksiyonlarını hangi amaçla kullanacağımız anlatır(çünkü tool help fonksiyonları process, thread, heap listelerinin alınması için de kullanılabilir).

  • Eğer process listesi alınacaksa bu parametreye TH32CS_SNAPPROCESS değeri girilmelidir.

  • Fonksiyonu ikinci parametresi process listesi alınacaksa hiçbir anlamı olmayan bir parametredir. Örneğin 0 yazılabilir.

  • Fonksiyon bir handle değeri ile geri döner.

  • Bu handle değeri diğer fonksiyonlarda parametre olarak kullanılır.



Tool Help Fonksiyonlarıyla Process Listesinin Alınması

  • Process listesini almak için önce bir kez Process32First fonksiyonu çağırılır.

  • Sonra döngü içerisinde tüm liste alınana kadar Process32Next fonksiyonu çağırılmalıdır.

  • Bu iki fonksiyon tamamen aynı parametrik yapıya sahiptir.



Tool Help Fonksiyonlarıyla Process Listesinin Alınması

  • BOOL WINAPI Process32First(

  • HANDLE hSnapshot,

  • LPROCESSENTRY32 lppe

  • );

  • BOOL WINAPI Process32Next(

  • HANDLE hSnapshot,

  • LPROCESSENTRY32 lppe

  • );

  • -Fonksiyonların birinci parametresi CreateToolhelp32Snapshot fonksiyonundan elde edilen handle değeridir.

  • -Fonksiyon ikinci parametresiyle PROCESSENTRY32 isimli bir yapının adresini alır.



Tool Help Fonksiyonlarıyla Process Listesinin Alınması

  • typedef struct tagPROCESSENTRY32 {

  • DWORD dwSize;

  • DWORD cntUsage;

  • DWORD th32ProcessID;

  • DWORD th32DefaultHeapID;

  • DWORD th32ModuleID;

  • DWORD cntThreads;

  • DWORD th32ParentProcessID;

  • LONG pcPriClassBase;

  • DWORD dwFlags;

  • char szExeFile[MAX_PATH];

  • } PROCESSENTRY32;

  • typedef PROCESSENTRY32 * PPROCESSENTRY32;

  • typedef PROCESSENTRY32 * LPPROCESSENTRY32;



Tool Help Fonksiyonlarıyla Process Listesinin Alınması

  • PROCESSENTRY32 yapısı şu bilgileri içermektedir:

  • Yapının ilk elemanı(dwSize) fonksiyon çağırılmadan önce yapının uzunluğu ile doldurulmalıdır.

  • Bu işlem şöyle yapılabilir:

  • PROCESSENTRY32 processInfo = {sizeof(PROCESSENTRY32)};

  • cntUsage İlgili process'in nesne sayacını belirtir. Bu elemanın ciddi bir kullanımı yoktur.

  • th32ProcessID Process'in ID değerini vermektedir.

  • cntThreads elemanı ise çalışan thread sayısını gösterir.

  • th32ParentProcessID Bu process hangi process tarafından yaratılmışsa o process'in ID değerini verir.

  • szExeFile Yapının en önemli elemanıdır. Bu process'e ilişkin exe dosyanın tüm konumunu içeren ismidir.



Tool Help Fonksiyonlarıyla Process Listesinin Alınması

  • Bu durumda process listesini takip eden bir kod listesi şöyle olabilir:

  • {

  • BOOL bResult;

  • PROCESSENTRY32 processInfo = {sizeof(PROCESSENTRY32)};

  • HANDLE hSnapshot;

  • hSnapshot = CreateToolhelp32Snapshot(TH32_SNAPPROCESS, 0);

  • bResult = Process32Fist(hSnapshot, &processInfo);

  • while(bResult) {

  • printf("%s\n", processInfo.szExeFile);

  • bResult = bresult = Process32Next(hSnapshot, &processInfo);

  • }

  • CloseHandle(hSnapshot);

  • }



Tool Help Fonksiyonlarıyla Thread Listesinin Alınması

  • Her process'in n tane thread'i olabilir. Başka bir ifadeyle bir thread yalnızca bir process'e özgüdür.

  • Thread listesini alabilmek için tamamen process listesini almakta uygulanan adımlardan geçilir.

  • Process32First yerine Thread32First fonksiyonu, Process32Next yerine Thread32Next fonksiyonu kullanılır. PROCESSENTRY32 yapısı yerine de THREADENTRY32 yapısı kullanılmaktadır.



Tool Help Fonksiyonlarıyla Thread Listesinin Alınması

  • typedef struct tagTHREADENTRY32{

  • WORD dwSize;

  • WORD cntUsage;

  • WORD th32ThreadID;

  • WORD th32OwnerProcessID;

  • ONG tpBasePri;

  • LONG tpDeltaPri;

  • DWORD dwFlags;

  • } THREADENTRY32;

  • typedef THREADENTRY32 * PTHREADENTRY32;

  • typedef THREADENTRY32 * LPTHREADENTRY32



Tool Help Fonksiyonlarıyla Thread Listesinin Alınması

  • CreateToolhelp32Snapshot fonksiyonu şöyle çağırılmalıdır:

  • hThread = CreateToolhelp32Snapshot(TH32_SNAPTHREAD, 0);

  • Tool help ile sistemdeki bütün thread'lere ilişkin liste alınır. Ancak özel bir process'in thread listesi alınacaksa process ID'sinden hareketle tüm thread listesi taranmalı ve uygun olan thread'ler listeden seçilmelidir.



Process'lerin Durdurulması

  • Bir process kendi kodu içerisnde ExitProcess ile dışarıdan TerminateProcess ile durdurulabilir.

  • Process'in kendi kendisini güvenli bir biçimde sonlandırması en normal durumdur.

  • Dışarıdan sonlandırmak için önce process'e ilişkin thread'lerin ana pencerelerine WM_CLOSE mesajı gönderilmeli, böylelikle process'in kendi kendini sonlandırması için bir şans tanınmalıdır.

  • Process yine sonlanamazsa TerminateProcess uygulanabilir.



Process'lerin Giriş Kodları

  • Programcı açısından bir Windows programının başlangıç fonksiyonu şu 4 taneden biri olabilir:



Process'lerin Giriş Kodları

  • Tabii GUI uygulamaları için _tWinMain, console uygulamaları için _tmain isimleri kullanılabilir.

  • Ön işlemci bu isimleri _UNICODE sembolik sabitinin tanımlanıp tanımlanmadığına göre uygun olan fonksiyon ismine dönüştürecektir.

  • Ayrıca bir programın WinMain fonksiyonu ASCII olduğu halde bütün içeriği UNICODE olabilir.

  • Ya da tam tersi de mümkün olabilmektedir. Programcı açısından ilk çalışan fonksiyon bunlardan biri olmakla birlikte aslında çalışma başka bir modül halinde link edilen derleyicinin giriş kodundan(startup module) başlamaktadır.

  • Yani programın gerçek girişi derleyicinin giriş kodudur.

  • Bu kod içerisinden bizim programcı olarak varsaydığımız başlangıç kodu çalıştırılır.



Process'lerin Giriş Kodları

  • Derleyicilerin giriş kodlarının bulunduğu modül gerek DOS'ta gerekse Windows'da derleyiciyi yazan firma tarafından kaynak kod olarak verilmektedir. Windows'da bir exe dosya PE başlık kısmıyla birlikte belleğe bütün olarak yüklenir. Programın hangi adresten başlayarak çalışacağı PE formatının başlık kısmında yazmaktadır.



Process'lerin Giriş Kodları

  • Windows'da uygulamalara bağlı olarak 4 tür giriş kodu vardır. Bu giriş kodlarının isimleri şunlardır:



Process'lerin Giriş Kodları

  • Bir Windows programının içinde bu başlangıç kodlarından yalnızca bir tanesi bulunur. Bu başlangıç kodu da uygun başlangıç fonksiyonunu çağırır. Linker'ın hangi giriş kodunu exe dosyaya yazacağı subsystem parametresiyle belirlenir. Bu parametre iki biçimde olabilir:

  • 1. Console (/subsystem:console)

  • 2. Windows (/subsystem:windows)



Process'lerin Giriş Kodları

  • Eğer parametre olarak console seçilmişse linker bütün modülleri tarayarak main'in mi yoksa wmain'in mi programcı tarafından yazılmış olduğuna bakarak mainCRTStartup ya da wmainCRTStartup kodlarını exe dosyaya yazar.

  • Eğer parametre olarak windows verilmişse linker bu sefer WinMain ya da wWinMain fonksiyonlarından hangisinin tanımlandığına bakarak WinjMainCRTStartup ya da wWinMainCRTStartup kodlarını exe dosyaya yazar.

  • /subsystem belirlemesi hiç yapılmayabilir, aslında en iyi yöntem budur. Bu durumda, linker 4 başlangıç fonksiyonundan hangisini bulursa ona uygun olan giriş kodunu exe dosyaya ekler.



Processlerin Belleğe Yüklenmesi ve Processlerin Adres Alanları

  • Sayfa tablosu kullanımından dolayı Windows'da process'lerin kullandığı bellekler tamamen birbirinden ayrılmıştır. Yani bir process çalışmaktayken hiçbir biçimde normal yöntemlerle diğerinin adres alanına ulaşamaz.

  • Normal bir Windows programı sanki 2 GB'lık bir adres alanında tek başına çalışıyormuş gibi yazılır.

  • Sayfa tablosunun yalnızca düşük anlamlı 2 GB'lık kısmı process'ler arası geçişte yeniden düzenlenir.

  • Yüksek anlamlı 2 GB'lık kısmı process'ler arası geçişte düzenlenmez. Yani her process yüksek anlamlı 2 GB'a erişebilir ve bu bölgeyi ortak bir biçimde kullanabilir.

  • Yüksek anlamlı 2 GB'lık bölümde sistem dll dosyaları ve işletim sisteminin kritik kodları bulunmaktadır. Ancak yüksek anlamlı 2 GB'lık kısım sisteme ilişkin olduğu için çeşitli biçimlerde korunmuştur. O bölgeye yapılan izinsiz erişimler sayfa hatasına yol açabilir.



Sayfaların Commit Edilmesi

  • Her process'in diskte bir dosya olarak karşılığı vardır. Örneğin bir process 15 MB exe dosyasına sahipse, bu 15MB/4KB kadar sayfa eder ve process'ler arası geçişte bu sayfaların yalnızca bir bölümü yüklenebilir.

  • Programın akışı RAM'de olmayan bir sayfaya geldiğinde sayfa hatası(page fault) kesmesi çağırılır. İşletim sistemi erişilmek istenen adresin process'e ilişkin dosyada karşılığı olup olmadığına bakar.

  • Eğer karşılığı varsa o sayfayı RAM'e çeker ve sayfa tablosunu da güncelleştirir. Ancak erişilmek istenen adres process dosyasında yoksa Windows sayfa değiştirmesini yapamaz. Bu durumda error vererek programı sonlandırır.

  • Bir sayfanın process dosyasında(swap file) karşılığı varsa o sayfaya commit edilmiş sayfa denir. Yoksa commit edilmemiş sayfa denir.



Sayfaların Commit Edilmesi

  • Örneğin 15 MB'lık bir process içerisinde 15 MB'ın ötesinde bir yere erişmek istediğimizde erişim yapılacağı sayfa commit edilmemiş olduğundan process sistem tarafından sonlandırılacaktır. Tabii yüksek anlamlı 2 GB'lık bölümün de her yeri commit edilmemiştir.

  • Örneğin process içerisinde malloc fonksiyonu ile dinamik tahsisat yapılsın; bu alan sistem tarafından commit edilir ve process dosyası büyütülür. Tahsis edilen bloğa erişmeye çalıştığımızda bütün alan commit edildiği için hiçbir problemle karşılaşılmayacaktır.



Sayfaların Commit Edilmesi

  • Özetle Windows'da bir gösterici hatası yaptığımızda bu hatadan diğer process'ler etkilenmezler. Olsa olsa kendi process'imiz etkilenir.

  • Gösterici içerisindeki adres commit edilmemiş bir bölgeye rastladıysa zaten process hemen sonlandırılır.

  • Process'lerin bu biçimde bellek alanlarının ayrılması sistem güvenliği ve bellek kullanım kapasitesi bakımından istenen olumlu bir özelliktir.



Sayfaların Commit Edilmesi

  • Ancak pek çok uygulamada process'lerin birbirlerine bilgi iletmesi istenir.

  • Bu işlem böyle bir sistemde işletim sisteminin müdahalesiyle özel yöntemler kullanılarak gerçekleştirilebilir.

  • Process'lerin birbirlerine bilgi iletmesi konusuna işletim sistemlerinde process'ler arası haberleşme(interprocess communication) denir.

  • Process'ler arasındaki haberleşme iki kısımda incelenebilir:

  • 1. Aynı makinanın process'leri arasında haberleşme,

  • 2. Network altında farklı makinaların process'leri arasındaki haberleşme.



Yüklə 456 b.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©www.genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə