NTLDR

**NTLDR**（_NT loader_ 的縮寫）是微軟的 Windows NT 系列作業系統（直至 Windows XP 和 Windows Server 2003）的引導程式。NTLDR 可以從硬碟以及 CD-ROM、USB 隨身碟等移動記憶體執行並引導 Windows NT 系統的啟動。如果要用 NTLDR 啟動其他作業系統，則需要將該作業系統所使用的啟動磁區代碼儲存為一個檔案，NTLDR 可以從這個檔案載入其它引導程式。

NTLDR 主要由兩個檔案組成，這兩個檔案必須放在系統分割區（根據微軟的定義，為在 MBR 中標識為活動分割區的分割區，一般為第一個分割區 / C 分割區）：

* NTLDR，這是引導程式本身
* NTDETECT.COM，用於檢測基礎硬體資訊，以便系統正常啟動。

boot.ini 也是比較重要的檔案。它是引導程式的組態檔。當 boot.ini 遺失時，NTLDR 會啟動第一塊硬碟第一個分割區上的 \Windows 目錄中的系統。

在安裝、維護 Windows NT 系統時，可以使用 fixmbr 命令在硬碟中寫入啟動 NTLDR 引導程式的代碼。

Windows Vista、Windows Server 2008 及以後版本的作業系統中，NTLDR 被 BOOTMGR 替代。

## 結構

NTLDR 由兩個可執行檔構成：

* 第一部分是一個標準二進位檔案，用於切換系統至保護模式，使得系統能辨識並執行可移植可執行（PE）檔案，並執行第二部分。一般被稱為 STPBOOT.BIN
* 第二部分是一個可移植可執行檔，被稱為 OSLOADER.EXE

使用 WinHex 或者類似的二進位處理軟體，在 NTLDR 中搜尋「MZ」，並將其前的部分截去，即可以獲得 OSLOADER.EXE。在 Windows 安裝檔案中也可以找到壓縮後的 OSLOADER.EX\_檔案。

Windows NT 最初是為 ARC（一類 RISC 系統架構）設計的，因此只有 OSLOADER.EXE，即系統載入器，通過接受指定的系統檔案路徑和其他啟動參數引導對應目錄下的 Windows NT 系統，而指定這些參數的工作交給 ARC 內建的啟動管理器進行。x86 架構缺乏啟動管理器：BIOS 只會呼叫第一啟動裝置的 MBR 中列明的活動分割區的卷引導記錄。因此啟動管理器的功能被包括在 OSLOADER 部分中，直至微軟在 2003 年引入了自己的啟動管理器。ARC 的啟動管理器的保護模式切換和 PE 檔案辨識執行功能則交給 STPBOOT 完成。boot.ini 中的列表項也被設計為類似於 ARC 的格式，以便直接傳給 OSLOADER.EXE。

## 啟動步驟

1. 與一般的系統啟動行程一致，BIOS 呼叫 MBR，然後呼叫活動分割區的卷引導記錄，該卷引導記錄被設計為搜尋 NTLDR，並執行之。
2. NTLDR 的第一部分被呼叫。此時系統進入保護模式，並可以辨識並執行 PE 格式的可執行檔。
3. NTLDR 的第二部分，OSLOADER.EXE 被呼叫。OSLOADER.EXE 中內嵌有 FAT、NTFS 和 ISO 9660 三種檔案系統的驅動，啟動管理器，以及 INI 檔案讀取器的 CAB 檔案解壓縮器。OSLOADER 中附帶的檔案系統驅動通過 BIOS 中斷直接存取磁碟，因為核心和 HAL 此時都沒有被載入。此時系統可以存取磁碟內的檔案。
4. 如果 Windows 被置於休眠模式，讀取 hiberfil.sys 中的內容並將其寫入記憶體，然後恢復系統的執行。
5. OSLOADER 使用內建的 INI 檔案讀取器，試圖讀取 boot.ini 檔案的內容，並組態啟動選單。如果 boot.ini 不存在，OSLOADER 將視為 boot.ini 中有且僅有一個指向 multi (0) disk (0) rdisk (0) partition (1)\WINDOWS 且沒有參數的啟動專案。如果 boot.ini 中只存在一個啟動專案，則忽略 timeout 的時間設定（視為 0）。
6. 向使用者顯示啟動選單，並按照 timeout 的時間設定倒計時。如果使用者按下按鍵，則停止倒計時。（這樣即使只有一個啟動專案，當使用者在自檢結束後狂按 F8 鍵，也可以進入進階啟動選單）
7. 如果一個非 NT 的系統被選擇，OSLOADER 載入列表項中指定的啟動磁區代碼檔案，並移交控制權。此時系統回到真實模式。如果沒有指定檔案（常見於 Windows 9x 和 Windows NT 共存），則載入 bootsect.dos，然後移交控制權，由其搜尋並載入 IO.SYS。
8. 如果一個 NT 系統被選擇，OSLOADER 呼叫 NTDETECT.COM。NTDETECT 將檢測系統硬體相關的資訊，決定系統將使用的硬體設定檔，並將以上資訊交給 OSLOADER。
9. OSLOADER 根據 NTDETECT 返回的系統硬體相關資訊，載入列表項中指定的資料夾中的 Windows NT 核心態管理程式（Windows Executive），包括 NTOSKRNL.EXE 及 HAL.DLL。此外尚有 KDCOM.DLL 及 BOOTVID.DLL 也在這個階段載入。
10. OSLOADER 載入登錄檔的 SYSTEM 組態單元，其中包含數個系統組態集，每個組態集都包括應當載入的驅動程式和服務等；以及一系列指示標誌，指向預設組態集、上次啟動失敗的組態集及「最後一次正確的組態」對應的組態集。OSLOADER 根據使用者選擇及上次啟動情況選擇組態集，讀取對應的應當載入的驅動程式列表。
11. OSLOADER 將 NTDETECT 檢測到的硬體資訊及驅動程式列表交給 Windows NT 核心態管理程式，並移交控制權。

## boot.ini

在確認系統為冷啟動，即非休眠模式後，NTLDR 所做的第一件事為讀取 boot.ini。

### 範例

以下是 boot.ini 的一個範例：

#### 解釋

* [boot loader] 節：組態啟動選單的細節。
* timeout=30：timeout 選項控制啟動選單顯示的時間長度，單位為秒，最短為 0，此時啟動選單不顯示。
* default=multi (0) disk (0) rdisk (0) partition (1)\WINDOWS：default 選項控制啟動選單的預設選項。
* [operating systems] 節：列舉啟動專案。
* multi (0) disk (0) rdisk (0) partition (1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect：基於 Windows NT 的系統的啟動專案。
  * multi (0) disk (0) rdisk (0) partition (1)\WINDOWS：對於基於 Windows NT 的系統，系統檔案路徑由 ARC 路徑給出。
  * "Microsoft Windows XP Professional"：啟動專案的友好名稱，即顯示在啟動選單中的名稱。
  * /fastdetect：指定預設的引導參數。使用進階引導選單啟動系統會覆蓋引導參數的設定。
    * /fastdetect：不檢測串行介面的滑鼠。
    * /noexecute=optin：在 Windows XP SP2 後預設安裝的系統會有該引導參數，意為為基本 Windows 程式和服務啟用系統記憶體保護（DEP）。
* C:\grldr="Ubuntu"：基於非 Windows NT 的系統的啟動專案。
  * C:\grldr：對於基於非 Windows NT 的系統，引導磁區檔案路徑由 DOS 路徑給出。
  * 「grldr」是 GRUB4DOS 的預設引導磁區檔名。Ubuntu 曾使用 Wubi 提供在 Windows 下安裝 Ubuntu 的解決方案。
* C:\="Previous Version of Windows"
  * C:\：對於基於 MS-DOS 的系統，在非三方啟動（DOS、Windows 9x、Windows NT 共存）、非啟動到恢復控制台的情況下，引導磁區檔案名稱可以省略，此時視為「C:\bootsect.dos」。
  * 在三方啟動情況下，需要進行一些特殊操作，比如「/WIN95」和「/WIN95DOS」參數用來類比單系統狀況，且引導磁區檔案名稱不可省略。
  * 恢復控制台對應的啟動專案一般為：C:\CMDCONS\BOOTSECT.DAT="Microsoft Windows Recovery Console" /cmdcons

## 多語言支援

NTLDR 不支援多語言，如果中日韓版本的 Windows NT 5.x NTLDR 找不到 BOOTFONT.BIN 字型檔案，會自動顯示英語代替。Windows Boot Manager 支援多語言。

## 常見問題

NTLDR 的問題常見於使用者不慎將該檔案刪除，這樣會導致 Windows NT 系列系統無法啟動，開機時將以黑畫面白字顯示錯誤資訊："NTLDR is missing, Press CTRL+ALT+DEL to restart." 當使用者重新啟動後又將出現上述資訊，這樣就無法進入系統。

解決該問題需要向光碟機內放入一張相應的 Windows 安裝光碟，開機時先將 BIOS 設定為從光碟啟動，進入系統安裝選單後再選擇進入故障恢復台，按螢幕相關說明進入命令列模式，然後將光碟根目錄下 i386 資料夾內的「ntldr」檔案和「ntdetect.com」拷貝至系統分割區根目錄下，重新啟動後將 BIOS 設定回覆為硬碟啟動即可。

## 參考來源