Selam tlhelp32.h kütüphanesinin nasıl kullanılacağından bahsedeceğim.
Öncelikle tlhelp32.h kütüphanesinin ne olduğunu ve neden bunu kullandığımıza dair kısa bir bilgiyle başlayalım, sonrasında temel bir bakış ve kodlama kısmına geçiş yapalım.
TLHELP32.H NEDİR - NEDEN KULLANILIR?
tlhelp32.h, Windows işletim sistemlerindeki proseslerin bir listesini almak veya bir proses oluşturmak için kullanılan geniş bir kütüphanedir. Peki, proeses ne demek?
Bildiğiniz üzere programlar disk üzerinde belirli bir alan kaplarlar ve bu programları çalıştırdığımız zaman işletim sistemi bellek üzerinde programa bir alan tahsis eder.
Görev yöneticisi üzerinden de bu prosesleri görüntüleyebilmek mümkündür ama bunu herkesin bildiğini düşündüğüm için nasıl yapıldığından bahsetmeyeceğim.
"Tamam ama biz neden bunu kullanacağız?" dediğinizi duyar gibiyim, bizim bu projedeki amacımız çalışan proseslerin bir listesini almak ve kullanıcı girdisine göre proses'in pid (Process ID) numarasını ekrana yazdırmak. PID; çalışan programın benzersiz numarası, imzası.
GENEL BAKIŞ
Evet, işin tekniğini incelediğimiz kısma geldik. Dilerseniz kullanacağımız veri türlerine ve fonksiyonlara kısa bir göz atalım.
1 -> PROCESSENTRY32
2 -> HANDLE
3 -> DWORD
1 - PROCESSENTRY32; Windows API'de kullanılan bir struct yapısıdır ve bir proses hakkında bilgi tutmak için kullanılır. Parametreleri ise şu şekildedir: dwSize, th32ProcessID, szExeFile[MAX_PATH]. Bu parametrelerin açıklamalarını yapmak çok uzun olduğundan sadece kullanacağımız parametrelere değindim ve açıklamalarını kodlama esnasında göstereceğim.
2 - HANDLE; Windows API'de, bir sistem nesnesini (örneğin bir pencere, dosya, işlem, thread, vb.) temsil eden bir tür tanıtıcıdır. Bir handle, belirli bir nesneye işaret eden bir tür referans ya da işaretçidir, ancak doğrudan nesnenin kendisi değildir.
3 - DWORD; Windows API'de yaygın olarak kullanılan bir veri türüdür ve Double Word (Çift Kelime) anlamına gelir. Bir DWORD 32 bit (4 byte) uzunluğundadır ve genellikle bir tam sayı değeri olarak kullanılır.
Fonksiyonlara kodlama esnasında değinmek daha mantıklı olur diye düşünüyorum, aynı zamanda konuyu fazla uzatmamış oluruz. Dilerseniz artık kodlama kısmına geçiş yapalım.
KODLAMA
Öncelikle iskeleti oluşturalım:
C++:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Lutfen hedef bir proses giriniz.\n");
return -1;
}
return 0;
}
Burada command line input alıyoruz ve eğer kullanıcı 2'den az bir argüman girerse mesajı yazdırıp programı sonlandırıyoruz.
Değişkenleri oluşturalım ve değer atamalarını yapalım:
C++:
HANDLE hProc = NULL;
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(PROCESSENTRY32);
dwSize struct yapısının bayt cinsinden boyutudur. Eğer boyut ayarlanmazsa kullanım sırasında hatalar oluşur ve kod çalışmaz.
Çalışan proseslerin bir listesini çıkartalım:
C++:
hProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProc == INVALID_HANDLE_VALUE)
return -1;
CreateToolhelp32Snapshot'un ilk parametresi işletim sistemi üzerinde çalışan bütün prosesleri çekeceğimizi söylüyor, ikinci parametre ise hangi süreci belirteceğimizi söylüyor. 0 ise bütün süreçleri alıyoruz.
Süreçler üzerinde dolaşalım ve hedef proses'in pid'sini almaya çalışalım:
C++:
while (Process32Next(hProc, &procEntry)) {
if (strcmp(procEntry.szExeFile, argv[1]) == 0) {
printf("Hedef proses: %s\n", procEntry.szExeFile);
printf("Hedef proses PID: %d\n", procEntry.th32ProcessID);
break;
} else {
printf("%s : %d\n", procEntry.szExeFile, procEntry.th32ProcessID);
printf("---------------\n");
}
}
Process32Next ile proses listesinde dolaşıyoruz. İlk parametre hProc ile aldığımız süreçlerin listesi, ikinci parametre ise processentry32 yapısına işaret eden değişken. Bir sonraki sürecin bilgilerini (isim, pid) processentry32 ile oluşturulan değişken içerisine aktarılır.
strcmp kullanarak hedef proses ismiyle liste içindeki proses isimlerini karşılaştırıyor ve eşit olduğu durumda ekrana yazıyoruz. Harici bir durumda ise liste içindeki prosesleri düzenli bir biçimde ekrana yazdırıyoruz.
Son aşama:
C++:
CloseHandle(hProc);
CloseHandle kullanarak oluşturduğumuz işlemi sonlandırıyoruz.
KODLARIN TAMAMI - PROGRAM EKRAN ÇIKTISI
Kodların tamamı şu şekilde:
C++:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Lutfen hedef bir proses giriniz.\n");
return -1;
}
HANDLE hProc = NULL;
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(PROCESSENTRY32);
hProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProc == INVALID_HANDLE_VALUE)
return -1;
while (Process32Next(hProc, &procEntry)) {
if (strcmp(procEntry.szExeFile, argv[1]) == 0) {
printf("Hedef proses: %s\n", procEntry.szExeFile);
printf("Hedef proses PID: %d\n", procEntry.th32ProcessID);
break;
} else {
printf("%s : %d\n", procEntry.szExeFile, procEntry.th32ProcessID);
printf("---------------\n");
}
}
CloseHandle(hProc);
return 0;
}
Programın ekran çıktısı:
Öncelikle tlhelp32.h kütüphanesinin ne olduğunu ve neden bunu kullandığımıza dair kısa bir bilgiyle başlayalım, sonrasında temel bir bakış ve kodlama kısmına geçiş yapalım.
TLHELP32.H NEDİR - NEDEN KULLANILIR?
tlhelp32.h, Windows işletim sistemlerindeki proseslerin bir listesini almak veya bir proses oluşturmak için kullanılan geniş bir kütüphanedir. Peki, proeses ne demek?
Bildiğiniz üzere programlar disk üzerinde belirli bir alan kaplarlar ve bu programları çalıştırdığımız zaman işletim sistemi bellek üzerinde programa bir alan tahsis eder.
Görev yöneticisi üzerinden de bu prosesleri görüntüleyebilmek mümkündür ama bunu herkesin bildiğini düşündüğüm için nasıl yapıldığından bahsetmeyeceğim.
"Tamam ama biz neden bunu kullanacağız?" dediğinizi duyar gibiyim, bizim bu projedeki amacımız çalışan proseslerin bir listesini almak ve kullanıcı girdisine göre proses'in pid (Process ID) numarasını ekrana yazdırmak. PID; çalışan programın benzersiz numarası, imzası.
GENEL BAKIŞ
Evet, işin tekniğini incelediğimiz kısma geldik. Dilerseniz kullanacağımız veri türlerine ve fonksiyonlara kısa bir göz atalım.
1 -> PROCESSENTRY32
2 -> HANDLE
3 -> DWORD
1 - PROCESSENTRY32; Windows API'de kullanılan bir struct yapısıdır ve bir proses hakkında bilgi tutmak için kullanılır. Parametreleri ise şu şekildedir: dwSize, th32ProcessID, szExeFile[MAX_PATH]. Bu parametrelerin açıklamalarını yapmak çok uzun olduğundan sadece kullanacağımız parametrelere değindim ve açıklamalarını kodlama esnasında göstereceğim.
2 - HANDLE; Windows API'de, bir sistem nesnesini (örneğin bir pencere, dosya, işlem, thread, vb.) temsil eden bir tür tanıtıcıdır. Bir handle, belirli bir nesneye işaret eden bir tür referans ya da işaretçidir, ancak doğrudan nesnenin kendisi değildir.
3 - DWORD; Windows API'de yaygın olarak kullanılan bir veri türüdür ve Double Word (Çift Kelime) anlamına gelir. Bir DWORD 32 bit (4 byte) uzunluğundadır ve genellikle bir tam sayı değeri olarak kullanılır.
Fonksiyonlara kodlama esnasında değinmek daha mantıklı olur diye düşünüyorum, aynı zamanda konuyu fazla uzatmamış oluruz. Dilerseniz artık kodlama kısmına geçiş yapalım.
KODLAMA
Öncelikle iskeleti oluşturalım:
C++:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Lutfen hedef bir proses giriniz.\n");
return -1;
}
return 0;
}
Burada command line input alıyoruz ve eğer kullanıcı 2'den az bir argüman girerse mesajı yazdırıp programı sonlandırıyoruz.
Değişkenleri oluşturalım ve değer atamalarını yapalım:
C++:
HANDLE hProc = NULL;
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(PROCESSENTRY32);
dwSize struct yapısının bayt cinsinden boyutudur. Eğer boyut ayarlanmazsa kullanım sırasında hatalar oluşur ve kod çalışmaz.
Çalışan proseslerin bir listesini çıkartalım:
C++:
hProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProc == INVALID_HANDLE_VALUE)
return -1;
CreateToolhelp32Snapshot'un ilk parametresi işletim sistemi üzerinde çalışan bütün prosesleri çekeceğimizi söylüyor, ikinci parametre ise hangi süreci belirteceğimizi söylüyor. 0 ise bütün süreçleri alıyoruz.
Süreçler üzerinde dolaşalım ve hedef proses'in pid'sini almaya çalışalım:
C++:
while (Process32Next(hProc, &procEntry)) {
if (strcmp(procEntry.szExeFile, argv[1]) == 0) {
printf("Hedef proses: %s\n", procEntry.szExeFile);
printf("Hedef proses PID: %d\n", procEntry.th32ProcessID);
break;
} else {
printf("%s : %d\n", procEntry.szExeFile, procEntry.th32ProcessID);
printf("---------------\n");
}
}
Process32Next ile proses listesinde dolaşıyoruz. İlk parametre hProc ile aldığımız süreçlerin listesi, ikinci parametre ise processentry32 yapısına işaret eden değişken. Bir sonraki sürecin bilgilerini (isim, pid) processentry32 ile oluşturulan değişken içerisine aktarılır.
strcmp kullanarak hedef proses ismiyle liste içindeki proses isimlerini karşılaştırıyor ve eşit olduğu durumda ekrana yazıyoruz. Harici bir durumda ise liste içindeki prosesleri düzenli bir biçimde ekrana yazdırıyoruz.
Son aşama:
C++:
CloseHandle(hProc);
CloseHandle kullanarak oluşturduğumuz işlemi sonlandırıyoruz.
KODLARIN TAMAMI - PROGRAM EKRAN ÇIKTISI
Kodların tamamı şu şekilde:
C++:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Lutfen hedef bir proses giriniz.\n");
return -1;
}
HANDLE hProc = NULL;
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(PROCESSENTRY32);
hProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProc == INVALID_HANDLE_VALUE)
return -1;
while (Process32Next(hProc, &procEntry)) {
if (strcmp(procEntry.szExeFile, argv[1]) == 0) {
printf("Hedef proses: %s\n", procEntry.szExeFile);
printf("Hedef proses PID: %d\n", procEntry.th32ProcessID);
break;
} else {
printf("%s : %d\n", procEntry.szExeFile, procEntry.th32ProcessID);
printf("---------------\n");
}
}
CloseHandle(hProc);
return 0;
}
Programın ekran çıktısı:

