NTLDR

NTLDR（NT loader的縮寫）是微軟的Windows NT系列作業系統（直至Windows XP和Windows Server 2003）的引導程序。NTLDR可以從硬碟以及CD-ROM、U盤等移動存儲器運行並引導Windows NT系統的啟動。如果要用NTLDR啟動其他作業系統，則需要將該作業系統所使用的啟動扇區代碼保存為一個文件，NTLDR可以從這個文件加載其它引導程序。

<image>

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。

## 啟動步驟

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

## boot.ini

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

### 示例

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

```ini
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
C:\grldr="Ubuntu"
C:\="Previous Version of Windows"
```

#### 解釋

- 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)\ /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:\：基於非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. /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設置回復為硬碟啟動即可。