天天看點

Windows 核心(WRK)編譯

引子

WRK 是微軟于 2006 年針對教育和學術界開放的 Windows 核心的部分源碼,

WRK(Windows Research Kernel)也就是 Windows 研究核心,

在 WRK 中不僅僅隻提供了 Windows 核心子產品的部分代碼,其還提供了編譯工具,

也就是通過這個編譯工具,你可以将你的 WRK 編譯成一個 EXE 檔案,

也就是核心可執行子產品,然後你可以利用這個 EXE 檔案來取代作業系統本身的核心,

這樣的話,下次開機的時候作業系統所加載的核心就是您編譯的那個 EXE 了。              

工具軟體

Intel   x86  CPU;

VMware  6.5;

Windows  Server  2003  SP1(用于測試 WRK 編譯結果);

Windows  7(用來編譯 WRK);

WRK  1.2 ;             

概覽 WRK

首先我們來找到目前 Windows 作業系統下的核心子產品檔案,

所謂的核心子產品檔案呢,其實就可以看做是 Windows  的核心,

其由執行體和微核心組成,該檔案名為 ntoskrnl.exe ,即一個二進制子產品,

該檔案位于:C:\Windows\System32 ;

而我們的 WRK 編譯後所得的結果應該也是一個核心子產品檔案,

也就是說我們編譯所得的結果應該就是這個 ntoskrnl.exe ,

當然編譯後的名稱是可以不同的,

預設編譯所得為 wrkx86.exe (這是 x86 環境下的預設編譯結果名稱),

下面來分析 WRK 中目錄結構:

Windows 核心(WRK)編譯

首先來看   WS03SP1HALS  目錄:

WS03SP1HALS 代表的意思即 Windows  Server  2003  SP1  HALS,

也就是在 Windows  Server  2003  SP1  下的  HAL (硬體抽象層)。

在 Windows 作業系統中,HAL 其實是一個獨立的  DLL (在這裡你就可以簡單的将 HAL 看做一個 DLL) ,

通過 HAL 可以實作隔離掉硬體的差異,也就是上層的子產品無需考慮下層真實硬體之間的差異性,

因為上層子產品不能夠直接通路硬體,而是通過 HAL 來通路硬體的,

是以對于硬體的差異性,在 HAL 中即可以解決掉,而不需要上層子產品來解決,

這樣做的好處是很顯然的,那就是我們的上層子產品都是一樣的,也就是當硬體改動時不需要變,

隻要提供針對不同的硬體的 HAL 即可以實作在不同的硬體上運轉我們的上層子產品。

由于我們的 PC 上的硬體不一緻,是以必須有多個 HAL 。

比如我的 PC  的處理器為  Intel 的,而你的 PC 的處理器為 AMD 的,

我的處理器為單核的,而你的處理器為四核的,

那麼這就會造成硬體上的不一緻,為了解決這種不一緻呢,

Windows 在打包的時候會打包多個 HAL 進來,比如一個 HAL 針對單核,一個 HAL 針對多核,

Windows 在安裝的時候就會自動的識别出你的處理器是 AMD 還是 Intel ,是多核還是單核處理器,

然後 Windows 就會自動選擇一個合适的 HAL  給你安裝,同時,将 HAL 名字修改為 HAL.DLL,

而在 WS03SP1HALS 目錄下的也就是這些個 HAL ,

Windows 核心(WRK)編譯

比如我的 PC 的處理器為 Intel  x86 系列的雙核處理器,

自然在安裝 Windows 的時候,就會自動選擇合适的 HAL ,比如 halmps.dll 作為 HAL ,

然後在安裝 Windows 的時候将這個 HAL 複制進我的 C 盤指定目錄下後,

就将這個 halmps.dll 改名為 hal.dll(為了統一是以改名),

這樣就可以得到我們下面看到的在 C:\Windows\System32\hal.dll 了。

Windows 核心(WRK)編譯

再來看   Public   目錄:

Windows 核心(WRK)編譯

在這個目錄下包含的是一些頭檔案,也就是 .h 檔案,而且這些檔案都是被各個元件所共享使用的,也就是公用的,

其中含有 ddk , internal 等等,其中 internal 表示為内部使用的,也就是核心自身需要使用到的頭檔案。

再來看   Tools   目錄:

前面提到,WRK 中不僅僅包含了微軟公開的關于 Windows 核心的部分源代碼,

還包括了用來編譯這部分源代碼的工具,而這些編譯工具自然就在這個 Tools 目錄下了。

在後面我們編譯這個 WRK 源代碼的時候就會用到這個 Tools 目錄下的工具了。

Windows 核心(WRK)編譯

最後看   Base   目錄,其中 Base 目錄下的 ntos 目錄為 Windows 核心子產品的主目錄:

Windows 核心(WRK)編譯

下面就來逐一的介紹這些個目錄中的檔案的含義:

build WRK 隻公開了部分源代碼,那些未公開的則以二進制目标代碼的形式存在于這個目錄下。
cache 緩存管理器的實作的源檔案。
config 系統資料庫的實作的源檔案。
dbgk 調試子系統的核心模式部分的源檔案。
ex 執行體層函數(核心堆 , 同步 , 定時器等)的源檔案。
fsrtl 檔案系統運作庫的源檔案。
fstub 檔案系統引導接口。
io I/O 管理器,不包括即插即用管理器和電源管理器部分。
ke (微)核心,包括線程排程器,CPU 管理以及底層的同步語義
lpc 本地過程調用 (LPC) 機制的實作。
mm 記憶體管理器。
ob 核心對象管理器。
perf 核心的性能日志記錄功能。
ps 程序和線程。
se 安全引用螢幕。
wmi Windows 管理規範。
inc 僅适用于 NTOS 部分的包含檔案。
raw RAW 檔案系統驅動程式的實作的源檔案。
rtl 核心運作時庫支援。
init 核心啟動部分的代碼。
vdm 虛拟 DOS 機。
verifier 驅動程式檢驗器。

編譯 WRK

首先是設定 WRK 根目錄下的 Tools 子目錄中的 x86 子目錄到  Path 環境變量中,

Windows 核心(WRK)編譯

首先在控制台下進入到 WRK 根目錄下的 Base 目錄下的 Ntos 目錄下,

Windows 核心(WRK)編譯

然後輸入指令:nmake  –nologo  x86=  ;

(如果是 AMD 的 CPU 的話指令會有所不同,而且環境變量的設定也不同)

然後就開始編譯整個 WRK 了。

編譯完成:

Windows 核心(WRK)編譯

此時就可以在目錄:WRK-v1.2\base\ntos\build 下面找到編譯好的 EXE 檔案了。

至此編譯完成。

Windows 核心(WRK)編譯

加載 WRK 編譯所得的核心子產品

前面我們已經由 WRK 編譯得到了核心可執行子產品,

下面我們就要讓作業系統啟動的時候加載上編譯所得的這個核心可執行子產品。

我們使用的環境是在 VMware 6.5 中安裝好 Windows  Server  2003  SP1 。

首先,我們将由 WRK 編譯所得的 wrkx86.exe 拷貝到虛拟機中,

并且将這個檔案放置到目錄(也就是 ntoskrnl.exe 所在目錄):

Windows 核心(WRK)編譯

然後再在其系統安裝目錄下(一般為 C: 盤)下面找到  boot.ini  檔案(預設為隐藏)。

Windows 核心(WRK)編譯

首先需要将這個檔案的隻讀屬性去掉,即将該檔案改為可讀寫檔案,

Windows 核心(WRK)編譯

然後用記事本打開這個  boot.ini  檔案

修改前的 boot.ini 檔案:

Windows 核心(WRK)編譯

再在 boot.ini 中添加如下行:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, WRK" /kernel=wrkx86.exe /hal=hal.dll

修改後的 boot.ini 檔案:

Windows 核心(WRK)編譯

将上面的都設定好以後就重新啟動 Windows  Server  2003  SP1 。

然後在啟動畫面中即可以看到如下畫面:

Windows 核心(WRK)編譯

我們選擇 Windows  Server  2003 , WRK  啟動 Windows  作業系統,

這樣加載核心可執行子產品的就是我們由 WRK 編譯所得的那個 wrkx86.exe 了。