Windows API ile Proseslerin Kontrolü
İlgili etiketler: belirtir. createprocess degerini fonksiyon fonksiyonlari fonksiyonunu handle listesini listesinin process processentry32 processin proses proseslerin yapinin C / Sys Prog. Oğuz Yağmur
Yayınlanma Tarihi : 2.4.2006
Okunma Sayısı : 18498
Conda install environment.yml Package 17.6.2019
Mac OS/X Removing CUDA 17.6.2019
Vue ve NW.js ile Desktop Uygulaması Geliştirmek 17.6.2019
Blazor ile Hello World Uygulaması Geliştirmek 17.6.2019
Ana Sayfa / Makaleler / C / Sys Prog. / Windows API ile Proseslerin Kontrolü
Bu yazıda, proses kavramını incelemeye çalışacak ve sistemdeki proseslerin listesini alacağımız bir uygulama geliştireceğiz. Öncelikle proses kavramına açıklık getirelim: Bildiğimiz gibi programlar diskte bulunur ve bu programlar bizim için bir sadece dosyadan ibarettir. Prosesise çalışmakta olan programdır. Bir program çalışmaya başladığında işletim sistemi bu process için bellekte dinamik olarak bir alan tahsis ederek process için gerekli bilgileri bu alana yazar. Bütün processler için bu işlem gerçekleştiğinden, sistem genel olarak bir proseslistesi oluşturur. Peki bu prosesler nasıl oluşur?. Windows’da bir proses oluşturmak için CreateProcess API fonksiyonunu kullanırız. Bu fonksiyon bir exe dosyasının ismini alıp, programı belleğe yükleyerek çalıştırır ve processin bilgilerini process listesine ekler. Peki uzantısı exe olmayan dosyalara çift tıkladığımızda neler olur? Öncelikle Windowsun kendi programı, ilgili dosyanın uzantısını alarak registryde bu uzantılı dosya ile hangi exenin ilişkilendirildiğini bulmak için arama yapar. Bulduğunda ise dosya ile ilişkili exe yi CreateProcess fonksiyonu ile açar ve tıkladığımız dosyayı bu programa komut satırı argümanı olarak geçirir.
Şimdi CreateProcess fonksiyonunu daha yakında inceleyelim. Bu fonksiyon 10 parametre alır. Prototipi şöyledir :
LPCTSTR lpApplicationName : Çalıştırılacak exe dosyasının ismidir.
LPTSTR lpCommandLine : main ya da WinMain fonksiyonlarına aktarılacak komut satırı argümanlarını belirtir.
LPSECURITY_ATTRIBUTES lpProcessAttributes ve LPSECURITY_ATTRIBUTES lpThreadAttributes : Windows2000 ve NT sistemlerinde önemli olan güvenlik bilgileri için kullanılır. NULL olarak geçilebilir.
BOOL bInheritHandles: Eğer bir process başka bir process tarafında oluşturulmuşsa, oluşturulan processin, oluşturan processin bilgilerini kullanıp kullanmayacağını belirtir. Genellikle TRUE olarak kullanılır. DWORD dwCreationFlags : Processin öncelik değerini belirtir. 0 değeri verilebilir.
LPVOID lpEnvironment : kullanılacak çevre değişkenlerine sahip yazının adresidir. NULL değer verildiğinde kendisini oluşturan processin çevre değişkenlerini kullanır.
LPCTSTR lpCurrentDirectory : Programın default dizinini belirtir. NULL değer verildiğinde, CreateProcess fonksiyonunu çağıran programın default dizini kullanılır.
LPSTARTUPINFO lpStartupInfo : STARTUPINFO türünden bir yapının adresini belirtir. CreateProcess bu yapının içini bazı önemli bilgileri saklamak için kullanır.
LPPROCESS_INFORMATION lpProcessInformation : PROCESS_INFORMATION türünden bir yapının adresini belirtir. Bu yapının önemli elemanları ,yaratılan processin Handle ve ID değerleridir.
Şimdi küçük bir uygulama yapalım. Amacımız notepad.exe yi kullanarak C:\a.txt dosyasını açmak.
Bunun için CreateProcess ile bir process oluşturup notepad.exe’yi açacak ve komut satırı argumanı olarak C:\a.txt dosyasını vereceğiz.
bResult = CreateProcess(NULL, "NOTEPAD.EXE C:\\a.txt", NULL, NULL, TRUE, 0, NULL, NULL, &startupInfo, &processInformation);
MessageBox(NULL, "Process oluşturulamadı", "Hata!!!", MB_OK);
Mevcut Proseslerin Listesinin Alınması :
Proses listesinin bilgilerine ulaşmak ve bu listeyi takip etmek için kullanacağımız fonksiyonlara genel olarak “tool help” fonksiyonları denir. Win9x ve 2000 de bu fonksiyonlar toolhelp.dll içindeydiler. Fakat Microsoft daha sonra bu fonksiyonların link bilgilerini kernel32.lib dosyasına dahil etti. Bu fonksiyonların prototipleri tlhelp32.h dosyası içindedir. Eğer bu fonksiyonları kullanmak istiyorsak tlhelp32.h dosyası projeye eklenmelidir.
Process listesini almak için ilk olarak CreateToolhelp32Snapshot fonksiyonunu kullanacağız. Bu fonksiyon ile elde edilen handle değerini diğer tool help fonksiyonları kullanacaktır. Fonksiyonun prototipi şu şekildedir:
Prototipte belirtilen parametrelerin açıklamaları şu şekildedir:
DWORD dwFlags : Bu fonksiyonu kullanış amacımızı belirtir. Eğer process listesini almak için kullanıyorsak TH32CS_SNAPPROCESS değerini verebiliriz.(bu fonksiyon thread, heap listelerinin alınması için de kullanılabilir)
DWORD th32ProcessID : Bu parametrenin process listesi alınırken bir önemi yoktur. 0 değeri verilir.
Daha sonra Process32First fonksiyonunu kullanırız. Son adımda ise Process32Next fonksiyonunu kullanarak bir döngü yardımı ile process listesi alınır. Bu iki fonksiyonun prototipleri aynı olup şu şekildedir :
HANDLE hSnapshot : CreateToolhelp32Snapshot fonksiyonundan elde edilen handle değerini belirtir.
LPROCESSENTRY32 lppe : PROCESSENTRY32 isimli bir yapının adresini belirtir.
PROCESSENTRY32 yapısını kullanarak process hakkında önemli bilgiler edinebiliriz.
Bu yapının en önemli elemanlarına kısaca bakalım:
th32ProcessID : Process’in ID değerini vermektedir.
cntThreads : Process’in çalışan thread sayısını gösterir.
th32ParentProcessID : Oluşturulan process hangi proses tarafından oluşturulmuşsa o prosesin ID değerini verir.
szExeFile : Oluşturulan prosesin exe dosyasının ismini verir.
Şimdi sistemdeki varolan proseslerin listesini alan örneğimizi yazabiliriz.
Bu yazımızda, Windows’ta proseslerin oluşturulmasını, proses listesinin alınmasını, bu listenin alınmasında kullandığımız fonksiyonları ve yapıları inceledik. Bu yazının proseslerle ilgili daha detaylı çalışmalarınız için bir başlangıç olacağını umuyorum.
Proses listesinin alınarak listboxa eklenmesinden oluşan bir uygulamanın, çalıştırılabilir dosyasını ve kaynak kodunu buradan indirebilirsiniz.
Windows API ile Proseslerin Kontrolü C ve Sistem Programlama Oğuz Yağmur
Tercan TAPAN / üye hakkında
Hocam örnek kodlar için verdiğiniz link çalışmıyor
o anki calisan tum process lerin bulunmasi yonunden kullanilan cozum fakat gercek hedefiniz tum processler degil de 1-2process in varligini kontrol etmek ise o zaman ciddi performans sorunlari yasiyorsunuz. O yuzden yaratilan processin IDsini tutmak ve ona gore kontrol yapmak da bir cozum olablir.