İşletim Sistemi Tarihçesi İLK NESİL iŞLETİM SİSTEMLERİ (1945

advertisement
İşletim Sistemi Tarihçesi İLK NESİL iŞLETİM SİSTEMLERİ (1945 – 1955)
1940 larda Howard Aiken, John von Neumann, Jpresper Eckert ve William Mauncley VAKUM TÜPLERİ
kullanarak ilk hesap yapabilen motorlar üretmişlerdir. Bu makineler odalar dolusuydu ve binlerce
tüpten oluşuyordu. Başka makineler üretilmiş, bu makinelerin fişlerinin farklı yerlere takılıp
çıkartılması ile programlama yapılabiliyordu. 1950 lerde delikli kartlar (punch cart) çıkmıştır.
Programlar bu kartlar üzerine delikler ile işleniyordu.
İKİNCİ NESİL, TRANSİSTÖRLER VE TOPLU İŞ(BATCH) SİSTEMLERİ
Bu makineler müşterilere satılabilecek hale ve güvenilirliğe gelmişlerdi. Çok pahalı olduğu için büyük
kurumlar, devletler ya da üniversiteler alabiliyordu. Bir iş yaptırmak için program FORTRAN ya da
ASSEMBLER ile bir kağıda yazılır. Sonra bu program delikli kartlara aktarılır. Bu kartlar sırasıyla
makinelerde işletilirdi. Programların kartlardan aktarılma işlemi süresini azaltmak amacıyla toplu iş
sistemleri (batch systems) geliştirilmiştir.
İKİNCİ NESİL, TRANSİSTÖRLER VE TOPLU İŞ(BATCH) SİSTEMLERİ
Bu sistemde programlar kart okuyucusundan manyetik teyp'e kayıt edilir, bu teyp bilgisayarda
çalıştırılır, çıktılar manyetik teype kayıt edilir. Başka yerden de çıktılar yazıcılar ile alınırdı.
ÜÇÜNCÜ NESİL (1965-1980) ENTEGRE DEVRELER VE ÇOKLU PROGRAMLAMA (Multi Programming)
Mevcut ortamda sayısal hesaplamalar için kullanılan IBM 7094 ve karakter işlemleri için kullanılan
IBM 1401 vardı.
İkisinin gücünü IBM birleştirerek System/360 isimli bir sistem oluşturdu. Hem matematiksel hem de
ticari işler için geliştirilmişti. 360 ilk kez entegre devreleri kullanan bilgisayardır.
Bu sistemde kullanılan işletim sistemi OS/360 dır. Bu sistemde çoklu programlama kavramı ortaya
çıkmıştır.
Eskiden bir iş çalışırken I/O nedeniyle beklediğinde başka bir iş çalışmazdı. OS/360 ile bellek birden
fazla parçaya ayrılmış ve her parçada başka işin çalışması sağlanmıştır.
Bir işin çalışması I/O için askıya alındığında, bellekteki başka bir işe geçilirdi. Diğer yeniliği kartlardaki
programları diske okuması ve programları diskten yüklemesidir.
DÖRDÜNCÜ NESİL (1980-1990) KİŞİSEL BİLGİSAYARLAR
LSI(Large Scale Integration) büyük ölçekli entegre devrelerin geliştirilmesi ile (1 cm slikon üzerinde
yüzlerce transistör vardır) kişisel bilgisayarlar üretilmiştir. PDP-11 sınıfı sistemlerden farklı değildirler
fakat fiyatları daha ekonomiktir.
1974 de Intel 8080 8 bitlik bir CPU geliştirmiştir. Bu CPU için bir işletim sistemi aranmaktaydı. Gary
Kildall CP/M (Control Program for Microcomputers) isimli bir işletim sistemi geliştirmiştir.
1980 lerde IBM, IBM PC isimli bir bilgisaayr geliştirmiştir.
IBM yeni sistemi için Bill Gates den BASIC yorumlayıcısının lisansı için anlaşırken işletim sistemi
konusunu da görüştüler.
Bill Gates en büyük işletim sistemi üreticisi olan Digital Research firmasını önerdi(CP/M). Firma IBM
'in isteklerini kabul etmedi. IBM Bill Gates'e tekrar teklif verdi
İşletim Sistemi Türleri
* Mainframe (Ana Çatı) sistemleri
* Sunucu(Server) işletim sistemleri
* Çok işlemcili işletim sistemleri
* Kişisel bilgisayar işletim sistemleri
* Gerçek Zamanlı(real-time) işletim sistemleri
*Gömülü(embedded) işletim sistemleri
*Akıllı-kart(smart card) işletim sistemleri
Anaçatı(Mainframe) İşletim Sistemleri
*Yoğun I/O işlemi gerektiren çok sayıda görev çalıştırmaya yönelik sistemler için kullanılır:
Hizmetleri:
1. toplu iş(batch) kipinde çalışma. Örneğin, aynı anda tüm kullanıcıların belirli hesaplarını güncelleme
gibi.
2.birim-iş[hareket] (transaction) işleme. Örneğin, rezervasyon işlemleri gibi.
3.zaman paylaşımlı çalışma. Örneğin, veritabanı sorgulama
Sunucu İşletim Sistemleri




Sunucular üzerinde çalışırlar.
sunucuların kaynak kapasiteleri yüksektir.
bağlı iş istasyonları vardır.
anaçatı sistemler bulunur.
Bilgisayar ağı üzerinden çok sayıda kullanıcıya hizmet verir.


donanım ve yazılım paylaştırma
yazıcı hizmeti, dosya paylaştırma, web erişimi,
Çok İşlemcili İşletim Sistemleri
-Birden fazla işlemcili bilgisayar sistemlerinde kullanılır.
-işlem gücünün arttırılması hedeflenmektedir.
-İşlemcilerin bağlanma şekillerine göre sistemler gruplanırlar:
*paralel sistemler
*grid sistemler
*çok işlemcili sistemler
özel işletim sistemi tasarlanabilir.
Kişisel Bilgisayar İşletim Sistemleri
-Kullanıcıya etkin ve kolay kullanılabilri bir arayüz sunmak.
-ofis uygulamaları gibi programlar mevcuttur.
Windows 98,2000,XP
MacOS
Linux
Gerçek Zamanlı İşletim Sistemleri
Endüstriyel kontrol sistemlerinde kullanılırlar. Zaman kısıtlaması çok önemlidir.
Örnek:VxWorks , QNX
Gömülü(Embedded) İşletim Sistemleri
avuç-içi bilgisayarlar ve gömülü sistemlere yönelik tasarlanmıştır.
kısıtlı ve özel amaçlı işlevler içerir.
TV, mikrodalga fırın, çamaşır makinesi, cep telefonları için geliştirilmiş sistemler.
Bazı sistemlerde boyut, bellek ve güç harcama kısıtlamaları vardır.
PalmOS , WindowsCE, Symbian OS
Akıllı Kart(Smart Card)İşletim Sistemleri
-En küçük işletim sistemi türüdür.
-Kredi kartı boyutunda üzerinde işlemci olan kartlarda çalışır.
-İşlemci ve bellek kısıtlamaları çok önemlidir.
-bazı işletim sistemleri Java tabanlıdır.JVM içerir ve Java programları çalıştırabilirler.
Örn:MULTOS, Windows Embedded CE,SmartecOS
TEMEL İŞLETİM SİSTEMİ YAPILARI
1.Tek Parça (monolitik) Sistemler
2.Katmanlı(Layered) Sistemler
3.Sanal Makineler(Virtual Machines)
4.Dış-çekirdek(exo-kernel) Sistemler
5.Sunucu-İstemci Modeli (server-client)
Tek Parça(Monolitik) Sistemler
Bu mimaride genel bir yapı yoktur. İşletim sistemi büyük bir prosedür topluluğudur.
Tüm yapılabilecek işler işletim sisteminin içinde yer alır. İşlevleri yerine getiren tüm prosedürler aynı
seviyede yer alır ve birbirleri ile etkileşim yapabilirler. Çekirdek yapısı büyüktür.
Sanal Makineler (Virtual Machines)
-İlk kez IBM tarafından geliştirilmiştir. VM/370 ismiyle çıkmıştır.
-Amaç çoklu programlama ortamı ile tamamen donanıma bağımlı olan kısmı birbirinden ayırmaktır.
-Sistemin temeline SANAL MAKİNE MONİTÖRÜ denilir.
Bu makine donanım üzerinde çalışır ve çoklu programlamayı gerçekleştirir.
-Birden fazla sanal makineyi bir üst katmanda çalıştırır.
Bu makineler asıl sistemin herşeyiyle birebir kopyasıdır.
-Her sanal makine farklı İşletim Sistemi çalıştırabilir.
Kabuk: İşletim sisteminin bir parçası olmayan yazılımdır.
Çekirdek:
Sistem Çağrıları: Sistem yazılımları ve fiziksel donanım arasındaki arayüzdür.
UNİXteki Sistem Çağrıları Windowstaki NT Sistem Servislerine eşittir.
O.S Yapıları
1.
2.
3.
4.
5.
6.
7.
8.
Basit (Yapısızlık Yapısı)
Mikroçekirdek
Hibrit
Modüler (Modüler çekirdek açılış ve çalışma anında dinamik olarak bağlanır.)
a. Window
b. Linux
Sanal Makinalar
Dış Çekirdek (ekzokernel)(Dışardan ve kısıtlı bir kaynak kullanmak istiyorsa ekzokernel)
Katmalı yapı
Sunucu İstemci Yapısı
KATMANLI MİMARİ
5 OPERTATÖR
4 KULLANICI PROGRAMLARI
3 GİRİŞ/ÇIKIŞ YÖNETİMİ
2 SÜREÇ-OPERATÖR İLETİŞİMİ
1 BELLEK YÖNETİMİ
0 İŞLEMCİ TAHSİS ETME VE ÇOKLU PROGRAMLAMA
SİSTEM ÇAĞRILARI
Uygulama
Sistem Çağrısı yap
Kullanıcı
Uzayı
Sistem
Çağrısından Dönüş
Çekirdek Uzayı
Sistem Çağrısı
FORK FONKSİYONU KULLANARAK ÇOCUK PROSES OLUŞTURMAK
#include<sys/types.h>
#include<unistd.h>
Sistem çağrısı için eklenen başlık dosyaları
#include<stdio.h>
main()
{
pid_t pid; //fork çağrısının dönüş tipi
pid=fork(); //yeni proses
if(pid==0)
printf("Ben çocuk%d/n",pid);
else
printf("Ben anne%d/n",pid);
}
pid: proses işlem,
pid 0 değerini döndürürse çocuk proses pozitif değer döndürürse anne prosestir.
Fork: Çocuk proses yaratır.
Clone: Anne çocuk ilişkkisi var. Aynı zamanda çocuğa bir ikiz kardeş yaratıyor.
Trap
(tuzak)
CLONE FONKSİYONU İLE ÇOCUK PROSES OLUŞTURMAK
#include<sched.h>
#include<stdio.h>
#include<malloc.h>
#define YIGIN_BOYUT 1024
int yeni_proses()
{
printf("yeni prosesim\n");
return 1
}
main()
{
int pid;
void *yigin;
yigin=malloc(YIGIN_BOYUT);
if(yigin==0)
{
printf("Bellek tahsis hatası");
exit(1);
}
pid=clone(&yeni_proses,(char*) yigin + YIGIN_BOYUT,0,0);
pid=waitpid(pid,0,0) //çocuk prosesin işlemini bitirmesini bekle
printf("cocuk proses sonlandı\n");
Free(yigin) //Çocuk prosese tahsis edilen bellek alanı serbest bırakılıyor.
}
Mallac;Bellek alanı tahsis etmek/almak.
Free;Çocuk prosese tahsis edilen bellek alanı serbest bırakılıyor.
26.02.2014
Wait sistem çağrısı
#include<sys/wait.h>
main()
{
pid_t pid //fork çağrısının dönüş değeri
int statu //çocuk prosesin sonlanma değeri
pid=fork() //çocuk proses burada oluşturuluyor.
if(pid==0)
printf("Ben çocuk proses\n")
else
{
printf("Ben anne proses,bekledim")
wait(&statu);
}
}
Proses Yönetim Apileri
Linux
Fork+exec
waitpid
exit
brk
getpid
getpgrp
setsid
ptrace
Windows
Creareprocess
WaitForSingleObject
ExitProcess
GetProcessID
DebugActiveProcess
Linux ve Windows sistem programlamadaki eşdeğer fonksiyonlar.
Uygulama 1: Not Defteri uygulamasını çalıştırıp ekrana, anne ve çocuk proseslerin PID’lerini yazdıran,
uygulama kapanıncaya kadar bekleyen C kodunu yazınız.
#include <windows.h>
#include <stdio.h>
char szClassName [ ] = "WindowsAPP";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
STARTUPINFO sai={0};
PROCESS_INFORMATION pi;
char sz[128];
MessageBox(NULL, "Not Defteri baslatiliyor...","Mesaj",MB_OK);
//Not defteri prosesi oluşturuluyor.
sai.cb=sizeof(sai);
CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,0,NULL,NULL,&sai,&pi);
//ekrana ebeveyn ve yeni process pidleri gösteriliyor//
sprintf(sz,"Ebeveyn PID: %d\nNot Defteri PID:%d",
GetProcessId(GetCurrentProcess()), pi.dwProcessId);
MessageBox(NULL,sz,"process ID",MB_OK);
//not defteri sonlanana kadar bekleyecek//
WaitForSingleObject(pi.hProcess,0); //Burada 0 yerine INFINITE de yazılabilir INFINITE
sabiti seçilirse bekleme süresi dikkate alınmayıp nesne işaretlenene kadar bekleyecektir. 0
yazıldığı takdirde direk Not Defterini çalıştıracaktır.
MessageBox(NULL,"Not defteri kapatildi","Mesaj",MB_OK);
//Handle Değişkeni Kapatılıyor//
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
}
BOOL WINAPI DebugActiveProcess(
DWORD dwProcessId);
1) Kodlar ilk çalıştırıldığında bu mesaj kutusu gelecektir.
2) Tamam tuşuna basıldıktan sonra Not Defteri açılarak Processler bu şekilde gösterilecektir.
3) Tamam tuşuna basıldığında bu mesaj kutusu gelecektir ve Buradaki tamama basıldıktan sonra
not defteri kapatılacaktır.
DebugActiveProcess(): proses için hata ayıklama sağlar. Fonksiyonun geri dönüş değeri TRUE ifadesi
ise fonksiyon başlatılacak.
Uygulama 2: Not Defteri uygulamasının DebugActiveProcess() API’siyle çökmesini sağlayan C kodunu
yazınız.
#include <windows.h>
#include <stdio.h>
int WINAPI WinMain (HINSTANCE hinst, HINSTANCE hprevinst,LPSTR cmd_line,int show_cmd)
{
STARTUPINFO sai={0};
PROCESS_INFORMATION pi;
DEBUG_EVENT dbevent;
CONTEXT context;
DWORD dw, buf;
//Not defteri prosesi oluşturuluyor.
sai.cb=sizeof(sai);
CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,0,NULL,NULL,&sai,&pi);
//Prosesin ekranda gözükmesi bekleniyor.
Sleep(1000);
//Hata ayiklama islemi baslatiliyor.
if(!DebugActiveProcess(pi.dwProcessId))
{
//Hata oluşursa ekrana mesaj gösteriliyor
MessageBox(NULL,"Hata ayiklama islemi
baslatilmadi!","Hata",MB_OK|MB_ICONERROR);
return -1;
}
//Hata ayiklama olayi bekleniyor.
while(WaitForDebugEvent(&dbevent, 0))
{
if(EXIT_PROCESS_DEBUG_EVENT==dbevent.dwDebugEventCode)
break;
//Proses oluşturulurken prosesin EIP yazmacına prosesin cokmesi icin 0xdeadbeed adresi
yaziliyor.
if(CREATE_PROCESS_DEBUG_EVENT==dbevent.dwDebugEventCode)
{
context.ContextFlags=CONTEXT_CONTROL;
GetThreadContext(dbevent.u.CreateProcessInfo.hThread,&context);
buf=0xdeadbeef;
WriteProcessMemory(dbevent.u.CreateProcessInfo.hProcess, context.Eip,
&buf ,sizeof(buf), &dw);
}
//Hata ayiklama islemine devam ediliyor.
ContinueDebugEvent(dbevent.dwProcessId,dbevent.dwThreadId,DBG_EXCEPTION_NOT_HA
NDLED);
}
return 0;
}
YÖNETİM APILERİ
Dosya yönetim API’leri
Linux
Windows
Create, mknod, open, Access
CreateFile
Close
CloseHandle
Read
ReadFile
Write
WriteFile
Lseek
SetFilePointer
Stat,fstat
GetFileInformationByHandle
Dup
DuplicateHandle
Pipe
CreatePipe
İoctl
DeviceİOControl
Rename
MoveFile
Readfile: Bir dosya yâda G/Ç aygıtından veri okumak için. Bunun da geri dönüş değeri false ise
fonksiyon başarısız.
Writefile: Bir dosya yâda G/Ç aygıtından veri yazmak için. Bunun da geri dönüş değeri false ise
fonksiyon başarısız.
Setfilepointer: Dosya içindeki konumu belirtir. Başarılı olduysa yeni işaretçi konumunu döndürür.
Getfileınformationbyhandle: Elinde tuttuğu dosya bilgilerini döndürür.
Bunun da geri dönüş değeri false ise fonksiyon başarısız.
Duplicatehandle: Handle değişkenin bir kopyasını elde etmek için.
Handle: Bir Windows nesnesidir. Bir kere kullanılan bir olayı n kendini tekrarlamasını engelleyebilir.
HANDLE WINAPI CreateFile(
_In_
LPCTSTR
_In_
DWORD
_In_
DWORD
_In_opt_ LPSECURITY_ATTRIBUTES
_In_
DWORD
_In_
DWORD
_In_opt_ HANDLE
);
lpFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile
Bir dosya ya da giriş çıkış birimi oluşturmak için kullanılır.
1.
2.
3.
4.
5.
6.
7.
Parametre oluşacak dosyanın adı
Parametre dosyaya erişim hakları
Parametre dosya hangi prosesler tarafından nasıl paylaşabilir.
Parametre güvenlik öznitelikleri
Parametre dosyanın önceden var olup olmadığı, varsa ne yapılacağı
Parametre dosyanın öznitelikleri
Parametre oluşacak dosyanın şablonu
BOOL WINAPI ReadFile(
_In_
HANDLE
_Out_
LPVOID
_In_
DWORD
_Out_opt_
LPDWORD
hFile,
lpBuffer,
nNumberOfBytesToRead,
lpNumberOfBytesRead,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
Dosyadan veri okumak için kullanılır.
1.parametre dosyaya ait Windows değişkenini alır.
2.parametre verinin okunacağı bellek bölgesini işaret eder.
3.parametre okunacak verinin bayt cinsinden miktarı
4.parametre okunan verinin bayt cinsinden miktarı
5.parametre paralel işlem yapmak için kullanılır
BOOL WINAPI WriteFile(
_In_
HANDLE
_Out_
LPVOID
_In_
DWORD
_Out_opt_
LPDWORD
_Inout_opt_ LPOVERLAPPED
);
hFile,
lpBuffer,
nNumberOfBytesToWrite,
lpNumberOfBytesWrite,
lpOverlapped
Dosyaya veri yazmak için kullanılır.
1.parametre dosyaya ait Windows değişkenini alır.
2.parametre verinin yazılacağı bellek bölgesini işaret eder.
3.parametre yazılacak verinin bayt cinsinden miktarı
4.parametre okunan verinin bayt cinsinden miktarı
5.parametre paralel işlem yapmak için kullanılır
DWORD WINAPI SetFilePointer(
_In_
HANDLE hFile,
_In_
LONG
lDistanceToMove,
_Inout_opt_ PLONG lpDistanceToMoveHigh,
_In_
DWORD dwMoveMethod
);
Dosya işaretçisinin dosya içindeki konumunu ayarlamak için kullanılır.
1.parametre işlem yapılacak olan dosyaya ait Windows değişkenini belirtir.
2.parametre dosya işaretçisinin ilerleyeceği meseafeyi bayt cinsinden belirtir.
3. parametre 64 bit olduğu zaman ne yapılacağını belirtir.
4.parametre işaretçinin konumlanma yöntemini belirlemek için kullanılır.
BOOL WINAPI DuplicateHandle(
_In_ HANDLE
hSourceProcessHandle,
_In_ HANDLE
hSourceHandle,
_In_ HANDLE
hTargetProcessHandle,
_Out_ LPHANDLE lpTargetHandle,
_In_ DWORD
dwDesiredAccess,
_In_ BOOL
bInheritHandle,
_In_
DWORD
dwOptions
);
Windows nesnesini kopyalamak için kullanılır. Fonksiyon başarısız ise geri dönüş değeri false dır.
1.
2.
3.
4.
5.
6.
7.
Parametre Windows nesnesine ait prosesi alır.
Parametre Windows nesnesini alır.
Parametre yeni oluşacak kopya Windows nesnesinin barınacağı hedef prosesi alır.
Parametre yeni oluşacak kopya Windows nesnesinin işaretçi değişkenini alır.
Parametre kopya nesne için erişim haklarını belirler.
Parametre kopya nesnesini miras alıp almayacağını belirtir.
Parametre baxı seçimsel işlemler için kullanılır.
ZAMAN.CPP
#include <stdio.h>
#include <windows.h>
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst,
LPSTR cmd_line, int show_cmd)
{
HANDLE hdosya;
BY_HANDLE_FILE_INFORMATION dosya_bilgi;
char bilgi[256];
SYSTEMTIME olus,duzen, soneris;
/*Dosya okumak için açılıyor */
hdosya = CreateFile("deneme.txt",GENERIC_ALL,
FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL);
/*hata oluşuyor ise */
if(INVALID_HANDLE_VALUE == hdosya){
MessageBox(NULL, "dosya acilamadi, dosya gerçekten varmı",
"HATA", MB_OK);
return -1;
}
/*dosya bilgisi alınıyor */
if(!GetFileInformationByHandle(hdosya,&dosya_bilgi))
{
MessageBox(NULL, "dosya bilgisi alınamadı",
"HATA", MB_OK);
CloseHandle(hdosya);
return -1;
}
/*dosya kapatma işlemi */
CloseHandle(hdosya);
FileTimeToSystemTime(&dosya_bilgi.ftCreationTime,&olus);
FileTimeToSystemTime(&dosya_bilgi.ftLastWriteTime,&duzen);
FileTimeToSystemTime(&dosya_bilgi.ftLastAccessTime,&soneris);
/*Ekranda bu bilgiler nasıl yazılacak*/
sprintf(bilgi,"Olusturulma zamani : : %02d.%02d.%04d %02d:02d\n",
"Degistirilme zamani : : %02d.%02d.%04d %02d:02d\n",
"Son Erisim zamani : : %02d.%02d.%04d %02d:02d\n",
olus.wDay, olus.wMonth, olus.wYear, olus.wHour, olus.wMinute,
duzen.wDay, duzen.wMonth, duzen.wYear, duzen.wHour, duzen.wMinute,
soneris.wDay, soneris.wMonth, soneris.wYear, soneris.wHour, soneris.wMinute);
MessageBox(NULL, bilgi,"Dosya Zamani" ,MB_OK | MB_ICONINFORMATION);
return 0;
}
İSİM_DEGİSTİRME.CPP
#include <windows.h>
int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst,
LPSTR cmd_line, int show_cmd)
{
if(!MoveFile("dnm.txt","ege.txt"))
{
MessageBox(NULL,"Dosya Adi Değiştirilemedi","HATA",MB_OK);
return -1;
}
return 0;
}
BAGLANTİ.CPP
#define _WIN32_WININT
#include<windows.h>
#define KLS_ADI "D:\\egemen2"
#define BAGLAMA_NOKTASI KLS_ADI "\\flash\\"
#define DOSYA_ADI "egemen2.txt"
int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst,
LPSTR cmd_line,int show_cmd)
{
BOOL donus;
HANDLE hdosya;
char bolum_adi[MAX_PATH];
SetCurrentDirectory("D:\\");
hdosya = CreateFile(DOSYA_ADI,GENERIC_ALL,FILE_SHARE_READ,
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE == hdosya)
{
MessageBox(NULL, "Dosya oluşturulamadı","Hata",MB_OK);
return -1;
}
MessageBox(NULL,"Dosya Olusturuldu","Bilgi",MB_OK);
CloseHandle(hdosya);
donus = CreateDirectory(KLS_ADI,NULL);
if(!donus)
{
MessageBox(NULL,"Klasor Oluşturulamadı","HATA",MB_OK);
return -1;
}
MessageBox(NULL,"Klasor Oluşturuldu","Bilgi",MB_OK);
donus = CreateHardLink(KLS_ADI DOSYA_ADI,"D:"DOSYA_ADI,NULL);
if(!donus)
{
MessageBox(NULL,"Hard Link oluşma Hatası","HATA",MB_OK);
return -1;
}
MessageBox(NULL,"Hard Link oluşturuldu","Bilgi",MB_OK);
CreateDirectory(BAGLAMA_NOKTASI,NULL);
donus = GetVolumeNameForVolumeMountPoint("D:\\", bolum_adi,
_countof(bolum_adi));
if(!donus)
{
MessageBox(NULL,"Bolüm İsmi Alınamadı","HATA",MB_OK);
return -1;
}
MessageBox(NULL,"Bölüm İsmi Alındı","Bilgi",MB_OK);
/*donus = SetVolumeMountPoint(BAGLAMA_NOKTASI,bolum_adi);
if(!donus)
{
MessageBox(NULL,"Flash baglanamadı","HATA",MB_OK);
return -1;
}
MessageBox(NULL,"Flash Baglandı","Bilgi",MB_OK);*/
DeleteVolumeMountPoint(BAGLAMA_NOKTASI);
RemoveDirectory(BAGLAMA_NOKTASI);
DeleteFile(KLS_ADI DOSYA_ADI);
DeleteFile(DOSYA_ADI);
RemoveDirectory(KLS_ADI);
return 0;
}
Güvenlik API leri
Linux
Chmod
Getuid
GetGid
setuid
setGid
Chown
Windows
SetFileAttributes (Dosyaya özellik ekler)
OpenProcessToken + (O prosesin jetonuna erişim
hakkı sağlar)
GetTokenInformation(Jeton hakkında bilgi verir.)
LogonUser + (Çevrimiçi Kullanıcılar)
ImpersenoteLoggedonUser + (Giriş yaptıktan çıkış
yapılan ana kadar o prosesi kullanım hakkını sağlıyor)
RevertToSelf(Bir prosesi başka proses tarafından
çağırılmasını iptal eder.)
setFileSecurity(Dosyaların Güvenliğini Sağlar)
DWORD DesiredAcces: Prosesten istenen erişim isimleri.
Örnek Problem:
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int
nCmdShow)
{
if(SetFileAttributes("deneme.txt",FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN))
MessageBox(NULL,"İslem basarisiz oldu","hata",MB_OK|MB_ICONERROR);
return 0;
}
BOOL WINAPI OpenProcessToken(
HANDLE ProcessHandle,
DWORD DesiredAccess,
PHANDLE TokenHandle
);
Yetim proses: Anne proses tarafından yaratılıyor. Ancak anne proses sonlanıyor. Sadece çocuk proses
kalıyor.
Zombi Proses: Ölü proses. İşlemini bitirmiş ama bilgileri bellekten silinemeyen.
Windows ortamında anne proses tarafından çalıştırılıp sonlanan bir çocuk prosesin sonlanma değerini
ekrana yazdıran C kodu;
#include <stdio.h>
#include <windows.h>
main()
{
STARTUPINFO sai={0};
PROCESS_INFORMATION pi;
DWORD exit_code;
sai.cb=sizeof(sai);
CreateProcess("c:\\windows\\notepad.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&sai,&pi);
WaitForSingleObject(pi.hProcess, 20000); //20000 yerine infinite olursa elle sonlandırılma
olur.
if(GetExitCodeProcess(pi.hProcess,&exit_code))
printf("Oluşturulan prosesin sonlanma degeri %d\n",exit_code);
}
---Kodları çalıştırdığımızda ekrana aşağıdaki görüntü gelir.
Not defterini kapattığımızdaysa aşağıdaki ekranla karşılaşırız.
Windows ortamında anne proses tarafından çalıştırılıp sonlandırılan bir çocuk prosesin sonlanma
değerini ekrana yazdıran C kodu;
Download