İşletim sisteminin içsel çalışmasına özgü olan nesnelere(handle alanlarına) kernel nesneleri denir. Örnek kernel nesneleri şunlardır.
1 |
Process,Thread,Mutex,Event,File,Semaphore |
Ö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 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.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.
1 |
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.
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. yani ö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.
Bir kernel nesnesi başka bir process tarafından ikinci kez yaratıldığında gerçekte yeni bir kernel nesnesi oluşturulmaz. iş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.
Örneğin 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.
Buradan çıkan sonuç şudur.
Yalnızca process handle değeri ile process datavase’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. 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.
İyi çalışmalar.