⑴ 學習windows驅動編程有什麼用
驅動程序(Device Driver)全稱為「設備驅動程序」,是一種可以使計算機和設備通信的特殊程序。可以說相當於硬體的介面,操作系統只能通過這個介面,才能控制硬體設備的工作,假如某設備的驅動程序未能正確安裝,便不能正常工作。驅動程序在系統中所佔的地位十分重要, 驅動程序給我的首先印象應該是面對設備與操作系統的,但是並不一定每一個驅動程序都是與硬體相關聯的.在實際的驅動程序開發中不要狹義的理解為硬體,應該理解為設備,硬體也可以叫做設備,在計算機系統中虛擬的也可以是設備,比如 磁碟卷,分區、網路協議、以及其他的設備驅動程序都是設備,那麼與硬體無關的驅動程序,比如NDIS驅動,文件過濾系統驅動、磁碟過濾系統驅動程序、文件透明加密驅動... 他們所面對的設備不一樣而已 我們形象的理解為NDIS是與網路中間層通訊協議(設備)驅動,卷(設備)過濾驅動,文件系統(設備)過濾驅動。 INTEL的CPU從286開始引入保護模式,特權級分為四層,為:PL0-PL3,對應該操作系統中一般稱為RING0-RING3,但其實WINDOWS只用了RING0和RING3兩層,分別為OS核心層和用戶程序層。驅動程序的強大之處就是因為他在OS核心層(Ring0)運行,在RING0層運行有什麼強大的呢,因為操作系統的保護模式限制,在RING3層很多操作受到限制,比如 直接IO硬體、開啟/關閉中斷等等特權指令必須在RING0層才能執行、如果你在RING3層執行此類代碼就會收到一個類似於 【應用程序指令錯誤】的消息提示,而相關的應用程序也會被WINDOWS終止,在CPU的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰,所以在RING3受到限制.必須在RING0下運行. 如何理解驅動程序的重要性與強大之處,再看看我們在操作計算機的內部流程,我們簡單的理解為 輸入-應用程序--內核-設備,在這里在最後有個『設備』但是某些操作的流程並不是一定是與設備有關的,可能僅僅是一系列的簡單的操作僅僅是與API有關的.比如OpenProcess、 NtTerminateProcess 在應用程序調用的時候,在RING3的最後一步是在NTDLL 最終由NTDLL進入內核 ,基本上可以這樣概括一下,就是所有的操作在進入計算機底層以後都要進過相關驅動程序,在這些功能調用上用個形象的說法 應用層是『標』,那麼驅動層就是『本』,還有就是驅動層作為操作系統與設備(不一定是硬體)的中間橋梁,有著一夫當關的重大作用,哈哈.... 太多說不完,LZ自己找資料看看..
⑵ 什麼是事件驅動編程語言
事件驅動程序
可以由任何編程語言來實作,然而使用某些語言來撰寫會比其他的語言來的簡單。有些集成開發環境(簡稱IDE
)也會影響實作事件驅動程式設計的難易程度。
⑶ 什麼是windows驅動編程
linux的內核編程大家都是比較熟悉的。而Windows內核編程則不大為一般讀者所熟悉。常常有這樣的問題:
「你又沒有Windows的代碼,你如何搞內核編程?」
「除了微軟的人,難道還有人做Windows內核嗎?」
「Windows內核編程有用嗎?」
其實Windows內核編程不但有用,而且常用。很多我們每天都使用的軟體,就毫無疑問的使用了Windows內核編程的技術。最典型的就是實時監控的殺毒軟體。此外還有防火牆、虛擬光碟機、以及90%的驅動程序。這些程序的有一個共同的特點,他們的一部分組件,是作為Windows的一部分,能對 Windows上運行的所有的應用程序起作用。
因此內核編程的應用,往往給傳統軟體帶來更強的功能,實現技術上的飛躍。
舉個例子。我們常常聽說,對文件進行加密,可以使文檔更加安全。對文件加密並不需要任何內核組件。我們可以寫一個應用程序,讀入文件,加密數據,然後重寫為一個加密文件。解密也可以同樣如此。
但是實際上這並不滿足一般的用戶需求。對一個公司的員工來說,那些「重要的文檔」很可能就是每天工作所用的文件。想像一下,他必須要每天從伺服器上下載加密的文件,然後用解密工具解密。然後用Office開始工作。工作完畢後,用加密工具加密,再上傳,然後刪除工作文檔。且不說大部分時間文檔是以解密的方式保存在硬碟上的不安全性,這個工作流程是可以接受的嗎?沒有人會接受的。
比較「人性化」的方式就是讓Office可以直接打開已經加密的文檔。保存的時候,直接就保存成加密的文檔。硬碟上,這個文檔始終是加密的。而且對合法的用戶透明。對非法的用戶,則只能看見密文,從而無法編輯也無法閱讀。而且也不僅僅Office,還有AutoCAD、Visual Studio、Photoshop等等用戶可能用於編輯機密文件的所有的工具。這是可以實現的嗎?如果我們不能去修改Office和其他的工作軟體。
這當然是可以實現的。既然我們編寫Windows內核程序,當然可以讓Windows的文件系統從硬碟讀取文件的時候,對特定的進程進行特別的解密。等這些軟體讀取到數據的時候,它們讀到的已經是正常的數據了。這個過程和實時掃描病毒的原理是一樣的,使用一個文件過濾驅動程序。這就是讀者可能已經聽到過的文件透明加密技術。
在和《天書夜讀:從匯編語言到Windows內核編程》一書同一系列的《寒江獨釣——Windows內核編程與信息安全》(預計明年出版)中,對鍵盤過濾、硬碟過濾、文件過濾、網路過濾等安全相關的內核編程,都有詳盡的講解和例子。
內核編程的另一個特點是:這些代碼運行在R0級。R0級別是最高特權級別。對CPU有完全控制的能力。這非常的適合一些安全軟體,當然也適合做破壞的工作。因為內核程序有最高(也就是根)許可權,這樣的技術在安全領域(或者破壞領域)被稱為rootkit技術。rootkit技術是當前安全領域最熱門的技術之一。
許多病毒使用了rootkit技術。用來隱藏病毒文件,竊取密碼、發送攻擊包等等。rootkit病毒感染後極難清除,在感染前提前防範是最有效的辦法。
Windows內核確實沒有公開源代碼。但是MS提供Windows內核程序的開發包:WDK。WDK實際上主要用於開發驅動程序。而驅動程序基本上都是內核程序。WDK提供的頭文件以及部分源代碼,實際上就是Windows內核的代碼的一部分。有部分驅動程序(比如FAT32文件系統)的代碼是完全公開的。我們也可以在這里看到Windows內核開發者的代碼風格。同時,微軟也提供了所有Windows版本的符號表在網上供研究者下載。並提供了功能無比強大的調試器WinDbg。有了它們,你就可以輕松的調試Windows內核了。無論是你自己寫的代碼的部分,還是Windows內核開發者們編寫的部分。雖然看到的是匯編語言,但是函數名和全局變數名都是存在的。而且,所有的這些(WDK、WinDBG,符號表)都是免費的。
那您還在等什麼呢?歡迎進入Windows內核編程的世界!
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/broadviewprograming/archive/2009/03/10/3975093.aspx
⑷ 什麼是事件驅動編程機制
事件驅動編程機制為需要處理的事件編寫相應的事件處理程序
要理解事件驅動和程序,就需要與非事件驅動的程序進行比較。
實際上,現代的程序大多是事件驅動的,比如多線程的程序,肯定是事件驅動的。
早期則存在許多非事件驅動的程序,這樣的程序,在需要等待某個條件觸發時,會不斷地檢查這個條件,直到條件滿足,這是很浪費cpu時間的。
而事件驅動的程序,則有機會釋放cpu從而進入睡眠態(注意是有機會,當然程序也可自行決定不釋放cpu),當事件觸發時被操作系統喚醒,這樣就能更加有效地使用cpu。
(4)驅動編程擴展閱讀:
為需要處理的事件編寫相應的事件處理程序。代碼在事件發生時執行。
delphi和java編程特點
n事件(event)表示程序某件事發生的信號,事件分為:
o外部事件:由外部用戶動作產生的事件。例如,點擊滑鼠、按鍵盤。
o內部事件:由系統內部產生的事件。例如,定時器事件。
n源對象(source object)是產生事件的對象。
⑸ VC驅動編程
推薦幾本
《天書夜讀-從匯編語言到windows內核編程》
《寒江獨釣-windows內核安全編程》
《Windows驅動開發技術詳解》
網上都有pdf版本的,你可以到verycd上或者其他地方搜索的到下載地址
⑹ 事件驅動編程的事件驅動編程:
為需要處理的事件編寫相應的事件處理程序。代碼在事件發生時執行。
delphi和java編程特點
n事件(event)表示程序某件事發生的信號。事件分為:
o外部事件:由外部用戶動作產生的事件。例如,點擊滑鼠、按鍵盤。
o內部事件:由系統內部產生的事件。例如,定時器事件。
n源對象(source object)是產生事件的對象。
⑺ 如何編寫驅動程序
代碼:
#include<linux/mole.h>
#include<linux/kernel.h>
#include<asm/io.h>
#include<linux/miscdevice.h>
#include<linux/fs.h>
#include<asm/uaccess.h>
//流水燈代碼
#define GPM4CON 0x110002e0
#define GPM4DAT 0x110002e4
static unsigned long*ledcon=NULL;
static unsigned long*leddat=NULL;
//自定義write文件操作(不自定義的話,內核有默認的一套文件操作函數)
static ssize_t test_write(struct file*filp,const char __user*buff,size_t count,loff_t*offset)
{
int value=0;
int ret=0;
ret=_from_user(&value,buff,4);
//底層驅動只定義基本操作動作,不定義功能
if(value==1)
{
*leddat|=0x0f;
*leddat&=0xfe;
}
if(value==2)
{
*leddat|=0x0f;
*leddat&=0xfd;
}
if(value==3)
{
*leddat|=0x0f;
*leddat&=0xfb;
}
if(value==4)
{
*leddat|=0x0f;
*leddat&=0xf7;
}
return 0;
}
//文件操作結構體初始化
static struct file_operations g_tfops={
.owner=THIS_MODULE,
.write=test_write,
};
//雜設備信息結構體初始化
static struct miscdevice g_tmisc={
.minor=MISC_DYNAMIC_MINOR,
.name="test_led",
.fops=&g_tfops,
};
//驅動入口函數雜設備初始化
static int __init test_misc_init(void)
{
//IO地址空間映射到內核的虛擬地址空間
ledcon=ioremap(GPM4CON,4);
leddat=ioremap(GPM4DAT,4);
//初始化led
*ledcon&=0xffff0000;
*ledcon|=0x00001111;
*leddat|=0x0f;
//雜設備注冊函數
misc_register(&g_tmisc);
return 0;
}
//驅動出口函數
static void __exit test_misc_exit(void)
{
//釋放地址映射
iounmap(ledcon);
iounmap(leddat);
}
//指定模塊的出入口函數
mole_init(test_misc_init);
mole_exit(test_misc_exit);
MODULE_LICENSE("GPL");
include用法:
#include命令預處理命令的一種,預處理命令可以將別的源代碼內容插入到所指定的位置;可以標識出只有在特定條件下才會被編譯的某一段程序代碼;可以定義類似標識符功能的宏,在編譯時,預處理器會用別的文本取代該宏。
插入頭文件的內容
#include命令告訴預處理器將指定頭文件的內容插入到預處理器命令的相應位置。有兩種方式可以指定插入頭文件:
1、#include<文件名>
2、#include"文件名"
如果需要包含標准庫頭文件或者實現版本所提供的頭文件,應該使用第一種格式。如下例所示:
#include<math.h>//一些數學函數的原型,以及相關的類型和宏
如果需要包含針對程序所開發的源文件,則應該使用第二種格式。
採用#include命令所插入的文件,通常文件擴展名是.h,文件包括函數原型、宏定義和類型定義。只要使用#include命令,這些定義就可被任何源文件使用。如下例所示:
#include"myproject.h"//用在當前項目中的函數原型、類型定義和宏
你可以在#include命令中使用宏。如果使用宏,該宏的取代結果必須確保生成正確的#include命令。例1展示了這樣的#include命令。
【例1】在#include命令中的宏
#ifdef _DEBUG_
#define MY_HEADER"myProject_dbg.h"
#else
#define MY_HEADER"myProject.h"
#endif
#include MY_HEADER
當上述程序代碼進入預處理時,如果_DEBUG_宏已被定義,那麼預處理器會插入myProject_dbg.h的內容;如果還沒定義,則插入myProject.h的內容。
⑻ 深入理解linux驅動程序設計怎麼樣
《LINUX設備驅動程序(第3版)》詳細介紹了Linux。
如果您希望在Linux操作系統上支持計算機外部設備,或者在Linux上運行新的硬體,或者只是希望一般性地了解Linux內核的編程,就一定要閱讀本書。
本書描述了如何針對各種設備編寫驅動程序,而在過去,這些內容僅僅以口頭形式交流,或者零星出現在神秘的代碼注釋中。
⑼ 做驅動編程都需要學會哪些語言
學做驅動不僅僅需要語言。。。。
首先,由於是驅動,所以必須了解一些底層的東西,對於計算機組成的原理必須清楚明白其如何實現,所以得學這門課。。
其次,要了解數字信號,所以還得學習數字電路。。。。我記得當年數字電路最常用的就是對於8259A中斷處理進行編程,所以得學。。。。
接著,還要會匯編以及C語言。。。
做驅動這東西不是說學語言就有用的。。。。。還得學習其他的,不然將來用起來由於不知道本質學起來很慢