Edit Boot Options in Windows Vista

A machine on which Windows Vista is installed may present a Windows Boot Manager menu in text mode at start up to offer a choice of operating systems or of configurations in which to start an operating system. When the current selection in this menu corresponds to an installation of Windows Vista, the menu advises that the F8 key may be pressed to “specify an advanced option for this choice”. Doing so calls up an Advanced Boot Options menu. There is also an Edit Boot Options menu, reachable by pressing F10, but Microsoft scarcely documents it.

The Edit Boot Options menu can also be made to persist for an operating system. Set the BCD element optionsedit to true in the corresponding osloader application object. Once done, whenever this object is selected from the Windows Boot Manager menu, the WINLOAD.EXE that runs for the selected operating system starts by presenting the Edit Boot Options menu.

It seems safe to say that Microsoft offers no formal documentation of the Edit Boot Options menu. For instance, a search of microsoft.com for pages containing both “edit boot options” and “F10” produces no matches (today, 25th May 2007). But neither is this new feature buried in the binary code: its existence is shown in more or less plain text, in the HTML resources embedded in the BOOTMGR and WINLOAD.EXE files.

Though users ordinarily interact with boot options as Boot Configuration Data (BCD) to be manipulated with the new BCDEDIT.EXE tool, the Edit Boot Options menu works with boot options in the style of the old BOOT.INI switches, albeit with additions for Windows Vista.

Reported Options

The menu first shows which boot options are currently active. In many cases, one BCD element with one value translates to one simulated BOOT.INI switch. In some cases, translation of a BCD element depends on its combination with other BCD elements.

BCD Element Value Additional Conditions Representation in Edit Boot Options Menu
baudrate num debug is true and debugtype is Serial (0) /BAUDRATE=num
bootdebug true   /BOOTDEBUG
bootlog true   /BOOTLOG
channel num debug is true and debugtype is 1394 (1) /CHANNEL=num
clustermodeaddressing num   /MAXPROCSPERCLUSTER=num
configaccesspolicy DisallowMmConfig (1)   /CONFIGACCESSPOLICY=DISALLOWMMCONFIG
    /CONFIGACCESSPOLICY=DEFAULT
configflags num   /CONFIGFLAG=num
debug false   /NODEBUG
true debugstart is AutoEnable (1) and noumex is true /DEBUG=AUTOENABLE,NOUMEX
debugstart is AutoEnable (1) /DEBUG=AUTOENABLE
debugstart is Disable (2) and noumex is true /DEBUG=DISABLE,NOUMEX
debugstart is Disable (2) /DEBUG=DISABLE
noumex is true /DEBUG=NOUMEX
  /DEBUG
debugport num debug is true and debugtype is Serial (0) /DEBUGPORT=COMnum
debugtype 1394 (1) debug is true /DEBUGPORT=1394
USB (2) debug is true /DEBUGPORT=USB
detecthal true   /DETECTHAL
ems true   /REDIRECT
exportascd true   /RDEXPORTASCD
firstmegabytepolicy UseAll (1)   /FIRSTMEGABYTEPOLICY=USEALL
UsePrivate (2)   /FIRSTMEGABYTEPOLICY=USEPRIVATE
    /FIRSTMEGABYTEPOLICY=USENONE
hal str   /HAL=str
halbreakpoint true   /BREAK
increaseuserva num   /USERVA=num
kernel str   /KERNEL=str
keyringaddress num   /FVEBOOT=num
loadoptions options   options
maxproc true   /MAXPROC
msi ForceDisable (1)   /MSIPOLICY=FORCEDISABLE
    /MSIPOLICY=DEFAULT
nointegritychecks true   /DISABLE_INTEGRITY_CHECKS 
nolowmem true   /NOLOWMEM
novesa true   /NOVESA
numproc num   /NUMPROC=num
nx OptIn (0)   /NOEXECUTE=OPTIN
OptOut (1)   /NOEXECUTE=OPTOUT
AlwaysOff (2)   /EXECUTE /NOEXECUTE=ALWAYSOFF
AlwaysOn (3)   /NOEXECUTE=ALWAYSON
onecpu true   /ONECPU
oslnointegritychecks true   /DISABLE_INTEGRITY_CHECKS 
osltestsigning true   /TESTSIGNING
pae ForceEnable (1)   /PAE
ForceDisable (2)   /NOPAE
pciexpress ForceDisable (1)   /PCIEXPRESSPOLICY=FORCEDISABLE
    /PCIEXPRESSPOLICY=DEFAULT
perfmem num   /PERFMEM=num
quietboot true   /NOGUIBOOT /BOOTLOGO
removememory num   /BURNMEMORY=num
restrictapiccluster num   /MAXAPICCLUSTER=num
safeboot Minimal (0) safebootalternateshell is true /SAFEBOOT:MINIMAL(ALTERNATESHELL)
  /SAFEBOOT:MINIMAL
Network (1)   /SAFEBOOT:NETWORK
DsRepair (2)   /SAFEBOOT:DSREPAIR
sos true   /SOS
targetname str debug is true and debugtype is USB (2) /TARGETNAME=str
testsigning true   /TESTSIGNING
truncatememory  num   /MAXMEM=num
usefirmwarepcisettings true   /PCILOCK
usephysicaldestination true   /USEPHYSICALAPIC
vga true   /BASEVIDEO
winpe true   /MININT

For all types that hold a boolean value, any non-zero value is interpreted as true. The integer value for firstmegabytepolicy, debugtype, configaccesspolicy and safeboot is interpreted modulo 32 bits. For debugtype, any value other than 0, 1 or 2 is an error.

Some “RAM disk” options are reportable, but the correspondence between BCD elements and simulated BOOT.INI switches is not so easily described and is presently beyond the scope of this article.

Although WINLOAD will translate nointegritychecks and oslnointegritychecks as shown above, these options are discarded early during WINLOAD’s initialisation and can never be seen as input for translation. This is surely for the protection of users, who might otherwise get integrity checks disabled for session after session without ever realising. The thoroughness of this defence extends even to removing these options if given within the loadoptions string. Note that users remain able to disable integrity checks per session, either through the Advanced Boot Options menu or by editing nointegritychecks back into the active BCD options, as shown below.

Editable Options

The active options, presented as simulated BOOT.INI switches, may be removed or added to. Note however that some options may have been acted on already, so that an option added or removed through the Edit Boot Options menu does not necessarily work exactly as if it had been read from the BCD store. Options can be added that are not translated explicitly but nonetheless affect the kernel through inclusion in the loadoptions string. Some, perhaps even many, details remain to be worked out.

Edited Option BCD Elements Value
3GB increaseuserva num from USERVA=num; else 3072
BAUDRATE=num baudrate num
BOOTDEBUG bootdebug true
CHANNEL=num channel num
CMDCONS bpbstring cmdcons
CONFIGACCESSPOLICY=DEFAULT configaccesspolicy 0
CONFIGACCESSPOLICY=DISALLOWMMCONFIG configaccesspolicy 1
DEBUG debug true
DEBUGPORT=COMn debugtype 0
debugport n
DEBUGPORT=1394 debugtype 1
DEBUGPORT=USB debugtype 2
DETECTHAL detecthal true
DISABLE_INTEGRITY_CHECKS nointegritychecks true
EXECUTE nx 2
HAL=str hal str
KERNEL=str kernel str
MAXMEM=num truncatememory num
MSIPOLICY=DEFAULT msi 0
MSIPOLICY=FORCEDISABLE msi 1
NODEBUG debug false
NOEXECUTE=ALWAYSOFF nx 2
NOEXECUTE=ALWAYSON nx 3
NOEXECUTE=OPTIN nx 0
NOEXECUTE=OPTOUT nx 1
NOEXECUTE nx 0
NOPAE pae 2
PAE pae 1
PCIEXPRESSPOLICY=DEFAULT pciexpress 0
PCIEXPRESSPOLICY=FORCEDISABLE pciexpress 1
REDIRECT=COMn emsport n
bootems true
ems true
REDIRECTBAUDRATE=num emsbaudrate num
ROLLBACK bpbstring undo
TARGETNAME=str targetname str
TESTSIGNING testsigning true
TIMEOUT=num timeout num

Text is case-insensitive. An option is considered present at its first occurrence: note in particular that it need not be preceded by a forward slash or even by white space.

In each of the following sets, only the first occurrence of any member is accepted:

In the following set, the members have increasing precedence:

The n placeholder stands specifically for 1, 2, 3 or 4. The num placeholder stands for an uninterrupted sequence of decimal digits. An empty num is permitted, and evaluates as zero. The str placeholder stands for any number of characters up to but not including the first space.

The num placeholder in the MAXMEM option is intended to count megabytes. The option is rejected if conversion of num to bytes would overflow 64 bits.

Where an equals sign is shown for the BAUDRATE option, any single character is in fact acceptable. Behaviour is undefined if BAUDRATE ends the input.

Where an equals sign is shown for the DEBUGPORT options, any one or more characters are in fact acceptable. Behaviour is undefined if DEBUGPORT ends the input.

The equals sign is required for the REDIRECT option, but it may be followed by any number, including zero, of characters before the first occurrence of COMn. If there is no such occurrence, the bootems and ems elements are added anyway.