!!版權聲明:本文為博主原創文章,版權歸原文作者和博客園共有,謝絕任何形式的 轉載!!
作者:mohist
----- 藍 屏 警 告 ---
加載驅動的操作請在虛擬機中完成, 可以有效避免物理機藍屏 或者其他情況出現 帶來的損失。
1、准備
wdk7下載地址: https://www.microsoft.com/en-us/download/details.aspx?id=11800
vmware12: (我選擇vmware12是因為 其對win7的支持,有些版本對操作系統的是有要求的)
win7: https://msdn.itellyou.cn/ 打開后,選擇左側的操作系統,找到合適你的需求版本下載(下載推薦選擇 迅雷,下載鏈接是 edk2 哦)
DriverMonitor: (Google一下,自行下載)。 主要用來加載和卸載驅動。
DebugView: https://docs.microsoft.com/zh-cn/sysinternals/downloads/debugview (查看內核輸出)
64signer: 驅動簽名工具。 Google一下, 自行下載
2、環境搭建
A、安裝 vmware12 , 再 創建 win7 X64的虛擬機。 (不會? 那就 Google一下)
B、安裝win7 操作系統, 並激活。
C、安裝 vmware install tool ( 不會? 那就 Google 一下)
3、安裝 wdk
下載wdk后,使用 band 或者其他的解壓縮工具 解壓, 安裝即可。(傻瓜式安裝 , 下一步,下一步。。。。。)
安裝結束后: 安裝目錄大概是這樣的,
4、編寫一個自己的第一個驅動程序
特別說明, 我使用的是X64 編譯。
我再C盤根目錄創建了一個文件夾,名為demo, 里面准備了下面的3個文件.
A、文件名: helloworld.c , 文件內容如下:
#include <ntddk.h> // unload my driver VOID DriverUnload(PDRIVER_OBJECT pDriverObject) { DbgPrint(" the driver unloaded successfully! \n"); } // the entry of driver NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING reg_path) { DbgPrint("ok, congratulation ,the driver has loaded successfully!\n"); if(NULL != pDriverObject) pDriverObject->DriverUnload = DriverUnload; return STATUS_SUCCESS; }
B、准備文件: makefile . 內容如下:
# 此文件 一般情況下只有一行 並且不需要修改 不能有前導空格 !INCLUDE $(NTMAKEENV)\makefile.def
C、准備文件: SOURCES, 內容如下:
#下邊這行指定生成驅動名字HelloWorld.sys TARGETNAME=HelloWorld #下邊這行指定生成文件的類型DRIVER指驅動 TARGETTYPE=DRIVER #下邊這行指定生成驅動所在的路徑\SYS\HelloWorld.sys TARGETPATH=SYS #下邊這行指定相關頭文件所在目錄路徑 INCLUDES=$(BASEDIR)\inc;\ $(BASEDIR)\inc\wxp;\ ##上邊必空一行H:\WINDDK3790(DDK目錄) 等價$(BASEDIR) #下邊這行指定驅動源代碼*.cpp或者*.c SOURCES=HelloWorld.c\
---- 上面的文件准備完畢后,大概是這樣的--------
5、 編譯
依次 點擊 : 開始 -> 所有程序 -> windows driver kits -> WDK 7600.16385.1 -> Build Environments -> Windows 7 -> x64 Free Build Environment
A、 鍵入命令,使終端來到 上面 4 的所在文件夾: C:\demo
B、執行 構建命令: 鍵入 build , 回車執行構建。
構建結束后,demo目錄下會大概是這樣的:
6、執行文件 簽名。
盡管我開啟了 win7測試模式 (管理員控制台執行命令:bcdedit /set testsigning on, 再重啟 ),沒有簽名的驅動是無法運行的。
A、找到 5 中生成的驅動文件: helloworld.sys。
B、使用 debugview工具查看內核輸出 (請勾選: 菜單-> capture -> capture kernel 選項), 使用 DriverMonitor 加載驅動。
先來一張沒有簽名驅動的截圖,發現驅動無法加載, 內核自然也沒有輸出。
同時查看驅動文件的屬性,也無法找到關於簽名的信息:
C、簽名驅動
使用軟件 64Signer 對驅動文件進行簽名。 簽名后,就會發現 驅動文件的屬性頁中出現了 關於簽名的tab頁。
7、驅動加載與卸載
驅動簽名后,使用 driver monitor 和 debugview工具查看驅動內核輸出。得到如下結果:
---------- 完結---------
附:
注意文件編碼: