|
|
楼主 |
发表于 2026-3-30 13:03:00
|
显示全部楼层
Unicode false
!include "LogicLib.nsh"
!include "FileFunc.nsh"
!include MUI2.nsh
!include "Sections.nsh"
!define GUID "{566C315E-2697-4E54-83FF-45EDDCFF12B5}"
!define PEGUID "{566C315F-2697-4E54-83FF-45EDDCFF12B5}"
Name "欢迎使用WinPE"
OutFile "WinPE在线安装程序.exe"
; 添加卸载相关定义
!define UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPE_Installer"
!define UNINSTALL_EXE "C:\YXPE\Uninstall_WinPE.exe"
; 界面设置
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
!define MUI_PAGE_CUSTOMFUNCTION_PRE 'CopyFiles'
!define MUI_PAGE_CUSTOMFUNCTION_SHOW MyInstFiles
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "SimpChinese"
Icon start.ico
ShowInstDetails nevershow
ShowUninstDetails nevershow
AutoCloseWindow true
BrandingText "在线一键安装系统"
Caption ""
Var InstallSize
Var UninstallCreated
Section "主程序" SecMain
SetDetailsPrint textonly
DetailPrint "正在下载最新PE文件...."
SetDetailsPrint listonly
; 创建安装目录
SetOutPath C:\YXPE
File boot.sdi
; 下载PE文件
NScurl::http GET "http://down.jywangluo.cn:88/PE/PE.7z" "$PLUGINSDIR\PE.7z"
Nsis7z::ExtractWithDetails "$PLUGINSDIR\PE.7z" "文件解压进度 %s..."
; 设置隐藏属性
SetFileAttributes "C:\YXPE" HIDDEN
SetDetailsPrint textonly
DetailPrint "添加PE启动菜单...."
SetDetailsPrint listonly
; 添加启动项
System::Call "Kernel32::Wow64EnableWow64FsRedirection(i 0)"
nsExec::Exec 'bcdedit /create ${GUID} /device'
nsExec::Exec 'bcdedit /set ${GUID} ramdisksdidevice partition=C:'
nsExec::Exec 'bcdedit /set ${GUID} ramdisksdipath \YXPE\boot.sdi'
nsExec::Exec 'bcdedit /create ${PEGUID} /d "WinPE 网络维护环境" /application osloader'
nsExec::Exec 'bcdedit /set ${PEGUID} device ramdisk=[C:]\YXPE\YXPE.wim,${GUID}'
nsExec::Exec 'bcdedit /set ${PEGUID} osdevice ramdisk=[C:]\YXPE\YXPE.wim,${GUID}'
; 检测启动类型
File "/oname=$PLUGINSDIR\BootType.exe" "BootType.exe"
nsExec::ExecToStack $PLUGINSDIR\BootType.exe
Pop $0
Pop $1
${If} $1 == "UEFI"
nsExec::Exec 'bcdedit /set ${PEGUID} path \windows\system32\boot\winload.efi'
Version::IsWindows7
Pop $R0
StrCmp $R0 "1" is_win7 not_win7
is_win7:
SetDetailsPrint textonly
DetailPrint "当前系统是Win7UEFI系统将自动执行引导文件替换"
SetDetailsPrint listonly
File "/oname=$PLUGINSDIR\MountEFIfix.exe" "MountEFIfix.exe"
ExecWait "$PLUGINSDIR\MountEFIfix.exe /S"
SetDetailsPrint textonly
DetailPrint "Win7UEFI EFI分区引导文件修复完成"
SetDetailsPrint listonly
Goto done
not_win7:
Goto done
${Else}
nsExec::Exec 'bcdedit /set ${PEGUID} path \windows\system32\boot\winload.exe'
${EndIf}
done:
nsExec::Exec 'bcdedit /set ${PEGUID} locale zh-CN'
nsExec::Exec 'bcdedit /set ${PEGUID} systemroot \windows'
nsExec::Exec 'bcdedit /set ${PEGUID} winpe yes'
nsExec::Exec 'bcdedit /set ${PEGUID} detecthal yes'
nsExec::Exec 'bcdedit /displayorder ${PEGUID} /addlast'
nsExec::Exec 'bcdedit /bootsequence ${PEGUID} /addfirst'
nsExec::Exec 'bcdedit /timeout 10'
; 计算安装目录大小
SetDetailsPrint textonly
DetailPrint "正在计算安装目录大小..."
SetDetailsPrint listonly
${GetSize} "C:\YXPE" "/S=0K" $0 $1 $2
IntFmt $InstallSize "0x%08X" $0
; 创建卸载程序
SetDetailsPrint textonly
DetailPrint "正在创建卸载程序..."
SetDetailsPrint listonly
Call CreateUninstaller
; 询问是否重启
MessageBox MB_YESNO|MB_ICONQUESTION "安装完成!立即重启系统进入PE点是!稍后自行重启点否" IDYES true IDNO false
true:
Reboot
false:
Quit
SectionEnd
Function CreateUninstaller
; 写入卸载程序
SetOutPath "C:\YXPE"
WriteUninstaller "${UNINSTALL_EXE}"
; 写入注册表卸载信息
WriteRegStr HKLM "${UNINSTALL_KEY}" "DisplayName" "WinPE 网络维护环境"
WriteRegStr HKLM "${UNINSTALL_KEY}" "UninstallString" "${UNINSTALL_EXE}"
WriteRegStr HKLM "${UNINSTALL_KEY}" "DisplayIcon" "${UNINSTALL_EXE}"
WriteRegStr HKLM "${UNINSTALL_KEY}" "Publisher" "东莞顺艺网络科技"
WriteRegStr HKLM "${UNINSTALL_KEY}" "DisplayVersion" "1.0.0"
WriteRegStr HKLM "${UNINSTALL_KEY}" "InstallLocation" "C:\YXPE"
WriteRegDWORD HKLM "${UNINSTALL_KEY}" "EstimatedSize" $InstallSize
WriteRegDWORD HKLM "${UNINSTALL_KEY}" "NoModify" 1
WriteRegDWORD HKLM "${UNINSTALL_KEY}" "NoRepair" 1
StrCpy $UninstallCreated "1"
FunctionEnd
Section "Uninstall"
SetDetailsPrint textonly
DetailPrint "正在卸载 WinPE..."
SetDetailsPrint listonly
; 删除启动项
System::Call "Kernel32::Wow64EnableWow64FsRedirection(i 0)"
nsExec::Exec 'bcdedit /delete ${PEGUID} /f'
nsExec::Exec 'bcdedit /delete ${GUID} /f'
; 删除文件
SetDetailsPrint textonly
DetailPrint "正在删除安装文件..."
SetDetailsPrint listonly
RMDir /r "C:\YXPE"
; 删除注册表项
SetDetailsPrint textonly
DetailPrint "正在删除注册表信息..."
SetDetailsPrint listonly
DeleteRegKey HKLM "${UNINSTALL_KEY}"
; 删除卸载程序自身
SetDetailsPrint textonly
DetailPrint "正在删除卸载程序..."
SetDetailsPrint listonly
Delete "${UNINSTALL_EXE}"
SetDetailsPrint textonly
DetailPrint "卸载完成!"
DetailPrint "WinPE 已从您的系统中移除。"
Sleep 2000
SetAutoClose true
SectionEnd
Function .onInit
BrandingURL::Unload
; 检查是否已经安装
ReadRegStr $0 HKLM "${UNINSTALL_KEY}" "UninstallString"
StrCmp $0 "" skipUninstallCheck
MessageBox MB_YESNO|MB_ICONQUESTION "检测到系统中已安装 WinPE,是否先卸载旧版本?" IDYES uninstallOld IDNO skipUninstallCheck
uninstallOld:
ExecWait "$0"
skipUninstallCheck:
FunctionEnd
Function MyInstFiles
GetDlgItem $0 $HWNDPARENT 1 ;下一步
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 2 ;取消
ShowWindow $0 ${SW_HIDE}
GetDlgItem $1 $HWNDPARENT 3 ;上一步
ShowWindow $1 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1037
SendMessage $0 ${WM_SETTEXT} 0 "STR: "
GetDlgItem $0 $HWNDPARENT 1038
SendMessage $0 ${WM_SETTEXT} 0 "STR:正在下载最新PE文件,请稍候...."
FunctionEnd
Function 'CopyFiles'
GetDlgItem $R0 $HWNDPARENT 1
System::Call 'user32::GetWindowLong(i $hwndparent,i -16)i.r0'
intop $1 0x80000 ~
intop $0 $0 & $1
System::Call 'user32::SetWindowLong(i $hwndparent,i -16,i $0)i'
FunctionEnd
Function onGUIInit
BrandingURL::Set /NOUNLOAD "0" "0" "255" "http://down.jywangluo.cn:88"
FunctionEnd |
|