<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nsis.sourceforge.io/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Boot_Into</id>
	<title>Boot Into - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://nsis.sourceforge.io/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Boot_Into"/>
	<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Boot_Into&amp;action=history"/>
	<updated>2026-06-05T12:14:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Boot_Into&amp;diff=24845&amp;oldid=prev</id>
		<title>F0rt: Boot Into</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Boot_Into&amp;diff=24845&amp;oldid=prev"/>
		<updated>2016-10-22T23:58:21Z</updated>

		<summary type="html">&lt;p&gt;Boot Into&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Description =&lt;br /&gt;
The script displays the boot entries in a list view and boots into the selected boot entry in case the Boot button is going to be clicked. &lt;br /&gt;
&lt;br /&gt;
= Script =&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Licensed under the zlib/libpng license (same as NSIS)&lt;br /&gt;
;&lt;br /&gt;
; Unicode builds:&lt;br /&gt;
; x86 unicode&lt;br /&gt;
; makensis &amp;quot;-XTarget x86-unicode&amp;quot; script.nsi&lt;br /&gt;
; amd64 unicode&lt;br /&gt;
; makensis &amp;quot;-XTarget amd64-unicode&amp;quot; script.nsi&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;Boot Into&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!include MUI2.nsh&lt;br /&gt;
!include bootcfg.nsh&lt;br /&gt;
&lt;br /&gt;
; Include required functions&lt;br /&gt;
${BOOTCFG_ConnectWMI}&lt;br /&gt;
${BOOTCFG_GetObject}&lt;br /&gt;
${BOOTCFG_OpenDefaultBcdStore}&lt;br /&gt;
${BOOTCFG_GetBcdObject}&lt;br /&gt;
${BOOTCFG_GetBcdElement}&lt;br /&gt;
${BOOTCFG_GetObjectPropertyValue}&lt;br /&gt;
${BOOTCFG_GetElementFromBcd}&lt;br /&gt;
!define BOOTCFG_ENUMERATION_CALLBACK AddBootEntry&lt;br /&gt;
${BOOTCFG_EnumerateBcdObjectList}&lt;br /&gt;
${BOOTCFG_SetActiveBootEntry}&lt;br /&gt;
&lt;br /&gt;
!ifndef LVM_GETITEMTEXT&lt;br /&gt;
!define /math LVM_GETITEMTEXTA ${LVM_FIRST} + 45&lt;br /&gt;
!define /math LVM_GETITEMTEXTW ${LVM_FIRST} + 115&lt;br /&gt;
${_NSIS_DEFAW} LVM_GETITEMTEXT&lt;br /&gt;
!endif&lt;br /&gt;
&lt;br /&gt;
!ifndef LVIS_FOCUSED&lt;br /&gt;
!define LVIS_FOCUSED   0x1&lt;br /&gt;
!endif&lt;br /&gt;
!ifndef LVIS_SELECTED&lt;br /&gt;
!define LVIS_SELECTED  0x2&lt;br /&gt;
!endif&lt;br /&gt;
&lt;br /&gt;
!define NSD_CreateListView &amp;quot;nsDialogs::CreateControl SysListView32 \&lt;br /&gt;
  ${DEFAULT_STYLES}|${LVS_REPORT}|${LVS_SHOWSELALWAYS}|${LVS_SINGLESEL} \&lt;br /&gt;
  ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!define NSD_LV_InsertColumn `!insertmacro __NSD_LV_InsertColumn`&lt;br /&gt;
!macro __NSD_LV_InsertColumn CONTROL COLUMN WIDTH STRING&lt;br /&gt;
  ; Fill LVCOLUMN structure&lt;br /&gt;
  System::Call &amp;quot;*(i${LVCF_WIDTH}|${LVCF_TEXT},i,i${WIDTH}, \&lt;br /&gt;
    t&amp;#039;${STRING}&amp;#039;,i${NSIS_MAX_STRLEN},i,i,i,i,i,i) p.s&amp;quot;&lt;br /&gt;
  Exch $0&lt;br /&gt;
  SendMessage ${CONTROL} ${LVM_INSERTCOLUMN} ${COLUMN} $0&lt;br /&gt;
  System::Free $0&lt;br /&gt;
  Pop $0&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define NSD_LV_InsertItem `!insertmacro __NSD_LV_InsertItem`&lt;br /&gt;
!macro __NSD_LV_InsertItem CONTROL INDEX STRING&lt;br /&gt;
  System::Call &amp;quot;*(i${LVIF_TEXT},i${INDEX},i,i,&amp;amp;i${NSIS_PTR_SIZE},\&lt;br /&gt;
    t&amp;#039;${STRING}&amp;#039;,i${NSIS_MAX_STRLEN},i,p,i,i,i,i,i,i) p.s&amp;quot;&lt;br /&gt;
  Exch $0&lt;br /&gt;
  SendMessage ${CONTROL} ${LVM_INSERTITEM} 0 $0&lt;br /&gt;
  System::Free $0&lt;br /&gt;
  Pop $0&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define NSD_LV_SetItemState `!insertmacro __NSD_LV_SetItemState`&lt;br /&gt;
!macro __NSD_LV_SetItemState CONTROL INDEX STATE&lt;br /&gt;
  System::Call &amp;quot;*(i${LVIF_STATE},i${INDEX},i,\&lt;br /&gt;
    i${STATE},&amp;amp;i${NSIS_PTR_SIZE} ${STATE},\&lt;br /&gt;
    t,i,i,p,i,i,i,i,i,i) p.s&amp;quot;&lt;br /&gt;
  Exch $0&lt;br /&gt;
  SendMessage ${CONTROL} ${LVM_SETITEMSTATE} ${INDEX} $0&lt;br /&gt;
  System::Free $0&lt;br /&gt;
  Pop $0&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define NSD_LV_SetItemText `!insertmacro __NSD_LV_SetItemText`&lt;br /&gt;
!macro __NSD_LV_SetItemText CONTROL INDEX SUBINDEX STRING&lt;br /&gt;
  System::Call &amp;quot;*(i${LVIF_TEXT},i${INDEX},i${SUBINDEX},i,\&lt;br /&gt;
    &amp;amp;i${NSIS_PTR_SIZE},t&amp;#039;${STRING}&amp;#039;,i${NSIS_MAX_STRLEN},\&lt;br /&gt;
    i,p,i,i,i,i,i,i) p.s&amp;quot;&lt;br /&gt;
  Exch $0&lt;br /&gt;
  SendMessage ${CONTROL} ${LVM_SETITEMTEXT} ${INDEX} $0&lt;br /&gt;
  System::Free $0&lt;br /&gt;
  Pop $0&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
Var ListView&lt;br /&gt;
Var Services&lt;br /&gt;
Var Locator&lt;br /&gt;
Var BaseBcdStore&lt;br /&gt;
Var BaseBcdObject&lt;br /&gt;
Var BcdStore&lt;br /&gt;
&lt;br /&gt;
!define MUI_CUSTOMFUNCTION_ABORT CleanUp&lt;br /&gt;
Page custom BootSelector Boot&lt;br /&gt;
!define MUI_PAGE_CUSTOMFUNCTION_PRE Skip&lt;br /&gt;
!insertmacro MUI_PAGE_INSTFILES&lt;br /&gt;
!insertmacro MUI_LANGUAGE &amp;quot;English&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Function .onInit&lt;br /&gt;
  Push $0&lt;br /&gt;
  ${BOOTCFG_ConnectWMI} $Locator $Services $0&lt;br /&gt;
  ${If} $0 != 0&lt;br /&gt;
    IntFmt $0 &amp;quot;0x%08X&amp;quot; $0&lt;br /&gt;
    MessageBox MB_OK &amp;quot;$Services: $0&amp;quot;&lt;br /&gt;
    StrCpy $Services &amp;quot;&amp;quot;&lt;br /&gt;
    StrCpy $Locator &amp;quot;&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  Pop $0&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Function .onRebootFailed&lt;br /&gt;
  MessageBox MB_OK|MB_ICONSTOP &amp;quot;Reboot failed. Please reboot manually.&amp;quot; \&lt;br /&gt;
    /SD IDOK&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; Skip page&lt;br /&gt;
Function Skip&lt;br /&gt;
  Quit&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; Determine the boot entries and present them via the list view control&lt;br /&gt;
Function SetUp&lt;br /&gt;
  ; Save registers&lt;br /&gt;
  Push $0&lt;br /&gt;
  Push $1&lt;br /&gt;
  Push $2&lt;br /&gt;
  Push $3&lt;br /&gt;
  Push $4&lt;br /&gt;
  Push $5&lt;br /&gt;
&lt;br /&gt;
  ${If} $Services != &amp;quot;&amp;quot;&lt;br /&gt;
    ${BOOTCFG_GetObject} $Services &amp;quot;BcdStore&amp;quot; $BaseBcdStore $0&lt;br /&gt;
    ${If} $0 != 0&lt;br /&gt;
      StrCpy $1 $BaseBcdStore&lt;br /&gt;
      StrCpy $BaseBcdStore &amp;quot;&amp;quot;&lt;br /&gt;
    ${Else}&lt;br /&gt;
      ${BOOTCFG_GetObject} $Services &amp;quot;BcdObject&amp;quot; $BaseBcdObject $0&lt;br /&gt;
      ${If} $0 != 0&lt;br /&gt;
        StrCpy $1 $BaseBcdObject&lt;br /&gt;
        StrCpy $BaseBcdObject &amp;quot;&amp;quot;&lt;br /&gt;
      ${Else}&lt;br /&gt;
        ${BOOTCFG_OpenDefaultBcdStore} $Services $BaseBcdStore \&lt;br /&gt;
          $BcdStore $0&lt;br /&gt;
        ${If} $0 != 0&lt;br /&gt;
          StrCpy $1 $BcdStore&lt;br /&gt;
          StrCpy $BcdStore &amp;quot;&amp;quot;&lt;br /&gt;
        ${Else}&lt;br /&gt;
          ${BOOTCFG_GetBcdObject} $Services $BaseBcdStore \&lt;br /&gt;
            $BcdStore ${BOOTCFG_CURRENT_GUID} $2 $0&lt;br /&gt;
          ; bcdobject=$5&lt;br /&gt;
          ${If} $0 != 0&lt;br /&gt;
            StrCpy $1 $2&lt;br /&gt;
          ${Else}&lt;br /&gt;
            ${BOOTCFG_GetBcdElement} $Services $BaseBcdObject \&lt;br /&gt;
              $2 ${BOOTCFG_BCDE_AUTORECOVERYENABLED} \&lt;br /&gt;
              $1 $0&lt;br /&gt;
            ${If} $0 == 0&lt;br /&gt;
              ${BOOTCFG_GetObjectPropertyValue} $1 &amp;quot;Boolean&amp;quot; $3 $0&lt;br /&gt;
              ; Release element [auto recovery enabled]&lt;br /&gt;
              ${BOOTCFG_ReleaseObject} $1&lt;br /&gt;
              ${If} $0 == 0&lt;br /&gt;
                System::Call &amp;quot;*$3(i .r0, i, i .r1)&amp;quot;&lt;br /&gt;
                System::Free $3&lt;br /&gt;
                IntOp $0 $0 &amp;amp; 0xFFFF&lt;br /&gt;
                IntOp $0 $0 - ${VT_BOOL}&lt;br /&gt;
                ${If} $0 == 0&lt;br /&gt;
                ${AndIf} $1 != 0&lt;br /&gt;
                  ${BOOTCFG_GetBcdElement} $Services $BaseBcdObject \&lt;br /&gt;
                    $2 ${BOOTCFG_BCDE_RECOVERYSEQUENCE} $3 $0&lt;br /&gt;
                ${EndIf}&lt;br /&gt;
              ${EndIf}&lt;br /&gt;
            ${EndIf}&lt;br /&gt;
            ; Release bcdobject&lt;br /&gt;
            ${BOOTCFG_ReleaseObject} $2&lt;br /&gt;
          ${EndIf}&lt;br /&gt;
          ${If} $0 != 0&lt;br /&gt;
            StrCpy $3 &amp;quot;&amp;quot;&lt;br /&gt;
          ${EndIf}&lt;br /&gt;
          ${BOOTCFG_GetElementFromBcd} $Services $BaseBcdStore \&lt;br /&gt;
            $BcdStore $BaseBcdObject ${BOOTCFG_BOOTMGR_GUID} \&lt;br /&gt;
            ${BOOTCFG_DISPLAY_ORDER} $2 $4 $0&lt;br /&gt;
          ; element=$4&lt;br /&gt;
          ; bcdobject=$2&lt;br /&gt;
          ${If} $0 != 0&lt;br /&gt;
            StrCpy $1 $4&lt;br /&gt;
          ${Else}&lt;br /&gt;
            ; Release bcdobject&lt;br /&gt;
            ${BOOTCFG_ReleaseObject} $2&lt;br /&gt;
            ${If} $3 != &amp;quot;&amp;quot; ; recovery boot entries&lt;br /&gt;
              ${BOOTCFG_EnumerateBcdObjectList} $Services \&lt;br /&gt;
                $BaseBcdStore $BcdStore $BaseBcdObject $3 $1&lt;br /&gt;
              ; Release object list element&lt;br /&gt;
              ${BOOTCFG_ReleaseObject} $3&lt;br /&gt;
            ${EndIf}&lt;br /&gt;
            ${BOOTCFG_EnumerateBcdObjectList} $Services $BaseBcdStore \&lt;br /&gt;
              $BcdStore $BaseBcdObject $4 $1&lt;br /&gt;
            ; Release object list element&lt;br /&gt;
            ${BOOTCFG_ReleaseObject} $4&lt;br /&gt;
          ${EndIf}&lt;br /&gt;
        ${EndIf}&lt;br /&gt;
      ${EndIf}&lt;br /&gt;
    ${EndIf}&lt;br /&gt;
  ${Else}&lt;br /&gt;
    StrCpy $1 &amp;quot;Invalid $$Services variable&amp;quot;&lt;br /&gt;
    StrCpy $0 ${ERROR_INVALID_DATA}&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
&lt;br /&gt;
  ${If} $0 != 0&lt;br /&gt;
    IntFmt $0 &amp;quot;0x%08X&amp;quot; $0&lt;br /&gt;
    MessageBox MB_OK &amp;quot;$1: $0&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
&lt;br /&gt;
  ; Restore registers&lt;br /&gt;
  Pop $5&lt;br /&gt;
  Pop $4&lt;br /&gt;
  Pop $3&lt;br /&gt;
  Pop $2&lt;br /&gt;
  Pop $1&lt;br /&gt;
  Pop $0&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Function CleanUp&lt;br /&gt;
  ${BOOTCFG_ReleaseObject} $BcdStore&lt;br /&gt;
  ${BOOTCFG_ReleaseObject} $BaseBcdObject&lt;br /&gt;
  ${BOOTCFG_ReleaseObject} $BaseBcdStore&lt;br /&gt;
  ${BOOTCFG_ReleaseObject} $Services&lt;br /&gt;
  ${BOOTCFG_ReleaseObject} $Locator&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; Add boot entry to list view control&lt;br /&gt;
; Parameters&lt;br /&gt;
;   name - description of boot entry&lt;br /&gt;
;   GUID - unique identifier of boot entry&lt;br /&gt;
Function AddBootEntry&lt;br /&gt;
  Exch $0&lt;br /&gt;
  Exch&lt;br /&gt;
  Exch $1&lt;br /&gt;
  Push $2&lt;br /&gt;
&lt;br /&gt;
  ; name=$1 GUID=$0&lt;br /&gt;
  SendMessage $ListView ${LVM_GETITEMCOUNT} &amp;quot;&amp;quot; &amp;quot;&amp;quot; $2&lt;br /&gt;
  ${NSD_LV_InsertItem} $ListView $2 $1&lt;br /&gt;
  ${NSD_LV_SetItemText} $ListView $2 1 $0&lt;br /&gt;
&lt;br /&gt;
  Pop $2&lt;br /&gt;
  Pop $1&lt;br /&gt;
  Pop $0&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; Dialog to select boot entry&lt;br /&gt;
Function BootSelector&lt;br /&gt;
  !insertmacro MUI_HEADER_TEXT &amp;quot;Boot Into&amp;quot; &amp;quot;Select an entry from below list to boot&amp;quot;&lt;br /&gt;
  nsDialogs::Create 1018&lt;br /&gt;
  Pop $0&lt;br /&gt;
  ${If} $0 != error&lt;br /&gt;
    ; Change the label of the &amp;quot;Next&amp;quot; button&lt;br /&gt;
    GetDlgItem $1 $HWNDPARENT 1&lt;br /&gt;
    SendMessage $1 ${WM_SETTEXT} 0 &amp;quot;STR:Boot&amp;quot;&lt;br /&gt;
    ; Create list view control&lt;br /&gt;
    ${NSD_CreateListView} 0 0 100% 100% &amp;quot;ListView&amp;quot;&lt;br /&gt;
    Pop $ListView&lt;br /&gt;
    ; Explicitly set full row selection&lt;br /&gt;
    SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} 0 ${LVS_EX_FULLROWSELECT}&lt;br /&gt;
    ; Calculate width of columns&lt;br /&gt;
    System::Call &amp;quot;user32::GetClientRect(p $ListView, @r2) i.r0&amp;quot;&lt;br /&gt;
    ${If} $0 != 0&lt;br /&gt;
      ; 2/5 (40%) of width for first column and 3/5 (60%) for second column&lt;br /&gt;
      System::Call &amp;quot;*$2(i.r0, i, i.r3, i)&amp;quot;&lt;br /&gt;
      IntOp $3 $3 - $0&lt;br /&gt;
      IntOp $2 $3 / 5&lt;br /&gt;
      IntOp $2 $2 + $2&lt;br /&gt;
      IntOp $3 $3 - $2&lt;br /&gt;
    ${Else}&lt;br /&gt;
      ; Fall back to default values&lt;br /&gt;
      StrCpy $2 100&lt;br /&gt;
      StrCpy $3 200&lt;br /&gt;
    ${EndIf}&lt;br /&gt;
    ${NSD_LV_InsertColumn} $ListView 0 $2 &amp;quot;Label&amp;quot;&lt;br /&gt;
    ${NSD_LV_InsertColumn} $ListView 1 $3 &amp;quot;GUID&amp;quot;&lt;br /&gt;
    Call SetUp&lt;br /&gt;
    ; Select first item in list&lt;br /&gt;
    ${NSD_LV_SetItemState} $ListView 0 ${LVIS_FOCUSED}|${LVIS_SELECTED}&lt;br /&gt;
    nsDialogs::Show&lt;br /&gt;
  ${Else}&lt;br /&gt;
    Abort&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Function Boot&lt;br /&gt;
  ; Go through the items and find the selected one&lt;br /&gt;
  SendMessage $ListView ${LVM_GETITEMCOUNT} &amp;quot;&amp;quot; &amp;quot;&amp;quot; $1&lt;br /&gt;
  ${If} $1 &amp;gt; 0&lt;br /&gt;
    IntOp $1 $1 - 1&lt;br /&gt;
    ${For} $0 0 $1&lt;br /&gt;
      SendMessage $ListView ${LVM_GETITEMSTATE} $0 ${LVIS_SELECTED} $2&lt;br /&gt;
      ${If} $2 != 0&lt;br /&gt;
        System::Call &amp;#039;*(&amp;amp;t${NSIS_MAX_STRLEN})p.r3&amp;#039;&lt;br /&gt;
        ; Choose second column =&amp;gt; subindex = 1&lt;br /&gt;
        System::Call &amp;quot;*(i${LVIF_TEXT},i,i 1,i,&amp;amp;i${NSIS_PTR_SIZE},\&lt;br /&gt;
          pr3,i${NSIS_MAX_STRLEN},i,p,i,i,i,i,i,i) p.r4&amp;quot;&lt;br /&gt;
        SendMessage $ListView ${LVM_GETITEMTEXT} $0 $4 $2&lt;br /&gt;
        ${If} $2 &amp;gt; 0&lt;br /&gt;
          System::Call &amp;quot;*$3(&amp;amp;t$2.r2)&amp;quot;&lt;br /&gt;
          ${BOOTCFG_SetActiveBootEntry} $Services $BaseBcdStore \&lt;br /&gt;
            $BcdStore $BaseBcdObject $2 $6 $5&lt;br /&gt;
          ${If} $5 != 0&lt;br /&gt;
            IntFmt $5 &amp;quot;0x%08X&amp;quot; $5&lt;br /&gt;
            MessageBox MB_OK &amp;quot;$6: $5&amp;quot;&lt;br /&gt;
          ${Else}&lt;br /&gt;
            ${BOOTCFG_ReleaseObject} $6&lt;br /&gt;
            SetRebootFlag true&lt;br /&gt;
          ${EndIf}&lt;br /&gt;
        ${EndIf}&lt;br /&gt;
        System::Free $4&lt;br /&gt;
        System::Free $3&lt;br /&gt;
      ${EndIf}&lt;br /&gt;
    ${Next}&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  Call CleanUp&lt;br /&gt;
&lt;br /&gt;
  ${If} ${RebootFlag}&lt;br /&gt;
    Reboot&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section -Ignore&lt;br /&gt;
SectionEnd&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:System Plugin Examples]]&lt;br /&gt;
[[Category:COM Programming]]&lt;br /&gt;
[[Category:bootcfg.nsh]]&lt;/div&gt;</summary>
		<author><name>F0rt</name></author>
	</entry>
</feed>