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设置回复为硬盘启动即可。