Sürücü, eski bir çekirdek arayandır. Windows'ta güç yönetimi

Soru: Bilgisayar uzun süre çalıştığında veya uyku modundan çıktığında, başlat menüsünde yazı tipi kayboluyor


Bilgisayarınız uzun süre çalıştığında veya uyku modundan uyandığınızda Başlat menüsü bu şekilde oluyor.

Bunu nasıl düzeltirim? Bana yardım et lütfen..

Cevap: işletim sistemi zaten yeniden yüklendi ve güncellendi (

Soru: Bilgisayarımı S1 ("Beklemede") uyku moduna nasıl geçiririm?


Ne sabit bir bilgisayarda ne de dizüstü bilgisayarda, bilgisayarı S1 uyku moduna nasıl geçireceğimi anlayamıyorum.

"powercfg / a" yürütmenin sonucu

Bu sistemde aşağıdaki hazırda bekleme durumları mevcuttur:
Bekleme (S3)

Aşağıdaki hazırda bekleme durumları bu sistemde mevcut değildir:
Bekleme (S1)

Bekleme (S2)
Sistem bellenimi bekleme modunu desteklemiyor.

hazırda bekletme
Hazırda bekletme etkin değil.

Bekleme (bağlı)
Sistem bellenimi bekleme modunu desteklemiyor.

Hibrit uyku modu

Hızlı başlangıç
Hazırda bekletme modu kullanılamaz.

Cevap: Bilgisayarın birkaç dakika boşta kalmasına izin verin, ardından uyku moduna gönderin ve uyandırın.

Olay günlüğünde:
Eylem => özel görünüm oluştur
Tarih öğesinde, örneğin iki dakikalık bir aralık belirleyin ve ne olduğunu görün.

Başka fikrim yok.

Peki, bilgisayara bağlı sürücüleri ve aygıtları kontrol edin

Soru: Sabah 4'te uyanır


Neredeyse her gece bilgisayar uyanıyor ve beni uyandırıyor.
aygıt yöneticisinde, ağ bağdaştırıcıları, "sihirli paketlerle uyan" onay kutusunu kaldırdı.
güç ayarlarında uyandırma zamanlayıcılarını devre dışı bıraktı.
komut satırında powercfg / waketimers komutu bunu gösterir.

c: \> powercfg / uyandırma zamanlayıcıları
Legacy Kernel Caller tarafından ayarlanan zamanlayıcı 01/09/2016 4:14:46 tarihine kadar geçerlidir.
Neden:

Yardım. Suçlu kim ve ne yapmalı?

Cevap: sonunda bu rahatsızlığı iyileştirdi:

Denetim Masası -> Güvenlik ve Bakım -> Bakım -> Otomatik Bakım -> Bakım ayarlarını değiştir -> "Bakım görevinin bilgisayarımı uyandırmasına izin ver ..." seçeneğinin işaretini kaldırın.

Soru: Bilgisayar geceleri kendiliğinden açılıyor


En son (yaklaşık 1 ... 2 ay), bilgisayar uyku moduna alındıktan yaklaşık 30 ... 60 dakika sonra (sabahları kesintiye uğradığı andan itibaren çalışmaya devam edebilmeniz için), kendiliğinden açılır . İşi gece yaklaşık 12'de bitiriyorum, yani. açma 0:30 ... 01:00 saatleri arasında gerçekleşir. Ancak, monitör karanlık kalır. Yataktan kalkıyorum, fareyi hareket ettiriyorum - monitör açılıyor, profile normal modda giriyorum, tekrar uyku moduna alıyorum - bu gece artık açılmıyor.

Bir Win7 bilgisayarında yerleşik bir antivirüs MS Cecurity Esentials vardır. Topikal (yeni indirilen) iyileştirme yardımcı programlarını mbar ve DrWeb Cureit'i birkaç kez çalıştırdım - birkaç byak vardı, ancak yine de spontan aktivasyon kaldı. Bilgisayarımı DDOS saldırılarına bağlayan bir virüse benziyor. Ayrıca, Google zaman zaman IP adresimden gelen şüpheli trafik nedeniyle erişimi engelliyor. Bu oldukça uzun bir süredir oluyor (bir yıldan fazla), ancak bilgisayarın kendiliğinden başladığını ancak son zamanlarda fark ettim.

Aslında soru şu: Eğer sorun biliniyorsa ve tedavisi nispeten kolaysa, önerilen yazılımı indirir, tarar ve gönderirim. Sorun daha karmaşıksa, kendimi veya yerel guruyu kandırmayacağım ve aptalca sistemi yeniden düzenlemeyeceğim.

Cevap: şahinci, tam olarak anlamadığım bir şey ...

gelen mesaj şahinci

bilgisayarı uyku moduna geçirdikten sonra ... kendiliğinden açılır

7'de uyku ve hazırda bekletme tamamen farklı şeylerdir. Uyku moduna almak için klavyedeki Uyku düğmesine basmanız yeterlidir. Başlat'a tıklarsanız ve farenizi Kapat'ın yanındaki okun üzerine getirirseniz, Hazırda Bekletme modunun da bulunduğu bir menü görünecektir. ve Hazırda Bekletme. Hazırda bekletme sırasında, bilgisayarın güç kaynağıyla bağlantısı, kapatma sırasındakiyle aynı şekilde kesilir, ancak bilgisayarı açtığınızda, uyku modundan sonra olduğu gibi çalışmaya başlayabilirsiniz.
Ama sen başka bir şey sordun. Görev Zamanlayıcı'yı kontrol ettiniz mi?

Soru: Bilgisayar gece uyku modundan uyanıyor


Herkese iyi günler. Bu sorun beni çoktan ele geçirdi. Kendi kendine, PC gece uyku modundan çıkıyor, Windows 10, ondan önce 7 vardı, böyle bir sorun yoktu, o yüzden bu bölümü seçtim.
2 gün önce yapılanlar:
1. Olay görüntüleyicide nedenini buldum: Zamanlayıcı - Zamanlanmış görev "NT TASK \ Microsoft \ Windows \ UpdateOrchestrator \ Yeniden Başlatma" yürütülecek ve bilgisayarın uyku modundan uyanmasını talep edecek.
Görev Zamanlayıcı'ya gittim, bu görevi buldum ve şu öğeden onay kutusunu kaldırdım: Koşullar - Görevi tamamlamak için bilgisayarı uyandırın.
2. powercfg.cpl'ye gittim - Güç düzeni ayarları - Gelişmiş güç ayarlarını değiştir - Uyku - Uyandırma zamanlayıcılarına izin ver - DEVRE DIŞI BIRAK.

Bu gece durum kendini tekrarladı, ancak olayları izlerken sadece şunu buldum:

Sistem hazırda bekletme durumundan çıktı.

Uyku süresi: 2016-10-29T21: 38: 38.657073700Z
Uyanma saati: 2016-10-29T21: 58: 34.625754700Z

Çıkış kaynağı: Veri yok

3. Aygıt yöneticisinde fareden, klavyeden, ağ kartından ve bulduğum her yerden "bu aygıtın bilgisayarı bekleme modundan uyandırmasına izin ver" onay kutusunu kaldırdım...

çözmeye yardım et bu sorun, Artık nereye kazacağımı bilmiyorum ...

Cevap:

gelen mesaj GoLeMjkeee

Günlük maliyetler 2-00

Gündüz değiştirin.

gelen mesaj GoLeMjkeee

ama bir kene .... buna değmez.

O öyle, karakterli.

Soru: Uyku modundan çıkarken "Giriş" butonu ile ekran nasıl kaldırılır?


Windows 10 Pro 1607.
Uyku modundan çıktığınızda, Windows sizden "Enter" tuşuna basmanızı ister. Uyandığında belirir Mavi ekran kullanıcı adının yazıtı ve altındaki "Giriş" düğmesi ile. Şifre belirlenmemiş, sistemde yönetici haklarına sahip tek kullanıcı kullanıcıdır. Yükleme sırasında her şey yolunda, ekran veya düğme tıklaması yok, sadece bir masaüstü.

Seçenekler-Hesaplarda Girişler- Parametreler"Giriş gerekli" girişi yok.
Pencerede Hesaplar kullanıcılar, Kullanıcılar sekmesinde "Kullanıcı adı ve şifre iste" onay kutusunun işareti kaldırılmıştır.
Güç planı ayarlarında "Uyanırken parola iste" öğesi yok.

Bilgisayarın bu pencereyi atlayarak masaüstünü otomatik olarak başlatması için uyku modundan çıkarken "Enter" düğmesini nasıl kaldırabilirim?

Cevap: hazırda bekletme modunu kaldır

Soru: Windows 8.1 uyku modunda kapanıyor


Merhaba.
Hazırda bekletme ile ilgili bir sorunum var. Bilgisayar uyurken tamamen kapanıyor. Onlar. güç tamamen kaybolur. Önceden, sistem ünitesindeki bir ampul uyuyanda yanıp sönüyordu, şimdi fare de usb ile tamamen "soldu", klavye sönüyor ve sadece güç düğmesi ile açılabilir ve elbette tüm bilgiler kaydedilmez.
İnternette birçok konu okudum ama benimkine benzeyen tek bir sorun yok.
Hemen PC'nin özelliklerini yazacağım: ASUS p8h67 anakart, video Radeon HD7850 (asus), intel i5 2550k, 8gb RAM, SSD Silicon Power s55 120gb, HDD WD 500gb.
Yüklü Windows 8.1, çok uzun süredir ayakta ve hazırda bekletme modu olması gerektiği gibi çalıştı. Bir kez çalışmayı bıraktıktan sonra, tam olarak neden ve neyin (bazı eylemlerden) sonra çalışmayı bıraktığını bile bilmiyorum. Böyle bir şey yüklemedim, sürücüyü güncellemedim.
Genellikle alışkanlıktan, kapatmak yerine uyku düğmesine basıyorum ve bir kez çalışıp birkaç gün çalıştı, ancak zamanla çalışmayı bıraktı.
Sürücüleri güncellemeyi veya kaldırmayı denedim. Gereksiz cihazları bilgisayardan ayırmaya çalıştım (asla bilemezsiniz). Uyumadan önce çeşitli programları kapattım. Hiçbir şey yardımcı olmadı.
İnternette, tam olarak benimkine benzeyen tek bilgiyi buldum (8. nokta):

Tabii ki sürücüleri, farklı platformları kuramadım. Aynısını kendim için bulamadım.

İşletim sistemini yeniden yüklemek istemiyorum. her şey (uyuyan hariç) iyi çalışıyor.
neyin yanlış olabileceğine dair bir fikri olan?

17 dakika sonra eklendi
Hangi BIOS'un sıfırlandığını ve güncellendiğini yazmayı unuttum.

Cevap: ardından BP veya Anne'yi kontrol edin. Uyku ve hazırda bekletme modunu programlı olarak yapılandırdık powercfg / h.

Başka bir Seçenek kontrol etmektir (değiştir). hiberfil.sys - hazırda bekletme modundan sorumludur.

Soru: Windows 8'de Hazırda Bekletme


uykudan ayrıldıktan sonra pencere modu 8 yeniden başlatılmaya başlar ve pencereleri yükledikten sonra aşağıdaki mesaj çöker
onunla nasıl başa çıkacağımı söyle?

Cevap:

gelen mesaj azat145

hazırda bekletme modundan uyandıktan sonra Windows 8 yeniden başlatılmaya başlar

Başta.
Daha sonra.

Soru: Hibrit Uyku veya Hazırda Bekletme? Masaüstünde tercih edilen nedir?


Genel olarak, soru başlıkta. Arama motorundan daha doğrusu tüm sitelere kopyalanan aynı yazıdan anladığım kadarıyla Hibrit uyku modunun avantajı sadece açılma, uyanma hızında yatıyor denilebilir. Hazırda Bekletme modunu masaüstümde Windows 7 x64 kullanmak istersem, tuzaklar var mı? Sadece gücü kapatmam gerekiyor ve bunu Karma Uyku modunda yapmamak daha iyi. cevap veren herkese teşekkürler

Cevap: Bugün okudum. Tamam, bence soruma Microsoft'tan kısa bir brifing vermekten başka bir cevap yok. Sonra bulgularımı paylaşacağım (bu konuya benzer bir soruyla girenler için).
Yani:

profesyoneller Karma uyku modu: 1. Hızlı başlangıç, bilgisayarı tamamen kapatmaya gerek yok;
eksiler: 1. Sabit diski yükler (forumumuzdaki Windows 7 bölümünden bir moderatöre göre); 2. Tamamen kapanmaz, biraz da olsa akım tüketmeye devam eder (bazıları için bu öğe bir artı olsa da)

Kısacası, ağdan sürekli olarak kapanmak istiyorsanız, ancak işletim sistemini uzun süre yüklemek / kapatmak istemiyorsanız Hazırda Bekletme gereklidir.
Hibrit uyku modu - sürekli ağda olan bir bilgisayardan memnun olanlar için.

Soru: Daha önce dizüstü bilgisayar başlangıçta kapandı, şimdi uyku modunda


Windows 8.1 yüklü DELL INSPIRON 3521 dizüstü bilgisayarım başlangıçta kapanıyordu (DELL logosu belirdi - kapatma - yeniden etkinleştirme ve normal iş). Sistemi 10k için güncelledim, yardımcı olmadı. Şehirde ünlü ve övünen bir dağ servis merkezine taktım - orada dizüstü bilgisayar 2 hafta boyunca insan dikkatinden güvenli bir şekilde dinlendi. Onu alarak, hızlı önyüklemeyi devre dışı bırakarak sorunu çözdüm ve kutlamak için 8.1'e geri döndüm.
Bir ay geçti ve şimdi dizüstü bilgisayarın kapağını kapattığımda uyku moduna giriyor (ayarlarda öyle), ancak 20 dakika veya biraz daha sonra tamamen kapanıyor (bu daha önce böyle değildi ve güç ayarları değişmedi). Açarken, yukarıda anlattığım durum: açma - logo - kapatma. Yeniden başlattıktan sonra normal çalışma. Tüm sürücüler güncel. Sorun ne olabilir ve nasıl düzeltilir? Zavallı adama yazık - toplamda bir buçuk yıl, ama diplomam ve devlet sertifikam var - şimdi ustaların yanında taşıyamam ...

Cevap: Nasıl çalışmasını istiyorsun? Şahsen, hazırda bekletme modunu değil, hazırda bekletme modunu kullanıyorum, hazırda bekletme moduna geçiş de boştayken etkinleştirilir, ekteki ayarlar

Güç ayarlarını aktarma

Ana dizüstü bilgisayarımda, güç kaynağı ile ilgili çeşitli sorunlar sık ​​sık meydana geliyor ve bu, içeriden öğrenenlerin montajlarındaki çalışma ile açıklanabilir. Ancak, kararlı sürüm 1803'te bile, sistemimin uyku moduna geçmeyi bıraktığını fark ettim. Bu durumda, monitör belirli bir süre sonra kapandı ve bu, sistem tarafından boşta kalma durumunun doğru bir şekilde belirlendiğini ima etti.

Küçük bir uykuya geçiş süresi belirledim, 1-2 dakika ve teşhis koymaya başladım.

Uygulamalardan ve sürücülerden güç alt sistemine gelen istekleri kontrol etme

İlk adım içeri bakmaktır güçcfg, bu da işletim sisteminin uyku moduna geçmesini engeller. Güç alt sistemine erişen işlemler ve sürücüler, yönetici olarak komut satırında görülebilir:

Powercfg -istekler

SİSTEM isteğinin DRIVER'dan geldiğini hemen görebilirsiniz - bu durumda Realtek bir ses akışı kullanır.

Liste ayrıca Chrome'dan WebRTC içerebilir ve sistemi yeniden başlattıktan hemen sonra indirme optimizasyon isteklerini, arama dizini görebilirsiniz, ancak bunlar hızla kaybolur. Dışlama listesine bir işlem veya sürücü ekleyebilirsiniz ve bu, uyumanıza engel olmaz.

Powercfg -requestsoverride SÜRÜCÜ "Realtek Yüksek Tanım Ses(HDAUDIO \ FUNC_01 & VEN_10EC & DEV_0269 & SUBSYS_17AA2204 & REV_1002 \ 4 & d00657 & 0 & 0001) "SİSTEM

Komut, "SÜRÜCÜ [tam sürücü adı]'ndan SYSTEM'e gelen isteği yoksay" olarak okur.

Dışlamaların listesi kayıt defteri anahtarında saklanır

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power \ PowerRequestOverride

ve komutla çıktı alınır

Powercfg -requestsoverride

Emin olmak için yeniden başlattım ama sistem uyumayı reddetti. İstisnaları ve istek listesini kontrol ettikten sonra, Realtek sürücüsünün istisnalara atılmasına rağmen ses akışını kullanmaya devam ettiğini gördüm.

İstisnalar etrafında tef ile biraz dans ettim ama başarılı olamadım. Hızlı bir googling, bazı durumlarda çalışmadıklarını doğruladı. Bu, eski sorgular için tipiktir, ancak bu farklı bir durumdu ve bununla ilk karşılaşan ben değilim.

Realtek'i listeden kaldırdım. Kayıt Defteri Düzenleyicisi veya Konsoldaki girdileri silebilirsiniz. Komut, ekleme sırasındakiyle hemen hemen aynıdır, yalnızca isteğin nereye gittiğini göstermez, yani. bu durumda, komutun sonunda SYSTEM yoktur:

Powercfg -requestsoverride SÜRÜCÜ "Realtek Yüksek Tanımlı Ses (HDAUDIO \ FUNC_01 & VEN_10EC & DEV_0269 & SUBSYS_17AA2204 & REV_1002 \ 4 & d00657 & 0 & 0001)"

Farklı bir yol izleyeceğiz

Ses alt sistemini kullanarak bir işlemi hesaplama

Realtek sürücüsünün kirli işler yaptığı biliniyor. Açıkçası, sistem başlangıcında yüklenir, bu nedenle dosya adını Autoruns kullanarak bulmak kolaydır.

Üç giriş, adından da anlaşılacağı gibi, biri kontrol paneli olan iki dosyaya atıfta bulunur. Bu nedenle, ilgi nesnesi ravbg64.exe.

Microsoft, Windows 10 işletim sisteminde öder büyük dikkat güvenlik. Sistemin önemli unsurlarından biri “ Windows Defender”, Ancak tüm tehditlerle baş edemiyor. Özellikle, fidye yazılımı virüsleri son zamanlarda popülerlik kazanıyor ve bunların en ünlü reenkarnasyonları kötü amaçlı yazılım Petya ve. Microsoft, Ransomware virüsleriyle mücadele etmek için Windows 10'da çekirdek izolasyonu ve bellek bütünlüğü özellikleri uygulamıştır. Varsayılan olarak devre dışıdırlar.

İçindekiler:

Çekirdek izolasyonu ve bellek bütünlüğü nedir

Çekirdek yalıtımı bilgisayar işlemlerini koruma yöntemiyle sağlanan ek bir koruma işlemidir. işletim sistemi ve cihazlar. Bu eylemler sayesinde, bilgisayara virüs girdiğinde işletim sisteminin çalışmasının kesintiye uğramaması mümkün olmaktadır.

Bellek bütünlüğü bilinmeyen potansiyel olarak tehlikeli programların yüksek güvenlik düzeyine sahip işlemlere erişimini kısıtlamayı amaçlayan çekirdek yalıtımına eşlik eden koruyucu bir işlevdir.

Önemli: Çekirdek izolasyon işlevi, yalnızca bilgisayar donanımı tarafından bunun için yeterli koşullar varsa çalışabilir. BIOS ayarlarında, Windows 10 çalıştıran bir bilgisayarın çeşitli uygulamaları sanal bir kapta çalıştırabilmesi ve temel sistem bileşenlerinden erişimlerini kısıtlayabilmesi nedeniyle sanallaştırma teknolojisi etkin olmalıdır.

Çekirdek izolasyonu ve bellek bütünlüğü nasıl etkinleştirilir

Windows 10 işletim sistemi ayarları, bilgisayarınızdaki güvenlik özelliklerinin tam kontrolünü elinize almanızı sağlar. Karşısında Windows ayarları 10, çekirdek izolasyonunu ve bellek bütünlüğünü aşağıdaki gibi etkinleştirebilirsiniz:


Yukarıda belirtildiği gibi, bilgisayarın donanımı sanallaştırmayı desteklemiyorsa, bu işlevçalışmayacak. Etkinleştirildiğinde, kullanıcı “Bellek bütünlüğü sağlanamıyor. Olası uyumsuzluk." Bu mesaj belirirse, BIOS'a gitmeniz ve işlevin etkin olup olmadığına bakmanız önerilir. Güvenli Önyükleme(Önyükleme Modu).

Çekirdek izolasyonu ve bellek bütünlüğü nasıl devre dışı bırakılır

İşletim sistemindeki, çalışmasını ciddi şekilde etkileyen yeni işlevler, her zaman bilgisayarda sorunlara neden olma riskini taşır. Çekirdek izolasyon işlevi bir istisna değildir. Zaten deneyen kullanıcılar, Microsoft forumlarında bir dizi oyun ve programı başlatırken sorunlarla karşılaştıklarını unutmayın. Bu sorunu çözmenin tek yolu, çekirdek izolasyonunu ve bellek bütünlüğünü devre dışı bırakmaktır. Belki de gelecekteki güncellemelerde uygulama geliştiricileri veya Microsoft bu uyumsuzluğu düzeltecektir.

Çekirdek izolasyonunu ve bellek bütünlüğünü devre dışı bırakmanın 3 yolu vardır:


İyi çalışmalarınızı bilgi tabanına gönderin basittir. Aşağıdaki formu kullanın

Bilgi tabanını çalışmalarında ve çalışmalarında kullanan öğrenciler, yüksek lisans öğrencileri, genç bilim adamları size çok minnettar olacaktır.

http://www.allbest.ru/ adresinde yayınlandı

1. teorik bilgi

1.1 Windows Çekirdek Sürücülerini Geliştirme

Kısa teorik bilgi

Çekirdek sürücü geliştirme

Sürücü, başka bir programın (genellikle bir işletim sistemi) donanıma standart bir şekilde eriştiği bir bilgisayar programıdır.

Farklı sürücü türlerinin nasıl çalıştığını göstermek için taslak:

2 türe ayırmak uygundur:

- Çekirdek sürücüleri (ayrıcalık seviyesi 0'da çalışır, ancak kullanıcı programı veya cihazla hiçbir şekilde etkileşime girmez. Onlarla başlayacağız (daha basit ve kullanışlı olabilirler).

Kullanıcı programı ile cihaz arasında etkileşim kurmak, yani aralarında veri aktarmak, cihazı kontrol etmek için cihaz sürücülerine ihtiyaç vardır. Ayrıca, cihazlar hem gerçek hem de sanal olabilir). Sürücünün herhangi bir fiziksel aygıtı kontrol etmesi gerekmez. Bazı işletim sistemleri, sanal aygıt sürücüleri oluşturmanıza da izin verir - G/Ç aygıtları gibi davranan ancak herhangi bir fiziksel aygıta karşılık gelmeyen nesneler.

Ayrıcalıklı işlemci modunda (çekirdek modu olarak adlandırılır) çalışan çekirdek bileşenleri, her şeyi yapabilir, yani:

- ayrıcalıklı işlemci komutlarını çalıştırabilirler (lgdt gibi),

- sistem verilerine ve koduna erişebilir,

- örneğin portlar aracılığıyla ekipmana doğrudan erişime sahip olmak

- hafıza hücrelerine erişim; sürücü fiziksel belleği doğrudan değiştiremez, ancak herhangi bir fiziksel bellek için sanal bir adres alabilir ve onu değiştirebilir.

Sistemin dahili işlevlerine veya veri yapılarına erişim gerektiren herhangi bir ciddi uygulama yazmanız gerekiyorsa, yalnızca kodunuzu sistem adres alanına yerleştirerek üstesinden gelinebilecek birçok sınırlama ile karşılaşabilirsiniz. Bunu yapmanın belgelenmiş tek yolu sürücüyü yüklemektir. Bu yöntem nispeten basit, güvenilir ve en önemlisi işletim sisteminin kendisi tarafından tam olarak destekleniyor.

Çekirdek kodu (aslında bu sistemin kendisidir) tamamen güvenilir olarak kabul edilir. Bu nedenle, sistem adres alanına yüklenen sürücü, sistemin bir parçası olur ve herhangi bir kısıtlamaya tabi değildir. Windows'ta bu, işletim sistemi dışındaki geliştiricilerin çekirdek düzeyinde sistem bileşenleri yazmasının pratik olarak tek yoludur.

Sürücü geliştirmenin yollarını yazmak ve incelemek için, sürücü geliştirmeye yönelik bir sistem olan DDK'yı (Aygıt Geliştirme Kiti) kullanırlar.

DDK, belgelere ek olarak bir dizi içerme dosyası (* .inc) ve kitaplık dosyası (* .lib) içerir.

Bu nedenle, Windows çeşitli aygıt sürücülerini destekler, ancak buna ek olarak, aygıt sürücüsü olmayan, ancak Windows'ta çekirdek modunda çalışacak programlar oluşturmanıza izin veren sürücüler de vardır, yani. 0 ayrıcalık düzeyinde. Bunu yaparken, işletim sistemine ve donanıma tam erişime sahip olurlar.

En basit çekirdek modu sürücüsüne bir göz atalım.

#Dahil etmek

int Sürücü Girişi (

PDRIVER_OBJECT içinde pDriverObject,

PUNICODE_STRING pusRegistryPath İÇİNDE) (

}

Giriş noktası, iki parametre alan bir prosedür olarak yapılandırılmış DriverEntry'dir:

pDriverObject, yeni oluşturulan sürücü nesnesine yönelik bir işaretçidir. Bir sürücü yüklerken sistem, sürücünün bellek içi görüntüsünü temsil eden bir sürücü nesnesi oluşturur. Sistem bu nesne aracılığıyla sürücüyü kontrol eder. Sürücü nesnesi, DRIVER_OBJECT tipinin sıradan bir veri yapısıdır.

pusRegistryPath Sürücü başlatma parametrelerini içeren bir kayıt defteri anahtarına işaretçi.

Bu ilk sürücümüz sadece sisteme yüklenir ve hemen boşaltılır.

Şimdi ders çalışmasının ilk adımında programı geliştirmek için kullanılması gereken şablon programa bakalım (beeper.sys çekirdek modu sürücüsü).

Bu sürücünün görevi, sistem dinamiği üzerinde ilk oktava kadar bir nota çalmaktır. Bunu yapmak için sürücü, ilgili G / Ç bağlantı noktalarına atıfta bulunarak giriş ve çıkış işlemci talimatlarını kullanır. G / Ç bağlantı noktalarına erişimin, Windows tarafından kutsal bir şekilde korunan bir sistem kaynağı olduğu yaygın bir bilgidir. Kullanıcı modundan hem girdi hem de çıktı olarak bunlardan herhangi birine erişme girişimi, kaçınılmaz olarak bir istisna ile sonuçlanır.

Örneğimizde hoparlör çalışacaktır (bunun için özellikle 61h bağlantı noktası, 0 ve 1 bit, 43h ve 42h bağlantı noktası kullanılır).

Sürücünün başında 12 notun tamamı tanımlanmıştır.

Sadece hoparlörü açmak değil, aynı zamanda ses frekansını ayarlamak da gerekli olacaktır. Bunun için işlemciden bağımsız çalışan ve 3 kanallı bir zamanlayıcı alt sistemi kullanılmaktadır. Kanal 2'nin çıkışı, farklı frekanslarda ses üretmek için kullanılan bir hoparlöre bağlanır. Sesin duyulabilir aralığı 30Hz-6000Hz'dir.

Ses frekansını ayarlamak için, 0Bh kontrol kelimesi 43h portuna gönderilir (zamanlayıcı komut kaydı):

hareket al, 0Bh

43h, al

Bu değer, kontrol edeceğimiz kanal sayısını, çalışma tipini, kanal çalışma modunu ve sayaç formatını belirler.

Daha sonra yeniden hesaplanan ses frekansı (1193167 / frekans (Hz)) iki kısım halinde (önce düşük kısım, sonra yüksek kısım) 42h portuna gönderilir.

Örneğin, 100Hz'lik bir ses frekansı elde etmek istiyoruz. Frekansı yeniden hesaplıyoruz,

1193167/100 = 11931

Sonra:

hareket baltası, 11931

42h, al

hareket, ah

42h, al

Ders çalışmasının ilk aşamasında, programı başka müzikal sesler üretecek şekilde değiştirmek gerekir (her birinin bir varyantı vardır).

Görevlerin genellikle farklı süreler ayarlaması gerekir. Bunun için DO_DELAY prosedürünü kullanmak, dolaylı olarak tanımlanmış bir "sondaj zamanı" parametresini iletmek uygundur.

Sürücüde hata ayıklamayı kolaylaştırmak için çeşitli araçlar vardır. En basit şey, gerekli bilgileri Debug View yardımcı programının özel bir penceresinde görüntülemektir. Bu program, çekirdek seviyesinden gelen mesajları engellemek için önceden başlatılmış ve yapılandırılmıştır. Çıktı için program, bir parametresi olan çıktı dizesi olan DbgPrint işlevini çağırır. Sürücüyü başlattıktan sonra tüm çıktılar Debug View penceresinde görüntülenir.

Sürücüyü çekirdeğe kurmanın çeşitli yolları vardır. Sürücümüze aslında sistem tarafından ihtiyaç duyulmadığından (herhangi bir cihazı kontrol etmemektedir), sürücüyü geçici olarak sisteme bağlayacağız ve ardından sileceğiz.

Bunu yapmak için, sürücüyü başlatacak bir uygulama oluşturmanız gerekir. Nasıl? Sürücü, çekirdek düzeyinde bir hizmettir. Bu nedenle uygulama, Windows'ta bulunan ve kullanıcı düzeyinde çalışan SCM - Service Control Manager'ı kullanacaktır.

Bu nedenle, iki projeden bir çözüm oluşturmanız gerekir: bir konsol uygulaması ve bir sürücü.

C'de sürücüler geliştirmek için önce şunları yapmalısınız:

- DDK'yı yükleyin,

- WNETBASE ortam değişkenini ayarlayın (değer, DDK'nın yoludur, örneğin, e: \ winddk \ 3790.1830).

Sürücü projesi MakeFile türünde olmalıdır.

Uygulama Ayarları'nı kullanarak proje ayarlarını yapın ve Komut Satırını Oluştur alanına satırı yazın

ddkbuild -WNETXP chk. -ceZ

bu, VC'yi DDK ile bağlamak için özel bir komut dosyası çağırmak anlamına gelir

Dosyalar mevcut proje klasöründe bulunmalıdır:

kaynaklar, makefile, ddkbuild.cmd (komut dosyası), sürücü kaynak dosyası.c

Projeyi oluşturduktan sonra sürücünün sys uzantısına sahip olması gerekir.

Uygulama, beeper.sys sürücüsünü başlatır, yani. onu kayıt defterine kaydeder ve çalıştırır. Ardından, bittiğinde kayıt defterinden siler.

Bir uygulamanın sürücüyü çalıştırması için, uygulama ve sürücü olmak üzere iki projeden oluşan bir çözüm oluşturduktan sonra, uygulamanın yürütülebilir dosyasını ve sürücüyü aynı klasöre yerleştirmeniz ve ardından uygulamayı başlatmanız gerekir.

Sürücülerin hata ayıklaması çok zordur. Çalışma sırasında hata olması durumunda, işletim sistemi çoğunlukla donar ve yeniden başlatma gerektirir. Ve sürücümüz için, yeniden başlattıktan sonra, regedit (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \) kullanarak beeper06 hizmetini de kayıt defterinden silmeniz ve ardından yeniden başlatmanız gerekir.

1.2 Windows Sanal Aygıt Sürücüleri

Şu ana kadar kullanıcı seviyesinde yapılamayacak şeyleri yapabilen, özellikle I/O portları ile çalışabilen kernel-mode driver geliştiriyoruz. Bu tür bir sürücüye çekirdek sürücüsü denir, ancak aygıt sürücüsü değil, çünkü kullanıcı programı ile aygıt arasında hiçbir veri aktarılmaz (sonuçta, neden bir sürücüye genellikle ihtiyaç duyulur? cihaz).

Şimdi, bir kullanıcı uygulaması ile bir cihaz arasında veri aktaran cihaz sürücüleri geliştireceğiz.

Bir uygulama bir G/Ç işlemi gerektirdiğinde, sürücüye bir çağrı yapılır. Bunu yapmak için uygulama, cihazdan veri okuma veya cihaza veri yazma talebinde bulunabilir. Ve başka bir işlem gerekliyse, örneğin, bir cihazı yoklama veya kontrol etme veya başka bir şey, o zaman sözde. IOCTL arayüzü (Aygıt Giriş-Çıkış Kontrolü).

Sanal cihazlar için böyle bir durumu ele alacağız, çünkü çoğu zaman neden bir sürücüde sanal bir cihaza ihtiyacımız var? Böylece, sürücünün bir şekilde işleyebileceği (uygulamada imkansız olarak) verileri aktarabilir ve sonucu uygulamaya döndürebilirsiniz. Daha önce tartışılan normal çekirdek sürücüsünün uygulamadan hiçbir şey almadığını ve orada hiçbir şey döndürmediğini, yalnızca uygulamada mevcut olmayan eylemleri yaptığını hatırlayın.

Bir uygulama bir G/Ç işlemi gerektirdiğinde, sürücüye bir çağrı yapılır. Bunun için sözde. IOCTL arayüzü (Aygıt Giriş-Çıkış Kontrolü).

Çağıran uygulama şunları yapar:

1) Bir dosyayı açmak ve tanımlayıcısını almak:

GENERIC_READ + GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL

Sonuç olarak, her şey başarıyla gerçekleştiyse, cihaz tanımlayıcısını alırız.

2) Sürücüye bir eylem kodu gönderme (ne yapmalı, sürücü birçok farklı eylemi uygulayabilir):

DeviceIoControl, tanımlayıcı, eylem kodu, giriş arabellek adresi, giriş veri boyutu, çıkış arabellek adresi, çıkış veri boyutu, gerçek bayt sayısı için arabellek adresini çağır

3) Dosyayı kapatmak ve buna göre tanımlayıcıyı serbest bırakmak.

CloseHandle aygıt tanıtıcısını çağır

Verileri aktarmak için modüller (uygulama ve sürücü) bir etkileşim protokolü (eylem kodları, arabellek yapısı - giriş ve çıkış) üzerinde anlaşmalıdır.

Hem uygulamada hem de sürücüde aynı eylem kodu kullanılır.

Uygulamadaki ve sürücüdeki eylem kodu onaltılık biçimde yazılabilir veya örnek laboratuvarda yapıldığı gibi CTL_CODE makrosunu kullanabilirsiniz. common.inc dosyasında çalışın.

Bu laboratuvarda kullanılan bir sanal aygıt sürücüsünden bir eylem kodu örneğine bakalım. İsim IOCTL_GET.

Sanal bir cihaz olması durumunda dosya bayrağı 0'dır.

Cihaz türü - FILE_DEVICE_UNKNOWN = 22 saat

Erişim hakları - FILE_READ_ACCESS + FILE_WRITE_ACCESS = 1 + 2 = 3 = 11b

Fonksiyon kodu 800h ile FFFh arasında değişir. 800 saatimiz var.

Arabelleğe alma yöntemi - uygulama ile sürücü arasında veri aktarmanın bir yolu (üç olasıdır):

Az miktarda veri için genellikle METHOD_BUFFERED (00b) kullanılır - sayfa dışı bellekte giriş ve çıkış arabelleklerini barındırmak için yeterli olan ek bir arabellek tahsis edilir. Bu tamponun adresi, AssociatedIrp.SystemBuffer alanındaki IRP'ye yerleştirilir. G/Ç dağıtıcısı, kullanıcı arabelleği ve yardımcı arabellek arasındaki verileri yeniden yazma işini üstlenir.

Verilere doğrudan erişim (arabellek olmadan) - METHOD_OUT_DIRECT (2) - çıkış için veya METOD_IN_DIRECT (1) - giriş için; IRP'den alan - MdlAddress. Bu doğrudan bir çağrıdır - G / Ç yöneticisi, kullanıcı modu arabelleğini içeren fiziksel sayfaları belleğe almayı taahhüt eder. Aynı zamanda sabit sayfaları tanımlamak için yardımcı bir yapı MDL (Memory Descriptor List) oluşturur. Ve sürücü geliştiricisi MDL ile çalışıyor.

Kullanıcı düzeyinde bir arabellek üzerinden erişim - METHOD_NEITHER (3); IRP - SystemBuffer'dan alan. G / Ç yöneticisi, sanal kullanıcı modu adreslerini sürücüye iletir. Ve sürücüde onlarla çok dikkatli çalışmanız gerekir, çünkü bu durumda sürücü yalnızca çağıran iş parçacığı bağlamında çalışmalıdır.

Uygulama sürücüye bir eylem kodu gönderdiğinde I/O yöneticisi başlar. Bir G/Ç istek paketi (IRP) oluşturmaktan ve daha sonraki işlemler için sürücüye göndermekten sorumludur.

3 tür talebi dikkate alacağız:

IRP_MJ_CREATE - CreateFile'a aktarılacak,

IRP_MJ_DEVICE_CONTROL - DeviceIoControl olduğunda iletilecektir

IPR_MJ_CLOSE - CloseHandle'da

Bir IRP, bir başlık ve G/Ç tahsis yığınlarından oluşur. G/Ç yöneticisi, isteği işlemeye dahil olan sürücü katmanlarının sayısına eşit sayıda G/Ç yığın hücresi oluşturur. Her sürücünün kendi yığın konumuna erişmesine izin verilir. Bir sürücü, bir IRP'yi daha düşük seviyeli bir sürücüye ilettiğinde, yığın işaretçisi sürücünün ihtiyaç duyduğu konuma hareket eder. Tersine, isteği işledikten sonra işaretçi, en üst düzey sürücü hücresine taşınır. Bir işlev kullanarak bir işaretçi alma - IoGetCurrentStackLocation ().

Her ayırma yığını, kendisi için isteğin başlatıldığı DeviceObject ve FileObject için bir işaretçi içerir. IRP'ler her zaman disk belleği olmayan bellekte saklanır.

Sürücünün çalışması için aşağıdaki nesneler oluşturulur ve uygulanır:

Sürücü nesnesi;

Cihaz nesneleri;

Sürücünün aşamaları.

1) Bir sürücü nesnesi oluşturma. Sürücü, başlatma aşamasında yüklendiğinde oluşturulur. Bu anda, DriverEntry işlevi başlatılır ve MajorFunction dizisinin yanı sıra aygıt nesnesine giden ve giden işaretçi de doldurulur.

Aygıt nesnesi şunları içerir:

Cihaz tipi.

2) Cihaza sembolik bir bağlantı oluşturun. "Aygıt" nesnesinin kullanıcı modu kodu için kullanılabilir hale gelmesi için, sürücünün kendisine erişilebilen "\ ??" dizininde (kullanıcı modu kodu) oluşturması gerekir. başka bir nesne sembolik bir bağlantıdır. shablon.sys sürücüsü, değeri "\ Device \ devshablon" dizesi olan "\ ??" dizinindeki "devshablon" aygıtına "slshablon" sembolik bir bağlantı oluşturur.

Bu nedenle, zaten sürücüyü yüklerken (bizim durumumuzda, işletim sistemini yükleme aşamasında) bellekte üç nesnemiz var: sürücü "\ Driver \ shablon", "\ Device \ shablon" aygıtı ve sembolik bağlantı. cihaz "\ ?? \ slshablon ".

3) Açılış. Ardından, uygulama başladığında CreateFile çağrılır. Cihaza bir bağlantı var. Aygıt nesne yapısı DEVICE_OBJECT, hizmet veren sürücüsü hakkında bilgi alır. G/Ç yöneticisi, IRP_MJ_CREATE türünde bir IRP G/Ç istek paketi oluşturur ve bunu sürücüye gönderir. Sürücü, kullanıcı modu kodunun aygıtına erişmeye çalıştığını bu şekilde anlar. Sürücü sakıncası yoksa, bir başarı kodu döndürür. Sürücümüzün bu IRP'ye tepki veren özel bir gönderme prosedürü vardır - DispatchCreateClose (bir cihazı açmak ve kapatmak için birleşik bir prosedür vardır). Io.Status.Status alanında STATUS_SUCCESS ve Io.Status.Information alanında 0 içerir, çünkü bu durumda, hiçbir şeyin iletilmesi gerekmez. Sürücüden gelen bu yanıt, nesne yöneticisine sanal bir dosya oluşturması için bir sinyaldir. Bu, işlem tutamacı tablosunda "dosya" nesnesine bir işaretçi ile yeni bir öğe oluşturur ve kullanıcı modu koduna yeni bir tanıtıcı döndürür.

Her şey yolundaysa, CreateFile tarafından döndürülen dosya tanımlayıcısını hDevice değişkeninde saklarız.

4) Giriş / çıkış işlemleri. Artık DeviceIoControl fonksiyonlarını çağırarak bu cihazı kontrol etmek için işlemleri gerçekleştirebiliriz. Bir aygıt sürücüsü ilke olarak birçok farklı görevi yerine getirebildiğinden, istekleri bir şekilde farklılaştırmak gerekir. Bu, belirli kurallara göre oluşturulmuş I/O kontrol kodu adı verilen ikinci parametre dwIoControlCode'un amacıdır.

Aygıt tanımlayıcısını kullanarak, G/Ç yöneticisi hizmet veren sürücü hakkında bilgi alacak, IRP_MJ_DEVICE_CONTROL türünde bir G/Ç istek paketi oluşturacak ve bunu sürücüye gönderecektir. Sürücü, eylem kodunu ve giriş ve çıkış arabelleğinin adresleri ve boyutları hakkındaki bilgileri parametre olarak aktaran ilgili DispatchControl prosedürünü arayacaktır. Bütün bunlar IRP aracılığıyla iletilir. Prosedürde, IRP'den gerekli bilgiler alınır: eylem kodu, veri iletmek için arabelleğin adresi.

DispatchControl prosedürü gerekli eylemleri gerçekleştirir, bizim durumumuzda ESI kaydından IRP paketinin adresi Daha sonra sonucu çıktı tamponu aracılığıyla uygulamaya aktarır.

Önceki prosedüre benzer şekilde, tamamlanma durumunu ve sürücüden aktarılan bayt sayısını IRP'den geçiriyoruz.

Uygulamada bu veriler biçimlendirilir ve görüntülenir.

5) Kapanış. Artık ihtiyaç duyulmayan tutamaçlarla yapılması gerektiği gibi CloseHandle işlevini çağırarak aygıt tanıtıcısını kapatıyoruz.

6) Sürücünün boşaltılması. Sembolik bağı kaldırın ve aygıt nesnesini kaldırın.

Kompleks (2) iki programdan oluşur:

Sürücüden IRP adresini soran ve ardından bu adresi standart Windows penceresinde görüntüleyen bir uygulama.

Shablon.sys - sürücü.

Shablon sürücüsü, kullanıcı düzeyinde yapılamayacak bir şey yapar, bu durumda sürücü çalışırken esi kaydının içeriğini belirler.

Çıktı arabelleğindeki uygulama, esi içeriğini alır, onaltılık çıktı için dönüştürür ve standart bir Windows penceresine çıktı olarak verir.

Sürücüde CMOS'tan bilgi almanız gerekiyorsa, şunlara ihtiyacınız vardır:

İlgilenilen CMOS ofsetini 70h bağlantı noktasına gönderin;

Küçük gecikme;

71h numaralı bağlantı noktasından al'a bilgi alın.

Ardından bu bilgiyi çıktı arabelleğine yazın.

Ve uygulamada, gerekirse çıktı arabelleğinden bilgi almanız, dönüştürmeniz ve görüntülemeniz veya analiz etmeniz ve sonuca bağlı olarak gerekli metni standart pencerede görüntülemeniz gerekir.

Bu laboratuvar, sürücünün Denetim Masası kullanılarak bir .inf dosyası kullanılarak Windows'a kalıcı olarak yüklendiğini varsaymaktadır - Donanım Kurulumu: Yeni bir aygıt ekle, El ile yükle, Tüm aygıtları göster, Diski Var, .inf dosyasını seçmek için göz atın (sürücü aynı klasörde olun).

Sürücünün kurulu olduğunu kontrol etmek için kontrol panelinde Sistem, Donanım, Aygıt Yöneticisi'ni seçin.

1.3 Kullanıcı Modu Uygulamalarından Mevcut Sürücülere Erişme

Sürücü ile çalışan uygulamanın algoritması

Bir sürücüyle çalışmak için, bir kullanıcı modu uygulamasının sürücünün bir manipülatörünü (tutamacını) alması gerekir. Bu manipülatör, ASCII karakterleriyle çalışan CreateFile veya CreateFileA API işlevi kullanılarak elde edilebilir. Ardından, IOCTL kodunun parametrelerden biri olarak geçirildiği DeviceIoControl API işlevi kullanılır. IOCTL kodu, sürücünün uygulamanın gerçekleştirmek istediği işlemi, parametreleri geçirme yöntemini ve uygulamanın bu işlemi gerçekleştirmek için ihtiyaç duyduğu erişim haklarını öğrendiği kontrol kodudur. Başvuru çağrıldıktan sonra

IRP_MJ_DEVICE_CONTROL, DeviceIoControl sürücüsüne gönderilir. İstekler işlendikten sonra, kontrol uygulamaya döndürülür ve sürücünün yanıtını ayrıştırması ve açık tutamaçları kapatması uygulamaya bırakılır.

Örnek

Aşağıdaki örnekte, bir kullanıcı modu uygulaması, sürücüye bir IOCTL_DISK_GET_PARTITION_INFO_EX isteği gönderir. dosya sistemi, alınan bilgileri analiz eder ve sabit disk bölümünün biçimini görüntüler.

#Dahil etmek

#Dahil etmek

int _tmain (int argc, _TCHAR * argv)

DWORD dwBytes Geri Döndü = 0;

char cPartitionStyle = (0);

PARTITION_INFORMATION_EX piPartitionInfo;

HANDLE hDevice = CreateFileA (

/*1*/"\\\\.\\c: ",

/ * 2 * / GENEL_OKU | GENEL_YAZ,

/ * 3 * / FILE_SHARE_READ | FILE_SHARE_WRITE,

/ * 5 * / AÇIK_MEVCUT,

if (hDevice == INVALID_HANDLE_VALUE)

MessageBoxA (BOŞ, "CreateFileA hatası!", "Hata", 0);

if (DeviceIoControl (

/ * 1 * / (KULLANIM) hCihaz,

/ * 5 * / & piPartitionInfo,

/ * 6 * / sizeof (piPartitionInfo),

/ * 7 * / & dwBytesGeri Döndü,

if (piPartitionInfo.PartitionStyle == PARTITION_STYLE_MBR)

MessageBoxA (BOŞ, "PARTITION_STYLE_MBR", "Başlık", 0);

else if (piPartitionInfo.PartitionStyle == PARTITION_STYLE_GPT)

MessageBoxA (BOŞ, "PARTITION_STYLE_GPT", "Başlık", 0);

MessageBoxA (BOŞ, "PARTITION_STYLE_RAW", "Başlık", 0);

MessageBoxA (BOŞ, "DeviceIoControl hatası", "Hata", 0);

CloseHandle (hDevice);

Örnek ayrıştırma

Uygulamanın çalışması için gerekli olan değişkenler bildirilir. PARTITION_INFORMATION_EX, bir sabit disk bölümü hakkındaki bilgileri açıklayan bir yapıdır.

typedef yapısı (

) BÖLÜM_BİLGİ_EX;

Programın bu bölümünde, hDevice değişkenine yazılan bir tanıtıcı elde etmek için CreateFileA işlevi çağrılır.

DeviceIoControl işlevi eşzamanlı olarak çağrılır. Ona iletilir:

cihaz tanımlayıcısı;

IOCTL kodu IOCTL_DISK_GET_PARTITION_INFO_EX;

giriş arabelleğine işaretçi, bizim durumumuzda NULL;

giriş arabelleği boyutu;

çıktı arabelleğine işaretçi;

çıktı arabelleği boyutu;

işaretçi tür değişkeni Döndürülecek bayt sayısını saklayacak olan DWORD;

için kullanılan OVERLAPPED yapısına bir işaretçi asenkron çağrı fonksiyonlar.

Kontrol geri döndükten sonra, fonksiyonun başarılı bir şekilde tamamlanması durumunda, bölümle ilgili bilgiler PARTITION_INFORMATION_EX yapısında saklanır.

Bilgilerin analizi ve çıktısı gerçekleştirilir. Denetimi işletim sistemine geri vermeden önce açık tutamaçları kapatabilirsiniz. CloseHandle (HANDLE'da __) işlevi bunu yapmanızı sağlar. Tanımlayıcılar kapalı değilse, işletim sistemi sizin için yapacaktır.

2. Dönem ödevinin uygulanması

2.1 Adım 1

Egzersiz yapmak: 1. Bağlantı noktalarına erişimi olan, seçeneğe göre eylemler gerçekleştiren ve Hata Ayıklama Görünümü penceresine (isteğe bağlı olarak) bilgi veren bir çekirdek sürücüsü ve ayrıca sürücüyü başlatan bir uygulama geliştirin.

Kurs_test.cpp listeleniyor

#include "stdafx.h"

#include "windows.h"

#include "stdlib.h"

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

if (hSCManager! = 0) (

// oynatıcıyı SCManager tablosuna kaydedin

if (hService! = 0) (

// Sürücü girişini sil

DeleteService (hService);

CloseServiceHandle (hService);

0 döndür;

}

Beeper.sys listesi

#Dahil etmek

#define TIMER_FREQUENCY 1193167 // 1.193.167 Hz

#define PITCH_C 523 // 523.25 Hz

#define PITCH_Cs 554 // 554.37 Hz

#define PITCH_D 587 // 587.33 Hz

#define PITCH_Ds 622 // 622.25 Hz

#define PITCH_E 659 // 659.25 Hz

#define PITCH_F 698 // 698.46 Hz

#define PITCH_Fs 740 // 739.99 Hz

#define PITCH_G 784 // 783.99 Hz

#define PITCH_Gs 831 // 830.61 Hz

#define PITCH_A 880 // 880.00 Hz

#define PITCH_As 988 // 987.77 Hz

geçersiz DO_DELAY (int zaman) (

uzun i, j;

için (i = 0; ben<=time*0xfffff; i++) {}

}

geçersiz DO_BIG_DELAY (int zaman) (

DO_DELAY (2 * zaman);

}

geçersiz Ksilofon (int nPitch) (

int nTone = TIMER_FREQUENCY / nPitch

_asm (

mov al, 10110110b; // 43h'de kontrol word'ü yaz

out 43h, al; // Ses Kontrol Kanalı - Zamanlayıcı Tonu ve Yazılım Kontrollü Sistem Port Bitlerini Kullanan Mantık Devresi

mov eax, nTone; // yeniden hesaplanan frekansı 42'ye yaz

42h, al; // üst kısım

mov al, ah; // düşük kısım

42h, al

al, 61h; // kaçış sırasını değiştir - son bitleri bire çevir

; // bit 0 - hoparlörü kullanma izni

; // bit 1 - timer-2'yi hoparlöre bağlama izni

veya diğerleri, 00000011b; hoparlör AÇIK

dışarı 61h, al

}

DO_DELAY (0x7f);

_asm (

al, 61h

ve diğerleri, 11111100b; hoparlör KAPALI

dışarı 61h, al

}

}

Ksilofon (PITCH_C);

Ksilofon (PITCH_С);

Ksilofon (PITCH_С);

Ksilofon (PITCH_С);

Ksilofon (PITCH_С);

Ksilofon (PITCH_С);

Ksilofon (PITCH_С);

STATUS_DEVICE_CONFIGURATION_ERROR döndür;

}

2.2 Adım 2

Yalnızca sıfır ayrıcalık düzeyinde (seçenek uyarınca) kullanılabilen eylemleri gerçekleştirmenize olanak tanıyan bir sanal aygıt sürücüsü geliştirin ve ardından sonuçları ekranda görüntülemek için üçüncü ayrıcalık düzeyinde uygulamaya aktarın.

Uygulamada sonucu standart bir Windows penceresine çıkarıyoruz.

listeleme shablon.c

#Dahil etmek // çeşitli NT tanımları

#Dahil etmek

UNICODE_STRING g_usDeviceName;

UNICODE_STRING g_usSymbolicLinkName;

void DriverUnload (PDRIVER_OBJECT pDriverObject IN) (

IoDeleteSymbolicLink (& g_usSymbolicLinkName);

IoDeleteDevice (pDriverObject-> DeviceObject);

}

NTSTATUS DispatchCreateClose (PDEVICE_OBJECT pDeviceObject, PIRP pIrp) (// MJ_CREATE MJ_CLOSE işleniyor

pIrp-> IoStatus.Status = STATUS_SUCCESS;

pIrp-> IoStatus.Information = 0;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);

STATUS_SUCCESS döndür;

}

NTSTATUS DispatchControl (PDEVICE_OBJECT pDeviceObject, PIRP pIrp) (// IRP_MJ_DEVICECONTROL işleniyor

NTSTATUS durumu;

int regEsi;

// IO_STACK_LOCATION'a, içinde IoControlCode'a bir işaretçi alın

if (pIrp-> Tail.Overlay.CurrentStackLocation-> Parameters.DeviceIoControl.IoControlCode == IOCTL_GET) (

// Eylem kodunu karşılaştırın ve bu bizim müşterimizse:

_asm (

hareket eax, 0

hareket, 10h

dışarı 70h, al

al, 71h

cbw

cwde

mov regEsi, eax

}

// bu bizim işlevselliğimiz - esi kaydının içeriğini alıyoruz

// sistem arabelleğine yaz

* ((int *) pIrp-> AssociatedIrp.SystemBuffer) = regEsi;

pIrp-> IoStatus.Information = 4; // ve sonucun boyutunu ayarlayın

durum = STATUS_SUCCESS;

) başka durum = STATUS_INVALID_DEVICE_REQUEST;

pIrp-> IoStatus.Status = durum;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);

dönüş (durum);

}

int DriverEntry (PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pusRegistryPath IN) (

NTSTATUS Durumu;

PDEVICE_OBJECT pDeviceObject;

// Unicode dizelerini başlat

RtlInitUnicodeString (& g_usDeviceName, L "\\ Device \\ DevGet");

RtlInitUnicodeString (& g_usSymbolicLinkName, L "\\ ?? \\ sldevGet");

// sürücü nesnesini doldurun - sürücüye hangi işlevin neyi işlediğini açıkça açıklayın

pDriverObject-> DriverUnload =

pDriverObject-> MajorFunction =

pDriverObject-> MajorFunction =

pDriverObject-> MajorFunction =

// sanal aygıtın mantıksal bir nesnesini yarat

Durum = IoCreateDevice (pDriverObject, 0 ve g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE ve pDeviceObject);

if (! NT_SUCCESS (Durum)) (Durum döndürür;)

// cihaza sembolik bir bağlantı oluşturun

Durum = IoCreateSymbolicLink (& g_usSymbolicLinkName, & g_usDeviceName);

if (! NT_SUCCESS (Durum)) (

IoDeleteDevice (pDeviceObject);

dönüş Durumu;

}

dönüş Durumu;

}

Course2.cpp listeleniyor

#include "stdafx.h"

#include "windows.h"

#include "stdlib.h"

#define IOCTL_GET CTL_CODE (FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)

int _tmain (int argc, _TCHAR * argv) (

KOLU hCihaz;

BOOL DevControl;

DWORD dwBytes Geri Döndü;

karakter vuruşu;

/*

Seçenekler:

lpFileName Oluşturulacak veya açılacak nesnenin adını belirten boş sonlandırılmış bir dizenin adresi.

dwDesiredAccess Nesneye erişim türü. Bu parametre aşağıdaki değerlerin herhangi bir kombinasyonunu alabilir:

Değer: Açıklama:

0 Belirtilen aygıtta bir nesnenin kullanılabilirliği hakkında bir sorgu tanımlar. Bir uygulama, cihaza erişmeden cihaz özelliklerini isteyebilir.

GENERIC_READ Nesneden okuma erişimini belirtir. Veriler bir dosyadan okunabilir ve dosya işaretçisi taşınabilir. Okuma-yazma erişimi için GENERIC_WRITE ile birleştirin.

GENERIC_WRITE Nesneye yazma erişimini belirtir. Veriler bir dosyaya yazılabilir ve dosya işaretçisi taşınabilir. Okuma-yazma erişimi için GENERIC_READ ile birleştirin.

dwShareMode Nesne paylaşılan erişim modu. Değer sıfır ise, nesne birden fazla program tarafından paylaşılamaz. Nesne tanıtıcısı kapatılana kadar nesneyi açmak için sonraki tüm işlemler başarısız olur. Bir nesneyi paylaşmak için aşağıdaki değerlerin bir kombinasyonunu kullanın:

Değer: Açıklama:

FILE_SHARE_DELETE Bir nesne açma dizisinin silme erişimi talep etmesine izin verir.

FILE_SHARE_READ Bir nesne açık dizisinin okuma erişimi istemesine izin verir.

FILE_SHARE_WRITE Bir nesne açık dizisinin yazma erişimi istemesine izin verir

lpSecurityAttributes İşlev tarafından döndürülen tanıtıcının alt süreç tarafından miras alınıp alınamayacağını belirleyen bir SECURITY_ATTRIBUTES yapısının adresi.

lpSecurityAttributes NULL ise, tanımlayıcı devralınamaz.

dwCreationDisposition

Değer: Açıklama:

CREATE_ALWAYS Her zaman yeni bir dosya oluşturur.

Dosya varsa, işlev dosyanın üzerine yazar.

CREATE_NEW Yeni bir dosya oluşturur. Dosya varsa işlev başarısız olur.

OPEN_ALWAYS Dosyayı her zaman aç. Dosya mevcut değilse, işlev onu dwCreationDisposition CREATE_NEW olduğunda aynı şekilde oluşturur.

OPEN_EXISTING Bir dosya açar. Dosya yoksa işlev başarısız olur.

TRUNCATE_EXISTING Bir dosya açar ve onu sıfır boyutuna kadar kısaltır. Dosya yoksa işlev başarısız olur.

dwFlagsAndAttributes Dosya bayrakları ve öznitelikleri.

Varolan bir dosya açıldığında, CreateFile şablon dosyasını yok sayar.

Dönüş değerleri:

İşlev başarılı olursa, belirtilen dosyaya açık bir tanıtıcı döndürülür. Belirtilen dosya işlev çağrısından önce varsa ve dwCreationDisposition CREATE_ALWAYS veya OPEN_ALWAYS ise, işlev başarılı olsa bile GetLastError ERROR_ALREADY_EXISTS döndürür. Dosya çağrıdan önce mevcut değilse, GetLastError 0 (sıfır) döndürür.

Hata durumunda işlev INVALID_HANDLE_VALUE değerini döndürür. Hata hakkında daha fazla bilgi için GetLastError'u arayın.

*/

if (hDevice! = 0) (

/*

hDevice, CreateFile tarafından döndürülen tanıtıcıdır.

dwIocontrolCode, gerçekleştirilecek işlemi gösteren bir değerdir.

lpInBuffer, dwIoControlCode'da belirtilen işlemi gerçekleştirmek için gereken verileri içeren arabelleğin adresidir. İşlem veri gerektirmiyorsa, NULL iletebilirsiniz.

nInBufferSize, lpInBuffer tarafından işaret edilen arabellekteki verilerin bayt cinsinden boyutudur.

lpOutBuffer, işlem başarılı olduğunda çıktı ile doldurulacak olan tamponun adresidir. İşlem çıktı sağlamıyorsa bu alan NULL OLMALIDIR.

nOutBufferSiz, lpOutbuffer tarafından işaret edilen arabelleğin bayt cinsinden boyutudur.

lpBytesReturned - lpOutBuffer'a girilen verilerin boyutunu alacak bir dword değişkeninin adresi.

lpOverlapped, işlemin asenkron olmasını istiyorsanız OVERLAPPED yapısının adresidir. İşlemin tamamlanmasını beklemek istiyorsanız bu alana NULL yazın.

*/

wsprintf ((LPSTR) stroka, "% X", adwOutBuffer); // ara belleğe bir satır yaz (adwOutBuffer -> stroka)

CloseHandle (hDevice);

0 döndür;

}

sürücü çekirdeği bilgisayar programı

2.3 Aşama 3

Course.cpp listeleniyor

#Dahil etmek

#Dahil etmek

#Dahil etmek

{

DWORD önemsiz;

0, // dosya öznitelikleri

dönüş (YANLIŞ);

}

0, // arabellek boyutunu girin

CloseHandle (hDevice);

dönüş (bSonuç);

}

int ana (int argc, karakter * argv)

{

/*

typedef yapısı (

PARTITION_STYLE PartitionStyle; // bölüm formatı

LARGE_INTEGER BaşlangıçOfseti; // bölümün başlangıcının ofseti

LARGE_INTEGER PartitionLength; // Bölüm boyutu

DWORD Bölüm Numarası; // Bölüm numarası

BOOLEAN Yeniden Yazma Bölümü; // bölüm yeniden yazılabilir ise DOĞRU

birlik (

PARTITION_INFORMATION_MBR Mbr; // MBR Stili bölümü hakkında ek bilgi

PARTITION_INFORMATION_GPT Gpt; // GPT Stili bölümü hakkında ek bilgiler

};

) BÖLÜM_BİLGİ_EX;

*/

BOOL bSonuç;

sistem ("DURAKLAT");

dönüş ((int) bSonuç);

}

2.4 4. Adım

1) 1-3 adımlarında geliştirilen tüm işlevleri bir dizi programda birleştirin.

Son kompleks şöyle görünmelidir:

- Sürücümüz sistemde yerleşiktir ve Windows önyükleme aşamasında yüklenir.

- Uygulama sürücüden gerekli bilgileri (2. adımda belirtilen) ister, sürücü bu bilgiyi iletir, bu sırada hoparlör de bir süre açılır ve bir melodi (1. adımda belirtilen) çalınır. Daha sonra uygulama sistemde bulunan sürücüye bir talepte bulunur (3. aşama seçeneğine göre).

2) Her aşama için teorik bilgilerin yanı sıra 4 aşamanın tümünü tanımlaması gereken bir açıklayıcı not yayınlayın.

#include "stdafx.h"

#include "windows.h"

#include "stdlib.h"

#define IOCTL_GET CTL_CODE (FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)

BOOL GetPartitionNumber (PARTITION_INFORMATION_EX * pex)

{

KOLU hCihaz; // kontrol edilen cihazın tanımlayıcısı

BOOL bSonuç; // sonuç bayrağı

DWORD önemsiz;

hDevice = CreateFile (METİN ("\\\\. \\ c:"), // açılacak cihaz

GENEL_OKU | GENERIC_WRITE, // cihaza erişim

FILE_SHARE_READ | FILE_SHARE_WRITE, // paylaşımlı kullanım modu

NULL, // varsayılan güvenlik özellikleri

OPEN_EXISTING, // konum

0, // dosya öznitelikleri

BOŞ); // dosya özniteliklerini kopyalama

if (hDevice == INVALID_HANDLE_VALUE) (// cihaz açılamıyor

printf ("CreateFile() başarısız! \ n");

dönüş (YANLIŞ);

}

bResult = DeviceIoControl (hDevice, // istenen cihaz

IOCTL_DISK_GET_PARTITION_INFO_EX, // yapılacak işlem

NULL, // giriş arabelleği için işaretçi

0, // arabellek boyutunu girin

pex, sizeof (* pex), // çıktı arabelleği

& önemsiz, // döndürülecek bayt sayısı

(LPOVERLAPPED) BOŞ); // giriş/çıkış senkronizasyonu (G/Ç)

CloseHandle (hDevice);

dönüş (bSonuç);

}

int _tmain (int argc, _TCHAR * argv) (

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

KOLU hCihaz;

BOOL DevControl;

DWORD dwBytes Geri Döndü;

LPVOID adwInBuffer, adwOutBuffer;

karakter vuruşu;

PARTITION_INFORMATION_EX pex; // cihaz yapısı

BOOL bSonuç;

hDevice = CreateFile ("\\\\. \\ sldevGet", GENERIC_READ + GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if (hDevice! = 0) (

DevControl = DeviceIoControl (hDevice, IOCTL_GET ve adwInBuffer, sizeof (adwInBuffer), & adwOutBuffer, sizeof (adwOutBuffer), & dwBytesReturned, NULL);

if ((DevControl! = 0) && (dwBytesReturned! = 0)) (

wsprintf ((LPSTR) stroka, "% X", adwOutBuffer); // ara belleğe bir satır yaz (adwOutBuffer -> stroka)

if (stroka == "000000100") MessageBox (BOŞ, "1,44 Mb bulundu", "Yermakov FDD tarayıcı", MB_OK);

else MessageBox (NULL, "Bulunamadı", "Yermakov FDD tarayıcı", MB_OK);

hSCManager = OpenSCManager (BOŞ, BOŞ, SC_MANAGER_CREATE_SERVICE);

if (hSCManager! = 0) (

GetFullPathName ("beeper.sys", sizeof acDriverPath, acDriverPath, NULL);

// SCM tablolarına bir müzisyen kaydedin

hService = CreateService (hSCManager, "beeper11", "Nice Melody Beeper11",

SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,

SERVICE_ERROR_IGNORE, acDriverPath, NULL, NULL, NULL, NULL, NULL);

if (hService! = 0) (

StartService (hService, 0, NULL);

DeleteService (hService);

CloseServiceHandle (hService);

) else MessageBox (NULL, "Sürücü kaydedilemiyor", NULL, MB_ICONSTOP);

CloseServiceHandle (hSCManager);

) else MessageBox (NULL, "SCManager'a bağlanılamıyor", NULL, MB_ICONSTOP);

) else MessageBox (NULL, "Kontrol kodu gönderilemiyor", NULL, MB_OK);

CloseHandle (hDevice);

) else MessageBox (NULL, "Dev mevcut değil", NULL, MB_ICONSTOP);

bSonuç = GetPartitionNumber (& pex);

if (bResult) (printf ("PartitionNumber =% d \ n", pex.PartitionNumber);

) else (printf ("GetPartitionNumber () başarısız oldu. Hata % d. \ n", GetLastError ());)

sistem ("DURAKLAT");

dönüş ((int) bSonuç);

}

3. Uygulama işlemi

Şekil 3.1. 2. adımdan itibaren sürücü

Şekil 3.2. 3. adımdan itibaren sürücü

Allbest.ru'da yayınlandı

benzer belgeler

    Çekirdek modu sürücüsü ve kullanıcı uygulaması arasındaki etkileşim mekanizmaları: çok katmanlı sürücü mimarisi, veri gizleme algoritması, sürücü-uygulama etkileşimi, dosya erişim filtreleme programının kullanıcı arabirimi.

    dönem ödevi, eklendi 06/23/2009

    Windows NT G/Ç mimarisi. USB veri yolunun dahili organizasyonu. WDM sürücü modelinin temel özelliği. Geliştirilmekte olan sürücünün giriş noktaları, kodun belleğe yerleştirilmesi, sürücünün sisteme yüklenmesi. Sürücü kodunun C'de uygulanması.

    dönem ödevi eklendi 27/09/2014

    Kullanıcının sistemle etkileşime girmesini sağlayan kullanıcı modunun yapısı. Kullanıcı uygulamalarının (programlarının) güvenli bir şekilde yürütülmesini sağlayan çekirdek modunun açıklaması. Windows NT donanım soyutlama katmanı.

    sunum 23.10.2013 tarihinde eklendi

    Windows çekirdeği 98. 16-bit çekirdek modüllerinin rolü. Performans sorunları. İşbirlikçi ve önleyici çoklu görev. Windows 98'de geliştirilmiş kaynak kullanımı. WordArt'ı kullanma. MS Outlook Express: mesaj oluşturma ve gönderme.

    test, 14/04/2005 eklendi

    Tüm bilgisayar cihazlarının ortak çalışması ve kaynaklarına erişim. Windows grafik işletim sisteminin kavramı ve işlevleri. Arka plan pencere servisi... Dosya sistemi yönetimi. Tak ve Çalıştır teknolojisi. Windows grafik arayüzü.

    test, 01/22/2011 eklendi

    İşletim sisteminin özellikleri. Windows'un gelişim tarihi. Windows sürümlerinin karşılaştırmalı özellikleri. Elementler ve Windows araçları XP. Windows XP'deki uygulama programları. Windows çalıştıran masaüstü ve dizüstü bilgisayarlarda çalışın.

    10/16/2011 tarihinde eklenen rapor

    Sistem iş parçacıkları oluşturmak için bir çekirdek modu sürücüsü ve kontrol uygulaması kullanma. Veri işlemeyi simüle etme ve gecikmeleri düzenleme. C++'da sürücü geliştirme. Test tezgahı konfigürasyonu. Gecikmeler ve zamanlayıcı işlemindeki değişikliklerin doğruluğu.

    dönem ödevi, eklendi 06/24/2009

    Windows işletim sisteminin iç yapısının ön çalışması. NT mimarisi ve çekirdek yapısı. Çekirdek modunda ve koristuvach modunda işlevleri geçersiz kılma yöntemleri. Sürücüyü anlamak. G / Ç paketleri. Windows sistemlerinin kararlılığının ve güvenliğinin değerlendirilmesi.

    dönem ödevi, eklendi 01/02/2014

    Güvenlik duvarı kavramı, türleri ve çalışması. Yerleşik Windows güvenlik duvarı. Windows XP SP2, güvenlik duvarı ayarlarına erişim Windows XP Service Pack 2. Windows Vista, trafiğe izin verdi. Windows 7, aktif profil ayarları. Kişisel Güvenlik Duvarı, test seviyeleri.

    özet, 19/11/2010 eklendi

    ile tanışma teknik özellikler kişisel bilgisayar... İşletim sisteminin kurulması ve Windows sürücüleri 7. Windows XP Professional SP3'ü temizleme yöntemleri. İşletim sistemi kurtarma yöntemleri. yükleme Microsoft Office 2010.

Çekirdek Modu Sürücüleri: Bölüm 1: Kavramlar - WASM.RU Arşivi

Mimariye genel bakış

Windows 2000'in iç dünyası, hem adres alanı açısından hem de yürütücünün bu adres alanındaki kodun hak ve sorumlulukları açısından açıkça tanımlanmış sınırlarla iki bölüme ayrılmıştır.

Adres alanının bölünmesi ile her şey şaşırtıcı derecede basittir. 32 bit mimaride mevcut olan dördü de gigabaytlar iki eşit parçaya bölünmüştür (4GT RAM Ayarlama ve Fiziksel Adres Uzantısını egzotik olarak atlıyorum). Alt kısım kullanıcı modu süreçlerine ayrılmıştır, üst kısım çekirdeğe aittir.

Hak ve sorumlulukların ayrılması biraz daha karmaşıktır.

Kullanıcı süreçleri aşağıdakileri içerir:

  • Sistem Destek İşlemleri - örneğin, Winlogon oturum açma işlemi (\% SystemRoot% \ System32 \ Winlogon.exe içinde uygulanır);
  • Hizmet İşlemleri - örneğin, bir yazdırma biriktiricisi;
  • Kullanıcı Uygulamaları - beş tür vardır: Win32, Windows 3.1, MS-DOS, POSIX ve OS / 2;
  • Ortam Alt Sistemleri - üç ortam alt sistemi desteklenir: Win32 (\% SystemRoot% \ System32 \ Csrss.exe'de uygulanır), POSIX (\% SystemRoot% \ System32 \ Psxss.exe'de uygulanır), OS / 2 (\% SystemRoot'ta uygulanır % \ System32 \ os2ss.exe).

Çekirdek aşağıdaki bileşenlerden oluşur:

    Yürütme sistemi (Yönetici) - bellek yönetimi, süreçler ve iş parçacıkları vb.;
  • Çekirdek - iş parçacığı zamanlaması, kesme ve istisna gönderimi vb. (\% SystemRoot% \ System32 \ Ntoskrnl.exe içinde uygulanır);
  • Aygıt Sürücüleri — donanım aygıt sürücüleri, ağ sürücüleri, dosya sistemi sürücüleri;
  • Donanım Soyutlama Katmanı (HAL) - yukarıdaki üç bileşeni donanım mimarileri arasındaki farklılıklardan yalıtır (\% SystemRoot% \ System32 \ Hal.dll'de uygulanır);
  • Pencereleme ve Grafik Sistemi - Grafik Kullanıcı Arayüzü (GUI) işlevleri (\% SystemRoot% \ System32 \ Win32k.sys içinde uygulanır).

Pirinç. 1-1. Basitleştirilmiş Windows 2000 Mimarisi

Kullanıcı modu ve çekirdek modu

Intel x86 işlemci ailesi dört ayrıcalık düzeyini (güvenlik halkaları olarak adlandırılır) desteklemesine rağmen, Windows yalnızca iki tane kullanır: çekirdek modu için 0 ve kullanıcı modu için 3. Bunun nedeni, yalnızca iki ayrıcalık düzeyine sahip olan diğer işlemciler (alfa, mips) desteğidir. Windows NT'nin önceki sürümleri bu mimarileri destekledi, ancak Windows 2000'de yalnızca x86 desteği kaldı.

Kullanıcı modu bileşenlerinin kendi korumalı adres alanları vardır, bu işlemlerin iş parçacıkları ayrıcalıksız işlemci modunda (kullanıcı modu olarak adlandırılır) çalışır, ayrıcalıklı işlemci komutlarını yürütemez, sistem verilerine ve sistem adres alanına sınırlı ve dolaylı erişime sahiptir, donanıma doğrudan erişiminiz yok ... Doğru, çalışmaları sırasında, sistem hizmetlerini çağıran bu işlemlerin iş parçacıkları çekirdek moduna girer, ancak bu durumda kullanıcı moduna dönene kadar yürütme üzerindeki kontrolünü tamamen kaybederler.

Kullanıcı modu süreçleri, sistem kararlılığı açısından potansiyel olarak tehlikeli olarak kabul edilir. Hakları sınırlıdır. Ve bu kısıtlamaların ötesine geçmeye yönelik tüm girişimler kesinlikle bastırılıyor.

Çekirdek bileşenleri tek bir adres alanını paylaşır, ayrıcalıklı işlemci modunda (çekirdek modu olarak adlandırılır) çalışır, ayrıcalıklı işlemci komutları dahil hepsini yürütebilir, sistem verilerine ve koduna sınırsız ve doğrudan erişime sahiptir, doğrudan veya HAL aracılığıyla erişime sahiptir. teçhizat.

Çekirdek kodu (aslında bu sistemin kendisidir) tamamen güvenilir olarak kabul edilir. Bu nedenle, sistem adres alanına yüklenen sürücü, sistemin bir parçası olur ve herhangi bir kısıtlamaya tabi değildir.

Böylece kullanıcı uygulamaları gerçek işletim sisteminden ayrılır. Sistemin dahili işlevlerine veya veri yapılarına erişim gerektiren herhangi bir ciddi uygulama yazmaya başladıysanız, yalnızca kodunuzu sistem adres alanına yerleştirerek üstesinden gelinebilecek birçok sınırlama ile karşılaşırsınız. Bunu yapmanın belgelenmiş tek yolu bir aygıt sürücüsü kurmaktır. Bu yöntem nispeten basit, güvenilir ve en önemlisi işletim sisteminin kendisi tarafından tam olarak destekleniyor.

Windows 2000 sürücüleri

Windows 2000, birçok aygıt sürücüsünü destekler.

Temsilcileri olan iki temel kişi vardır:

  • Kullanıcı Modu Sürücüleri:
    • Sanal Aygıt Sürücüleri (VDD) - MS-DOS programlarını desteklemek için kullanılır (Windows 95/98'deki VxD sürücüleriyle karıştırılmamalıdır - aynı ada sahip olmalarına rağmen bunlar tamamen farklı şeylerdir);
    • Yazıcı Sürücüleri
  • Çekirdek Modu Sürücüleri:
    • Dosya Sistemi Sürücüleri - yerel ve ağ sürücülerine G / Ç uygulayın;
    • Eski Sürücüler - için yazılmıştır önceki sürümler Windows NT;
    • Video bağdaştırıcıları için sürücüler (Video Sürücüleri) - grafik işlemlerini gerçekleştirin;
    • Akış Sürücüleri - video ve ses giriş / çıkışını uygulayın;
    • WDM (Windows Sürücü Modeli, WDM) sürücüleri - Plag and Play teknolojisini ve güç yönetimini destekler. Ayırt edici özelliği, düzeyde uyumluluktur. kaynak kodu Windows 98, Windows ME ve Windows 2000 arasında.

Farklı kaynaklarda yukarıdakilerden biraz farklı bir sınıflandırma bulabilirsiniz, konu bu değil. Önemli olan yazacağımız sürücülerin bu sınıflandırmanın herhangi bir noktasında yer almamasıdır. Bunlar ne dosya sistemi sürücüleri, ne eski sürücüler, ne de ekran kartı sürücüleri veya ses kartları ne de WDM sürücüleri, çünkü Plag "n" Play ve Güç Yönetimini desteklemez. Bunlar kullanıcı modu sürücüleri değil (hiç de ilginç değil). Aslında, sadece şeytan ne olduğunu biliyor, tk. Sistemin kendisi, anlaşılmaz bir cihaz için kolayca ve basitçe kendisine kod eklemenize ve onunla istediğinizi yapmanıza olanak tanır! Sanki geceleyin yabancı biri kapınızı çalmış, tek kelime etmeden onu gece içeri alıyor, hatta yatağınıza yatırıyorsunuz! Ancak, bu bir tür hata veya güvenlik açığı değildir. Sistem sadece çalıştığı şekilde çalışır. Başka türlü olamaz çünkü çevre ile etkileşime girerek, sistem kendisine erişim sağlamak zorunda kalır. Ve eğer böyle olmasaydı, tamamen kapalı, yani işe yaramaz bir sistem olurdu.

Adından da anlaşılacağı gibi aygıt sürücüsü, bir aygıtı kontrol etmek için tasarlanmış bir programdır ve bu aygıtın fiziksel olması gerekmez. Mantıksal veya bizim durumumuzda olduğu gibi sanal olabilir.

Bir aygıt sürücüsünün yapısı, Taşınabilir Yürütülebilir (PE) biçimindeki bir dosyadan başka bir şey değildir. Normal exe ve dll ile aynı. Sadece farklı kurallara göre yüklenir ve çalışır. Sürücüler, kullanıcı modundan çözülemeyen görevleri gerçekleştirmek için tasarlanmış çekirdek modu DLL'leri olarak düşünülebilir. Buradaki temel fark (ayrıcalık seviyesi dışında) sürücüye, ne koduna ne de verilerine doğrudan erişemeyeceğimiz, ancak Girdi / Çıktı Yöneticisi tarafından sağlanan özel bir mekanizma kullanacağımızdır. G / Ç yöneticisi, sürücülerin çalışması için bir ortam sağlar ve ayrıca bunları yüklemek, boşaltmak ve yönetmek için mekanizmalar sağlar.

Çekirdek modu sürücüleri geliştirmeye başladığınızda, kendinizi tam bir acemi gibi hissedeceksiniz. tüm geçmiş deneyimler API kullanımı burada yardımcı olmaz - çekirdek tamamen farklı bir dizi işlev sağlar. Ayrıca yetersiz belgelenmiş (yalnızca başlık dosyalarında tanımlanmıştır) veya tamamen belgelenmemiş işlevler ve veri yapıları kullanmanız gerekecektir.

Tek ve çok seviyeli sürücüler

Çoğu fiziksel aygıt kontrol sürücüsü, katmanlı sürücülerdir. G/Ç istek işleme, birden çok sürücü arasında paylaşılır. Herkes üzerine düşeni yapıyor. Örneğin, bir dosyayı okuma isteği dosya sistemi sürücüsüne iletilir ve bu sürücü, bazı işlemleri gerçekleştirdikten sonra (örneğin, isteği birkaç parçaya bölerek), onu disk sürücüsüne iletir ve bu sürücü de otobüs şoförüne rica. Ek olarak, bu sürücüler arasına istediğiniz sayıda filtre sürücüsü ekleyebilirsiniz (örneğin, verileri şifreleme). İsteği yürüttükten sonra, alt düzey sürücü sonuçlarını "yukarı" üst düzey sürücüye iletir. Ama neyse ki, bizimle her şey çok daha kolay olacak. Sürücülerimiz her zaman yekpare sürücüler olacak ve bu da onları yazma ve hata ayıklama sürecini büyük ölçüde basitleştirecek.

Akış bağlamı

Çoğu durumda, yalnızca bir işlemcimiz olduğundan ve yürütülmesi gereken birçok uygulama olduğundan, eşzamanlı yürütme yanılsaması yaratmak için bu uygulamaların işlemciye sırayla ve çok hızlı bir şekilde bağlanması doğaldır. Bu prosedür, iş parçacığı bağlam değiştirme olarak adlandırılır. Sistem aynı işleme ait iş parçacıklarının bağlamını değiştirirse, bağlantısı kesilen iş parçacığının işlemci kayıtlarının değerini kaydetmek ve bağlı iş parçacığının işlemci kayıtlarının önceden kaydedilmiş değerlerini yüklemek gerekir. Ve bazı veri yapılarını güncelleyin. Bağlanacak iş parçacığı başka bir işleme aitse, işlemin sayfa dizinine bir işaretçiyi işlemcinin CR3 kaydına yüklemek gerekir. Her kullanıcı işlemine özel bir adres alanı sağlandığı için, farklı işlemler farklı adres alanları projeksiyonlarına sahiptir, bu da farklı sayfa dizinlerine ve işlemcinin sanal adresleri fiziksel adreslere çevirdiği sayfa tablosu kümelerine sahip oldukları anlamına gelir. Bütün bunlar doğrudan sürücü programlama ile ilgili değildir. Ancak şununla bağlantılı olarak size şunu hatırlatıyorum. Bağlam değiştirme en hızlı işlem olmadığı için, nedenler yüzünden sürücüler daha iyi performans, kural olarak, kendi akışlarını oluşturmayın. Ancak sürücü kodunun hala yürütülmesi gerekiyor. Bu nedenle, bağlamları değiştirmek için zaman kazanmak için, sürücüler üç bağlamdan birinde çekirdek modunda yürütülür:

  • G/Ç isteğini başlatan kullanıcı iş parçacığı bağlamında;
  • çekirdek modu sistem iş parçacığı bağlamında (bu iş parçacıkları Sistem işlemine aittir);
  • bir kesintinin sonucu olarak (ve dolayısıyla kesinti anında geçerli olan herhangi bir işlem veya iş parçacığı bağlamında değil).

"Herhangi bir süreç veya akış bağlamında değil", ancak onu yazan kişilerin (D. Solomon ve M. Russinovich) yetkisi göz önüne alındığında, bir şeyi nasıl yapabileceğinizi tam olarak anlamıyorum. lazım çünkü... bırakın donanım kesintilerini, yazılım kesintilerini ele almayacağız, üçüncü durumu hemen unutabilirsiniz. İlk iki seçenek kalır. Bir G/Ç isteği başlatılırsa, iş parçacığı bağlamında bu isteği başlatırız ve bu nedenle, bu iş parçacığının ait olduğu işlemin adres alanına doğrudan erişebiliriz. Sistem iş parçacığı bağlamındaysak, herhangi bir kullanıcı işlemine doğrudan erişemeyiz, ancak her zaman sistem iş parçacığına başvurabiliriz. Sürücüden böyle bir adreste bir işlem için ne olduğunu görmeniz gerekiyorsa, bağlamı kendiniz değiştirmeniz veya adresleri sayfa tablolarından çevirmeniz gerekir.

Kesinti isteği seviyeleri

Kesinti, herhangi bir işletim sisteminin ayrılmaz bir parçasıdır. Kesinti işleme gerektirir, bu nedenle mevcut kodun yürütülmesi sonlandırılır ve kontrol kesme işleyicisine aktarılır. Hem donanım hem de yazılım kesintileri vardır. Kesintilere önceliklerine göre hizmet verilir. Windows 2000, kesme istek düzeyleri (IRQL) olarak bilinen bir kesme önceliği düzeni kullanır. En düşük önceliğe sahip 0'dan (pasif) en yüksek önceliğe sahip 31'e (yüksek) kadar toplam 32 seviye vardır. Ayrıca, IRQL = 0 (pasif) ila IRQL = 2 (DPC \ sevk) arasındaki kesmeler yazılımdır ve IRQL = 3 (cihaz 1) ila IRQL = 31 (yüksek) arasındaki kesmeler donanımdır. Kesinti önceliği düzeylerini iş parçacığı öncelik düzeyleriyle karıştırmayın - bunlar tamamen farklı şeylerdir. IRQL = 0 olan bir kesme, kesinlikle konuşmak gerekirse, bir kesme değildir, çünkü herhangi bir kodun çalışmasını kesintiye uğratamaz (sonuçta bunun için bu kodun daha da düşük bir kesme düzeyinde yürütülmesi gerekir ve böyle bir düzey yoktur). Bu IRQL'de kullanıcı modu iş parçacıkları yürütülür. Ve sürücülerimizin kodu da bu IRQL üzerinde yürütülecektir. Bu, herhangi bir sürücünün kodunun her zaman "pasif" düzeyde yürütüldüğü anlamına gelmez. Sadece herhangi bir yazılım veya donanım kesintisini işlemeyeceğiz. Ve buradan en az iki çok önemli sonucu takip edin.

Birincisi: daha yüksek öncelikli bir kesintiyi işlemek için sürücülerimizin çalışması herhangi bir zamanda kesintiye uğrayabilir (örneğin, zamanlayıcıdan, zamanlayıcı iş parçacığımızın uzun süredir bir işlemciye sahip olduğunu ve bunun zamanı geldiğini düşündüğünde) dinlenmek). Dolayısıyla, bu anlamda, sürücülerimizin kodu, herhangi bir kullanıcı iş parçacığının kodu gibi, kesilebilir ve önleyicidir (işlemci başka bir iş parçacığına verilir). Mevcut kesme seviyesini öğrenmenize, artırmanıza veya azaltmanıza izin veren çekirdek işlevleri vardır.

İkinci önemli nokta: Pasif kesme düzeyinde, herhangi bir çekirdek işlevini (DDK'da, her işlevin açıklamasında, hangi kesme düzeyinde çağrılabileceğini belirtmek gerekir) çağırabilir ve bellek sayfalarına erişebilirsiniz. disk belleği dosyasına atılır. Daha fazlası için yüksek seviyeler kesintiler (DPC / dispath ve üstü), fiziksel bellekte olmayan bir sayfaya erişme girişimi sistem çökmesine neden olur. Bellek Yöneticisi sayfa hatasını işleyemez.

"Ölümün Mavi Ekranı"

Sanırım herkes en az bir kez "Ölümün Mavi Ekranı" (BSOD) adlı heyecan verici bir resim görmüştür. Muhtemelen ne olduğunu ve neden oluştuğunu açıklamaya gerek yoktur. Buradaki önemli şey, çekirdek modu sürücüleri geliştirmeye başladığınızda, BSOD'nin monitör ekranınızda oldukça sık görüneceği gerçeğine hazırlıklı olun.

Üçüncü halkada her şey basitti: Örnek bir kod çizdim, gerektiğinde int3'ü yerleştirdim, başlattım ve ... hata ayıklayıcıda neyin ne olduğunu zaten anladınız. Bir şey yanlışsa, onu çiviledim, hataları düzelttim, yeniden derledim ... vb. Kod gerektiği gibi çalışana kadar. Sürücüleri programlarken bu tekniği unutabilirsiniz. Burada "sapper" bir kez yanılıyor. Bir yanlış hareket ... ve bir an için arkanıza yaslanıp rahatlayabilirsiniz.

BSOD'yi olabildiğince nadiren görmek için, çok basit bir kurala uymalısınız: "Yedi kez ölçün - bir kes" ... "Yedi kez kontrol et - bir çalıştır" anlamında. Elbette söylemesi kolay ama yapması çok daha zor. Ancak bir kural olarak, yazacağınız sürücülerin yapısının (bu makaleleri okuduktan sonra) nispeten basit olduğu göz önüne alındığında, BSOD görünmeden önce bile hatalarla başa çıkabilirsiniz. Eğer ısrarla gözünüzün önüne geliyorsa ve nedenini bir türlü anlayamıyorsanız, olası yol Durumu netleştirmek için bir çökme dökümünün (çarpma dökümü) analizidir. Ne olduğu, nasıl yapılacağı hakkında bilgi edinebilir ve Mark Russinovich'in "Çökme bellek dökümlerinin analizi" makalesinde analiz edebilirsiniz http://www.osp.ru/win2000/2001/03/025.htm. Bu konu (analiz) çok zor ama o noktaya gelmeyeceğini düşünüyorum.

Ben boktan bir teorisyenim, bu yüzden yukarıdakilerin tümü, kesinlikle anlaşılması gereken ilkeler hakkında çok temel bilgiler olarak kabul edilebilir. İş parçacığı bağlamı, kesme seviyeleri ve iş parçacığı öncelikleri, çekirdek / kullanıcı modu vb.'nin ne olduğunu bilmeden çekirdek modu sürücüleri geliştirmeye başlayamazsınız. vesaire. Bazı sorular hakkında emin değilsiniz - referans listesi aşağıdadır.

Şimdi daha pratik bazı şeyleri vurgulayacağız (sonraki makalelerde tamamen pratik hale gelecekler), yani tüm bu teoriyi pratiğe dönüştürmek için neye ihtiyacımız var.

Sürücü Geliştirme Kiti

Birincisi, elbette, Microsoft web sitesinden ücretsiz olarak indirilebilen Aygıt Sürücüsü Geliştirme Seti (Windows 2000 Sürücü Geliştirme Seti, 2KDDK) (her durumda, buradan tamamen ücretsiz olarak birleştirdim: http:// www.microsoft.com/ddk/). Bu paket, aygıt sürücüleri tarafından kullanılan dahili veri yapıları ve dahili sistem işlevleri hakkında zengin bir bilgi kaynağı olan belgeleri içerir.

DDK, belgelere ek olarak, bağlantı için vazgeçilmez olacak bir dizi kitaplık dosyası (* .lib) içerir. DDK, bu dosyaların iki grubunu içerir: Windows'un son sürümü için (ücretsiz derleme olarak adlandırılır); ve bir hata ayıklama için (kontrol edilen yapı olarak adlandırılır). Bu dosyalar sırasıyla % ddk% \ libfre \ i386 ve % ddk% \ libchk \ i386 dizinlerinde bulunur. Hata ayıklama sürümü daha katı hata denetimine sahiptir. Sisteminizin sürümünüze karşılık gelen dosyaları \ masm32 \ lib \ w2k dizinine yerleştirerek kullanmanız gerekir.

Dosyaları dahil et

Ayrıca fonksiyon prototipi tanımlarına sahip (* .inc) dosyalarına da ihtiyacımız var. Biz (ya da daha doğrusu ben) bunları kendimiz de yapmak zorunda kalacağız. Her ikisi de masm32 by hutch paketine dahil olan ve İnternet'in uçsuz bucaksız alanlarından farklı zamanlarda benim tarafımdan birleştirilen * .lib -> * .inc'yi dönüştüren birçok farklı yardımcı programı denedim. Stokta olanlardan sadece f0dder tarafından protoize.exe göreviyle başa çıktı ve pratikte hiçbir şeyi elle düzenlemek zorunda kalmadım. Bu harika araç \tools\protoize dizininde bulunacaktır. Yazarın sitesi: http://f0dder.didjitalyphrozen.com/. Sadece onu orada bulamayacaksın. f0dder bu yardımcı programı birkaç kez http://board.win32asmcommunity.net/ adresinde yayınladı. Dahil edilenler \ include \ w2k dizininde olacaktır. \ masm32 \ include \ w2k dizinine yerleştirilmelidirler. Dönüştürme için Windows 2000'in ücretsiz sürümü için * .lib kullandık, çünkü bu seçeneğe sahibim (ve tabii ki siz de).

Bir sonraki sorun daha ciddi. Bu, gerekli yapıların, sembolik sabitlerin ve makroların tanımlarını içeren içerme dosyalarının neredeyse tamamen yokluğudur. İnternette kayda değer hiçbir şey bulamazsınız - çekirdek modu sürücülerini assembler'da yazmak çok egzotik. EliCZ http://www.anticracking.sk/EliCZ/ adresinde bir şeyler bulunabilir. Y0da http://mitglied.lycos.de/yoda2k/index.htm'den bir şey (kısmen kendisi tarafından yapılmış, kısmen aynı EliCZ'den alınmıştır). Ancak bu çok kötü bir şekilde yapılıyor (Slovak ve Alman meslektaşlarımıza olan tüm derin saygımla): birçok yapının üyelerinin adları, DDK'nın orijinal başlık dosyalarında tanımlananlardan farklıdır; iç içe yapılar ve birleşimlerin isimleri yoktur; orijinalinde isimleri olmasına rağmen. Ve genel olarak, her şey biraz düzensizdir ve bakıldığında iç karartıcı bir izlenime neden olur. Sadece ntstatus.inc iyi durumda. Bu kısmen, EliCZ'nin DDK'nın yokluğunda bile (kendisinin dediği gibi) kendi inklud'lerini yaratmaya başlamasından kaynaklanmaktadır. Her durumda, en azından kapsamlı bir test yapmadan bunları kullanmanızı tavsiye etmiyorum. Bir zamanlar http://board.win32asmcommunity.net/ konferansında bir şeyler parladı, ancak kalite de özellikle etkileyici değil. Kısacası, bu durumda tek doğru çözüm, bu işlemi otomatikleştirmenize izin veren herhangi bir araç bilmediğim için her şeyi kendimiz ve manuel olarak yapmaktır. Aniden değerli bir şeye rastlarsanız, bunu bir iş olarak görmeyin - bana bildirin.

Hata ayıklama sürücüleri

Ayrıca bir hata ayıklayıcıya ihtiyacımız var ve çekirdek modu kodunun hata ayıklanması gerekeceğinden, uygun hata ayıklayıcıya da ihtiyaç var. En iyi seçim SoftICE olacaktır. Veya DDK ile birlikte gelen Çekirdek Hata Ayıklayıcısını kullanabilirsiniz. Bu hata ayıklayıcı, herkesin karşılayamayacağı bir ana ve bir bağımlı olmak üzere iki bilgisayar gerektirir. Mark Russinovich (http://www.sysinternals.com/), ikinci bir bilgisayara bağlanmadan Kernel Debugger'ı kullanmanıza izin veren LiveKd yardımcı programını yazdı. Sitede olup olmadığını bilmiyorum (kontrol etmedim), ancak diskte "İç yapı" kitabına Microsoft Windows 2000" mevcuttur. Ayrıca, bu hata ayıklayıcı, Microsoft web sitesinden ücretsiz olarak indirilebilen (veya yüklenebilen) hata ayıklama sembollerini yüklemiş olmanız koşuluyla, sistemin iç yapısını incelemek için son derece yararlıdır.

  • David Solomon, Mark Russinovich, "Microsoft Windows 2000'in İçinde", ed. Peter, 2001.

    Bu kitap tek bir kaynak kodu satırı içermese de, öncelikle programcılar içindir.

  • Sven Schreiber, "Belgelenmemiş Windows yetenekleri 2000 ", ed." Peter ", 2002.

    Windows 2000'in birçok sırrını açığa çıkaran tamamen pratik bir kitap.

  • Walter Öney, "Microsoft Sürücü Modelinin Programlanması", Microsoft Press, 1999

    Bu kitap Plag "n" Play sürücülerine odaklanıyor, ancak bu, onun yararlarını hiç de dile getirmiyor, çünkü sürücü geliştirmenin temel ilkeleri evrenseldir.

  • Jeffrey Richter, Profesyoneller için Windows: Windows 64-Bit için Etkili Win32 Uygulamaları Oluşturma, ed. Peter, 2000.

    Bu kitabın sürücü programlama ile ilgisi yok ama aynı zamanda çok ilginç ;-)

    Bu liste hiçbir şekilde eksiksiz olarak tasarlanmamıştır. İnternette, özellikle İngilizce olarak çok şey bulunabilir (Schreiber hariç, tüm kitaplar elektronik biçimdedir). Kitaplara gelince, hepsinin "alınması gereken" kategorisinin olduğunu da söylemek isterim. Göreceksiniz - bakmadan satın alın. Walter "ve Öney hariç hepsi" bizim "büyük ve güçlü"müze çevrildi.

    Ve son şey. Sürücü geliştirme alanında büyük bir uzman değilim, bu nedenle hem bu hem de sonraki tüm makalelerde hatalar veya yanlışlıklar olması çok muhtemeldir. Bul - cesurca burnunu sok. Teşekkür edeceğim.