官术网_书友最值得收藏!

1.1 下載和使用WDK

1.1.1 下載安裝WDK

就像應用程序使用開發包SDK一樣,內核編程使用“Windows Driver Kit”,簡稱WDK。WDK已經自帶所有需要的頭文件、庫、C/C++語言及匯編語言的編譯器與連接器,所以完全可以在不安裝Visual Studio的情況下進行編程。只是工程管理會不太方便,讀者可以使用記事本或者自己喜歡的其他文本編輯器進行編程。習慣使用Visual Studio的讀者會感覺這很酷,因為只有傳說中的骨灰級程序員才使用記事本編程。

建議讀者下載一個能顯示行號的文本編輯器。以便出現編譯錯誤時能迅速找到錯誤。Linux愛好者當然可以直接用vim。

有些讀者可能聽說過DDK或者IFSDDK,但是那已經是歷史了,請遺忘它。同時下面的描述也可能成為歷史,所以請讀者進入主頁后應該隨機應變。

首先請打開網頁:

https://connect.microsoft.com/default.aspx

這個網頁必須先登錄。登錄攔住了不少訪客,有些訪問者會以為是收費注冊的,其實使用Windows Live賬號就可以登錄(即用MSN賬號登錄)。如果沒有MSN賬號,可以去免費注冊一個。

有了Live賬號之后,還必須用這個賬號向Connect注冊,才能下載WDK。用Live賬號登錄之后,下面出現“立即注冊Connect!”鏈接。

注冊很簡單,只要填寫名字、地區和郵箱就可以了。雖然要填寫郵箱,但是筆者并沒有去打開發送到郵箱中的文件,這個ID就直接可以下載了。筆者不確定是否真的如此,請讀者自己嘗試一下。

登錄之后出現一個“配置控制面板”頁面,但是筆者沒有使用它,單擊上面的“主頁”鏈接,回到主頁,能看見顯示自己已經登錄了。大致畫面如圖1-1所示。

圖1-1 connect.microsoft.com的主頁頁面

請單擊圖中用圈圈住的“查看所有站點”。

下面就比較簡單了,右邊會顯示類別,在類別中請選擇“開發人員工具”。選擇之后左邊就有“Windows Driver Kit”可以下載,請按網頁的提示逐步下載即可。這個開發包非常大,下載之后有幾GB的內容。(注:最新版本的WDK已經縮減,只有幾百兆了。)下載WDK之前請先根據此時頁面的提示下載并安裝FTM(File Transfer Manager),可以大大加快下載速度。

安裝過程沒有需要特別注意的地方,只有兩點:

(1)安裝到一個簡單一點的路徑,避免在特殊情況下需要配置路徑時麻煩,比如C:\WinDDK。尤其要避免在路徑上有空格,否則可能出現編譯問題。

(2)一定要選擇“完全安裝”,否則可能錯過一些代碼例子。

1.1.2 編寫第一個C文件

現在請打開記事本(或者讀者喜歡的任何工具)來創建一個文件,我們把這個文件命名為first.c,以表示這是我們編寫的第一個內核編程文件。在進行內核編程時,讀者必須打開WDK的幫助。在WDK安裝之后,單擊“開始”菜單→“所有程序”,會發現增加了“Windows Driver Kits”和“Windows Driver Kits Documentation”兩個子菜單。(注:最新版本這兩個菜單已經合并為一個。)

選擇“Windows Driver Kits Documentation”下面的子菜單來打開幫助。在使用任何一個函數之前,請在幫助里查詢這個函數是否存在、使用的環境要求及輸入/輸出。

因為這不是應用程序編程,所以所有的Win32 API函數都不能使用;部分C Runtime函數也不能使用,但是文檔中說明的函數則都可以使用。本書將在文檔中有說明的且在內核下調用的System Routine稱為內核API函數,以便和Win32 API函數區分。

我們編寫first.c內容如下:

      ///
      /// @file first.c
      /// @author crazy_chu
      /// @date2008-11-1
      ///
      #include <ntddk.h>
      // 提供一個Unload函數只是為了讓這個程序能動態卸載,方便調試
      VOID DriverUnload(PDRIVER_OBJECT driver)
      {
          // 但是實際上我們什么都不做,只打印一句話
          DbgPrint("first: Our driver is unloading…\r\n");
      }
      // DriverEntry,入口函數。相當于main。
      NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
      {
          // 這是內核模塊的入口,可以在這里寫入我們想寫的東西
          // 筆者在這里打印一句話。因為“Hello,world”常常被高手恥笑,所以
          // 打印一點別的
          DbgPrint("first: Hello, my salary!");
          // 設置一個卸載函數,便于這個函數退出
          driver->DriverUnload = DriverUnload;
          return STATUS_SUCCESS;
      }

上面的DriverEntry是每個內核模塊的入口,在加載這個模塊時被系統進程System調用一次。在其中我們設置了DriverUnload的函數指針,這樣這個模塊可以被動態地卸載(這將方便我們調試程序);如果沒有設置DriverUnload函數指針,則一個內核模塊一旦被加載就不能卸載了。

現在請先建立新目錄first,然后把first.c文件保存在此目錄下,下面我們就介紹編譯的方法。

1.1.3 編譯一個工程

前面已經建立了工程first,雖然這個工程只有一個first.c文件作為代碼文件。現在必須在這個目錄下增加兩個文件,以便WDK的build工具可以build它。其中一個文件的名字必須為makefile,這個文件的內容很無聊,永遠也不需要改動,內容如下:

      !IF 0
      Copyright (C) Microsoft Corporation, 1999-2002
      Module Name:
          makefile.
      Notes:
          DO NOT EDIT THIS FILE!!!  Edit.\sources.if you want to add a new source
          file to this component.  This file merely indirects to the real make
          file that is shared by all the components of Windows NT (DDK)
      !ENDIF
      !INCLUDE $(NTMAKEENV)\makefile.def

如果讀者不想自己寫這個文件,那么請到WDK的src目錄下隨便尋找一個例子,然后拷貝一個出來。大部分例子的makefile都和這個一樣。

另外,還需要一個名字為SOURCES的文件,這個文件的內容關系到這個模塊要編譯哪些文件,以及編譯出來的.sys文件的名字。舉例內容如下:

    TARGETNAME=first
    TARGETTYPE=DRIVER
    TARGETPATH=obj
    SOURCES=first.c

其中TARGETNAME表示名字,編譯出來之后,模塊的名字為first.sys;SOURCES表示要編譯的.c文件(對于初學者,必須提醒一點,不要加入.h文件,因為.h是被包含在.c文件中編譯的),如果.c文件有多個,請用空格分隔。

下面請從“開始”菜單中打開WDK的build環境配置,如圖1-2所示。

圖1-2 從開始菜單中打開WDK的build環境配置

從“開始”菜單中選擇“所有程序”,然后選擇“Windows Driver Kits”→WDK的版本(這里“WDK 600118001”)→“Build Enviroments”→“Windows XP”→“Launch Windows XP x86 Checked Build Enviroment”。

出現一個控制臺,這個控制臺已經配置好編譯環境。現在輸入cd命令,進入我們先前建立的first目錄;進入之后,輸入build命令。筆者這里編譯的結果如圖1-3所示。

圖1-3 first編譯的結果

現在編譯結束,first.sys出現在\first\objchk_wxp_x86\i386下。這個文件并不像普通exe文件一樣可以直接雙擊執行,它需要一個安裝工具進行安裝。下面講解如何安裝并運行它。

主站蜘蛛池模板: 巍山| 沽源县| 蒙自县| 彭山县| 红原县| 开平市| 贺州市| 宜兴市| 缙云县| 满洲里市| 新宁县| 古浪县| 磐石市| 眉山市| 杭锦后旗| 岐山县| 内黄县| 汤原县| 科技| 绥芬河市| 金门县| 黄石市| 宜兰县| 彰化县| 巴东县| 天柱县| 错那县| 沾益县| 锡林郭勒盟| 安阳县| 芷江| 迭部县| 织金县| 安宁市| 琼结县| 平潭县| 襄垣县| 仁布县| 贺州市| 吴堡县| 三门县|