|  | 
        
            | 
                    
                        | Windows API ile Proseslerin Kontrolü |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  | 
        
            | 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 :
 
 
 
						
							| 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
 );
 |  
 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.
 
 
 
					
						| { BOOL bResult;
 STARTUPINFO startupInfo = { 
									sizeof(STARTUPINFO) };
 PROCESS_INFORMATION 
									processInformation;
 
 bResult = CreateProcess(NULL, 
									"NOTEPAD.EXE C:\\a.txt", NULL, NULL, TRUE, 0, NULL, NULL, &startupInfo, 
									&processInformation);
 
 if (!bResult)
 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:
 
 
 
				
					| HANDLE WINAPI 
								CreateToolhelp32Snapshot( DWORD dwFlags,
 DWORD th32ProcessID
 );
 |  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 :
 
 
 
				
					| BOOL WINAPI 
								Process32First( HANDLE hSnapshot,
 LPROCESSENTRY32 lppe
 );
 BOOL WINAPI Process32Next(
 HANDLE hSnapshot,
 LPROCESSENTRY32 lppe
 );
 |  
 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.
 
 
 
				
					| 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;
 |  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.
 
 
 
				
					| { BOOL bResult;
 PROCESSENTRY32 processInfo = 
								{sizeof(PROCESSENTRY32)};
 HANDLE hSnapShot;
 hSnapShot = 
								CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 bResult = Process32First(hSnapShot, 
								&processInfo);
 while(bResult) {
 printf("%s\n", processInfo.szExeFile);
 bResult = Process32Next(hSnapShot, &processInfo);
 }
 CloseHandle(hSnapShot);
 }
 |  
 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.
 
 
 
 
 
                Makale:Windows API ile Proseslerin Kontrolü C ve Sistem Programlama Oğuz Yağmur
 | 
        
            |  | 
        
            |  | 
        
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         | 
        
            |  |