Purpose of the BOOT.INI File

by Wayne Maples [Published on 20 April 2004 / Last Updated on 20 April 2004]

BOOT.INI and ARC Path Naming Conventions and Usage : Q99743

Some people get an error message in the Event log from source Serial stating Not enough resources for the driver. NT is probing the serial ports for a serial mouse, and finding that there is no resource usable for this purpose. You can ignore the message, its informational, or to eliminate it (assumes you DO have a ps/2 mouse), use the /NoSerialMice parameter, which suppressed this test at boot.

sample boot.ini

[boot loader]
timeout=10
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00" /NoSerialMice
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00 [VGA mode]" /basevideo /sos /NoSerialMice

[any text]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00" /NoSerialMice
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00 [VGA mode]" /basevideo /sos /NoSerialMice
C:\="MS-DOS"

The above example, the [any text] section hides the bottom 3 selections. You can use the [any text] header to keep boot options but make them unavailable at boot.

The pathing portion which defines where NT is to boot from, uses the ARC convention:

default=scsi(0)disk(0)rdisk(0)partition(1)\winnt

where the above is a standard example. Your paths will have either scsi or multi.

multi() is used for IDE and also for SCSI drives when int13 is used to find and load the NT kernel file, ntoskrnl.exe. multi(), when used, is normally set to 0 because BIOS can only indentify a single INT 13 controller at a time.

multi() and disk() are not applicable to IDE and are always 0.

If the controller is SCSI and int13 is not enabled, then scsi and drive tell NT which SCSI controller (0=first controller, 1=second) and drive has the active partition. The partition portion specifies which partition is active (1=first partition, 2=second partition).

disk() is set to 0 when using multi() because the disk info is provided through INT 13 and doesn't need to be enumerated.

rdisk() is the ordinal number of the disk on the adapter. With EIDE controllers, this varies from 0 to 3 with the primary boot drive being 0.

Partition() is the partition number which follows the same numbering convention as multi()'s partition numbering.

In both multi() and scsi() the final parm is the pathname to the system files, normally, winnt.

Study Q102873, which has the definitive discussion of the ARC convention and how to interpret it. For more information on int13 and its limitations, see Int 13 x86 boot limitation and C partition

If your need to set the default operating system to boot, the easiest and safest approach is to click

Start : Control Panel : System icon : Startup/Shutdown dropdown : Select default

There is a minor gotcha! if partitions have changed or you edited the boot.ini and the line defining the default is invalid, you will get the existings options and an option labelled default. Fix the defective "default" line and the extra "bad" option will disappear. It something you can't ignore because NT will boot using the info in the defective "default" line until the error is corrected.

Don't mistake the complexity of boot.ini. Microsoft's multi-boot support is very elementary. It can not handle more than one non-NT/W2K operating system, potentially a severe defect, and it is limited to 10 entries in the menu, not a biggie. Want to test the 10 entries limitation. Copy one of the entries and change the label. You will only see the 1st 10 entries displayed.:

multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #2" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #3" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #4" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #5" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #6" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #7" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #8" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #9" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #10" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #11" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="W2K #12" /fastdetect
Reboot and you should only see the 1st 10 entries displayed. Any entry beyond 10 will not display.

Mark Russinovich has a good writeup covering all the switches in boot.ini at www.sysinternals.com/bootini.htm. They include :
/NOSERIALMICE ( NOSERIALMICE : disables serial mouse detection),
/PCILOCK ( PCILOCK : lets BIOS configure PCI devices),
/WIN95DOS ( WIN95DOS : directs NTLDR to boot the DOS boot sector stored in BOOTSECT.DOS),
/WIN95 ( WIN95 : directs NTLDR to boot the Win9x boot sector stored in BOOTSECT.W40),
/3GB ( 3G : give applications more memory),
/KERNEL and/or /HAL= (specify kernel and/or hal image file),
/BREAK ( BREAK : stop at breakpoint in HAL),
/BAUDRATE= and /DEBUGPORT= (used in remote kernel debugger),
/CRASHDEBUG ( CRASHDEBUG: kernel debugger is loaded),
/NODEBUG ( NODEBUG overrides /baudrate and /debugport),
/BASEVIDEO ( BASEVIDEO : use standard vga),
/SOS ( SOS : show drivers being loaded),
/NUMPROC= (NUMPROC : only use set number of processors),
/ONECPU ( ONECPU : only use 1 processor),
/BURNMEMORY (don't use x amount of memory - BURNMEMORY),
/MAXMEM= (use as maxmem),
/USE8254 ( use8254 timer chip as its base timer),
/CLKLVL ( CLKLVL : use level-sensitive system clock),
/YEAR= (use year specified as system year),
/TIMERES= (TIMERES : sets the resolution of the system timer),
/MAXPROCSPERCLUSTER= ( MAXPROCSPERCLUSTER : max cpus to use in cluster),
/INTAFFINITY ( INTAFFINITY : sets interrupt affinity),
/BOOTLOG ( BOOTLOG : writes boot log to %SystemRoot%\NTBTLOG.TXT),
/FASTDETECT ( FASTDETECT : causes NTDETECT to skip parallel and serial device enumeration)

See Also

Featured Links