Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Oğuz Yağmur
Oğuz Yağmur
http://www.oguzyagmur.com
İletişme geçmek için tıklayın.
26 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: belirtir. createprocess degerini fonksiyon fonksiyonlari fonksiyonunu handle listesini listesinin process processentry32 processin proses proseslerin yapinin C / Sys Prog. Oğuz Yağmur
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 2.4.2006
Okunma Sayısı : 27374
Yorum Sayısı : 2     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 21.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 21.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 21.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 21.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows API ile Proseslerin Kontrolü
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon

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
  • Yazılan Yorumlar
  • Yorum Yaz
AĞU
17
2010
Hocam örnek kodlar için verdiğiniz link çalışmıyor
HAZ
9
2004
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.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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