電腦出了問題 所以隔了幾天才新增文章
驅動分為兩種
NT式驅動 ,WDM式驅動
今天咱們來編寫一個NT式驅動代碼
編寫驅動 除了所需的源代碼*.c,*.cpp 頭文件*.h,之外
還需要兩個配置文件
Sources , makefile
1.建立makefile
新增文字文件
增加以下代碼
# 一般只有一行,固定格式,不需更改(#是注釋,不影響代碼)
INCLUDE $(NTMAKEENV)\makefile.def
儲存成makefile,將副檔名txt 刪除
2.建立Sources
新增文字文件
增加以下代碼
#驅動名稱
TARGETNAME=DDK_HelloWorld
#指定生成文件類型Driver =驅動
TARGETTYPE=DRIVER
#生成驅動時所在目錄
TARGETPATH=SYS
#這邊指定驅動頭文件目錄
INCLUDES=$(BASEDIR)\inc;\
$(BASEDIR)\inc\wxp;\
##上面一定要空一行D:\WINDDK\3790.1830 =$(BASEDIR)
#這邊是驅動源文件
SOURCES=DDK_HelloWorld.c\
儲存成Sources,將副檔名txt 刪除
3.開始編寫驅動代碼
新增文字文件,更改成DDK_HelloWorld.c
可以直接用記事本書寫代碼
#include //ntddk.h 是NT式驅動的相關申明
#define INITCODE code_seg("INIT") /*入口函數DriverEntry 需要放在INIT的內存中,當驅動加載時需要載入內存,當加載成功時函數就會將內存卸載掉*/
#define PAGECODE code_seg("PAGE") //內存不足時 可以置換到硬碟
#pragma INITCODE
VOID DDK_Unload (IN PDRIVER_OBJECT DriverObject); //前置說明卸載例程,學過C或C++的都應該知道
/*驅動入口函數DriverEntry,他有一個返回值
我們將他的返回類型設置為NTSTATUS
NTSTATUS的定義
typedef LONG NTSTATUS;
其實他也就是Long的類型
入口函數有兩個參數 DriverObject , RegistryPath
DriverObject 用來傳遞驅動對象 I/O管理器 傳進來的驅動對象
RegistryPath 這個參數用來指向驅動負責的註冊表,也就是驅動在註冊表中的路徑
*/
//入口函數
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING A)
{
//KdPrint 是一個宏 需要用兩個括弧 功用和DbgPrint一樣
KdPrint(("驅動加載成功!!"));
//DriverUnload 指定驅動卸載時所用的回調函數地址
DriverObject->DriverUnload=DDK_Unload;
return 1 ;
}
//驅動卸載
VOID DDK_Unload(IN PDRIVER_OBJECT DriverObject)
{
KdPrint(("驅動卸載成功!!"));
}
這是一個簡單的NT式驅動
之後還得創建設備
光是這樣還不算是一個完整的代碼
之後的會在寫
留言列表