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.