|
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
|
|