Compare commits
No commits in common. "dev" and "v1.2.1" have entirely different histories.
701 changed files with 14410 additions and 49430 deletions
|
|
@ -89,7 +89,7 @@
|
|||
<value name="ProcessNewConArg" type="hex" data="01"/>
|
||||
<value name="ProcessCmdStart" type="hex" data="00"/>
|
||||
<value name="ProcessCtrlZ" type="hex" data="00"/>
|
||||
<value name="SuppressBells" type="hex" data="00"/>
|
||||
<value name="SuppressBells" type="hex" data="01"/>
|
||||
<value name="ConsoleExceptionHandler" type="hex" data="00"/>
|
||||
<value name="UseClink" type="hex" data="01"/>
|
||||
<value name="StoreTaskbarkTasks" type="hex" data="01"/>
|
||||
|
|
@ -662,5 +662,3 @@ DecimalSeparator=.
|
|||
ThousandsSeparator=,
|
||||
CsvSeparator=,
|
||||
TextButtons=0
|
||||
SensorToolTips=0
|
||||
|
||||
152
.bin/Scripts/Copy WizardKit.cmd
Normal file
152
.bin/Scripts/Copy WizardKit.cmd
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
:: Wizard Kit: Copy Kit ::
|
||||
@echo off
|
||||
|
||||
:Init
|
||||
setlocal EnableDelayedExpansion
|
||||
title Wizard Kit: Tools Copier
|
||||
color 1b
|
||||
echo Initializing...
|
||||
call :CheckFlags %*
|
||||
call :FindBin
|
||||
call :SetTitle Tools Copier
|
||||
|
||||
:SetVariables
|
||||
rem Set variables using settings\main.py file
|
||||
set "SETTINGS=%bin%\Scripts\settings\main.py"
|
||||
for %%v in (ARCHIVE_PASSWORD KIT_NAME_FULL) do (
|
||||
set "var=%%v"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr "!var!=" %SETTINGS%`) do (
|
||||
set "_v=%%f"
|
||||
set "_v=!_v:*'=!"
|
||||
set "%%v=!_v:~0,-1!"
|
||||
)
|
||||
)
|
||||
rem Set ARCH to 32 as a gross assumption and check for x86_64 status
|
||||
set ARCH=32
|
||||
if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "ARCH=64"
|
||||
set "SEVEN_ZIP=%bin%\7-Zip\7za.exe"
|
||||
set "CON=%bin%\ConEmu\ConEmu.exe"
|
||||
set "FASTCOPY=%bin%\FastCopy\FastCopy.exe"
|
||||
if %ARCH% equ 64 (
|
||||
set "SEVEN_ZIP=%bin%\7-Zip\7za64.exe"
|
||||
set "CON=%bin%\ConEmu\ConEmu64.exe"
|
||||
set "FASTCOPY=%bin%\FastCopy\FastCopy64.exe"
|
||||
)
|
||||
set "fastcopy_args=/cmd=diff /no_ui /auto_close"
|
||||
rem Set %client_dir%
|
||||
call "%bin%\Scripts\init_client_dir.cmd"
|
||||
pushd "%bin%\.."
|
||||
set "source=%cd%"
|
||||
popd
|
||||
set "dest=%client_dir%\Tools"
|
||||
|
||||
:RelaunchInConEmu
|
||||
if not defined IN_CONEMU (
|
||||
if not defined L_NCMD (
|
||||
set "con_args=-new_console:n"
|
||||
rem If in DEBUG state then force ConEmu to stay open
|
||||
if defined DEBUG (set "con_args=!con_args! -new_console:c")
|
||||
set IN_CONEMU=True
|
||||
start "" "%CON%" -run ""%~0" %*" !con_args! || goto ErrorUnknown
|
||||
exit /b 0
|
||||
)
|
||||
)
|
||||
:CopyBin
|
||||
echo Copying .bin...
|
||||
mkdir "%dest%\.bin" >nul 2>&1
|
||||
attrib +h "%dest%\.bin"
|
||||
set _sources="%bin%\7-Zip"
|
||||
set _sources=%_sources% "%bin%\ConEmu"
|
||||
set _sources=%_sources% "%bin%\FastCopy"
|
||||
set _sources=%_sources% "%bin%\HWiNFO"
|
||||
set _sources=%_sources% "%bin%\Python"
|
||||
set _sources=%_sources% "%bin%\Scripts"
|
||||
start "" /wait "%fastcopy%" %fastcopy_args% %_sources% /to="%dest%\.bin\"
|
||||
|
||||
:CopyCBin
|
||||
echo Copying .cbin...
|
||||
mkdir "%dest%\.cbin" >nul 2>&1
|
||||
attrib +h "%dest%\.cbin"
|
||||
start "" /wait "%fastcopy%" %fastcopy_args% %cbin%\* /to="%dest%\.cbin\"
|
||||
|
||||
:CopyMainData
|
||||
echo Copying Main Kit...
|
||||
set _sources="%source%\Data Transfers"
|
||||
set _sources=%_sources% "%source%\Diagnostics"
|
||||
set _sources=%_sources% "%source%\Drivers"
|
||||
set _sources=%_sources% "%source%\Installers"
|
||||
set _sources=%_sources% "%source%\Misc"
|
||||
set _sources=%_sources% "%source%\Repairs"
|
||||
set _sources=%_sources% "%source%\Uninstallers"
|
||||
set _sources=%_sources% "%source%\Activate Windows.cmd"
|
||||
set _sources=%_sources% "%source%\Enter SafeMode.cmd"
|
||||
set _sources=%_sources% "%source%\Exit SafeMode.cmd"
|
||||
set _sources=%_sources% "%source%\LICENSE.txt"
|
||||
set _sources=%_sources% "%source%\README.md"
|
||||
set _sources=%_sources% "%source%\System Checklist.cmd"
|
||||
set _sources=%_sources% "%source%\System Diagnostics.cmd"
|
||||
set _sources=%_sources% "%source%\User Checklist.cmd"
|
||||
start "" /wait "%fastcopy%" %fastcopy_args% /exclude="Snappy Driver Installer*;Update Kit*;*.exe" %_sources% /to="%dest%\"
|
||||
start "" /wait "%fastcopy%" %fastcopy_args% "%source%\Installers\Extras\Office\Adobe Reader DC.exe" /to="%dest%\Installers\Extras\Office\"
|
||||
|
||||
:Ninite
|
||||
echo Extracting Ninite installers...
|
||||
"%SEVEN_ZIP%" x "%cbin%\_Ninite.7z" -aos -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD% -o"%dest%\Installers\Extras" || goto Abort
|
||||
|
||||
:OpenFolder
|
||||
start "" explorer "%dest%"
|
||||
goto Exit
|
||||
|
||||
:: Functions ::
|
||||
:CheckFlags
|
||||
rem Loops through all arguments to check for accepted flags
|
||||
set DEBUG=
|
||||
for %%f in (%*) do (
|
||||
if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG")
|
||||
)
|
||||
@exit /b 0
|
||||
|
||||
:FindBin
|
||||
rem Checks the current directory and all parents for the ".bin" folder
|
||||
rem NOTE: Has not been tested for UNC paths
|
||||
set bin=
|
||||
pushd "%~dp0"
|
||||
:FindBinInner
|
||||
if exist ".bin" (goto FindBinDone)
|
||||
if "%~d0\" == "%cd%" (popd & @exit /b 1)
|
||||
cd ..
|
||||
goto FindBinInner
|
||||
:FindBinDone
|
||||
set "bin=%cd%\.bin"
|
||||
set "cbin=%cd%\.cbin"
|
||||
popd
|
||||
@exit /b 0
|
||||
|
||||
:SetTitle
|
||||
rem Sets title using KIT_NAME_FULL from settings\main.py
|
||||
set "window_title=%*"
|
||||
if not defined window_title set "window_title=Launcher"
|
||||
set "window_title=%KIT_NAME_FULL%: %window_title%"
|
||||
title %window_title%
|
||||
@exit /b 0
|
||||
|
||||
:: Errors ::
|
||||
:ErrorNoBin
|
||||
echo.
|
||||
echo ERROR: ".bin" folder not found.
|
||||
goto Abort
|
||||
|
||||
:Abort
|
||||
color 4e
|
||||
echo Aborted.
|
||||
echo Press any key to exit...
|
||||
pause>nul
|
||||
color
|
||||
rem Set errorlevel to 1 by calling color incorrectly
|
||||
color 00
|
||||
goto Exit
|
||||
|
||||
:: Cleanup and exit ::
|
||||
:Exit
|
||||
endlocal
|
||||
exit /b %errorlevel%
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
:: WizardKit: Wrapper for launching programs and scripts.
|
||||
:: Wizard Kit: Wrapper for launching programs and scripts.
|
||||
::
|
||||
:: Some features:
|
||||
:: * If the OS is 64-bit then the WorkingDir is scanned for a 64-bit version of the programs
|
||||
|
|
@ -10,7 +10,7 @@ if defined DEBUG (@echo on)
|
|||
|
||||
:Init
|
||||
setlocal EnableDelayedExpansion
|
||||
title WizardKit: Launcher
|
||||
title Wizard Kit: Launcher
|
||||
pushd "%~dp0"
|
||||
call :FindBin
|
||||
call :DeQuote L_ITEM
|
||||
|
|
@ -19,38 +19,39 @@ call :DeQuote L_TYPE
|
|||
|
||||
:SetVariables
|
||||
rem Set variables using settings\main.py file
|
||||
set "SETTINGS=%bin%\Scripts\wk\cfg\main.py"
|
||||
set "SETTINGS=%bin%\Scripts\settings\main.py"
|
||||
for %%v in (ARCHIVE_PASSWORD KIT_NAME_FULL OFFICE_SERVER_IP QUICKBOOKS_SERVER_IP) do (
|
||||
set "var=%%v"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr "!var!=" "%SETTINGS%"`) do (
|
||||
set "_v=%%f"
|
||||
set "_v=!_v:*'=!"
|
||||
set "%%v=!_v:~0,-1!"
|
||||
)
|
||||
set "var=%%v"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr "!var!=" %SETTINGS%`) do (
|
||||
set "_v=%%f"
|
||||
set "_v=!_v:*'=!"
|
||||
set "%%v=!_v:~0,-1!"
|
||||
)
|
||||
)
|
||||
rem Set ARCH to 32 as a gross assumption and check for x86_64 status
|
||||
set ARCH=32
|
||||
if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "ARCH=64"
|
||||
set "SEVEN_ZIP=%bin%\7-Zip\7z.exe"
|
||||
set "SEVEN_ZIP=%bin%\7-Zip\7za.exe"
|
||||
set "CON=%bin%\ConEmu\ConEmu.exe"
|
||||
set "FASTCOPY=%bin%\FastCopy\FastCopy.exe"
|
||||
set "POWERSHELL=%systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe"
|
||||
set "PYTHON=%bin%\Python\x32\python.exe"
|
||||
if %ARCH% equ 64 (
|
||||
set "CON=%bin%\ConEmu\ConEmu64.exe"
|
||||
set "FASTCOPY=%bin%\FastCopy\FastCopy64.exe"
|
||||
set "PYTHON=%bin%\Python\x64\python.exe"
|
||||
set "SEVEN_ZIP=%bin%\7-Zip\7za64.exe"
|
||||
set "CON=%bin%\ConEmu\ConEmu64.exe"
|
||||
set "FASTCOPY=%bin%\FastCopy\FastCopy64.exe"
|
||||
set "PYTHON=%bin%\Python\x64\python.exe"
|
||||
)
|
||||
|
||||
:UpdateTitle
|
||||
rem Sets title using KIT_NAME_FULL from settings\main.py (unless %window_title% already set)
|
||||
if defined window_title (
|
||||
title %window_title%
|
||||
title %window_title%
|
||||
) else (
|
||||
set "window_title=%*"
|
||||
if not defined window_title set "window_title=Launcher"
|
||||
set "window_title=%KIT_NAME_FULL%: %window_title%"
|
||||
title %window_title%
|
||||
set "window_title=%*"
|
||||
if not defined window_title set "window_title=Launcher"
|
||||
set "window_title=%KIT_NAME_FULL%: %window_title%"
|
||||
title %window_title%
|
||||
)
|
||||
|
||||
:CheckUsage
|
||||
|
|
@ -65,28 +66,28 @@ if /i not "%L__CLI%" == "True" (set "L__CLI=")
|
|||
|
||||
:RelaunchInConEmu
|
||||
set RELOAD_IN_CONEMU=True
|
||||
if defined ConEmuBuild set "RELOAD_IN_CONEMU="
|
||||
if defined L_NCMD set "RELOAD_IN_CONEMU="
|
||||
if "%L_TYPE%" == "Executable" set "RELOAD_IN_CONEMU="
|
||||
if "%L_TYPE%" == "PSScript" set "RELOAD_IN_CONEMU="
|
||||
if "%L_TYPE%" == "PyScript" set "RELOAD_IN_CONEMU="
|
||||
if defined ConEmuBuild set "RELOAD_IN_CONEMU="
|
||||
if defined L_NCMD set "RELOAD_IN_CONEMU="
|
||||
if "%L_TYPE%" == "Executable" set "RELOAD_IN_CONEMU="
|
||||
if "%L_TYPE%" == "PSScript" set "RELOAD_IN_CONEMU="
|
||||
if "%L_TYPE%" == "PyScript" set "RELOAD_IN_CONEMU="
|
||||
|
||||
if defined RELOAD_IN_CONEMU (
|
||||
set "con_args=-new_console:n"
|
||||
rem If in DEBUG state then force ConEmu to stay open
|
||||
if defined DEBUG (set "con_args=!con_args! -new_console:c")
|
||||
start "" "%CON%" -run ""%~0" %*" !con_args! || goto ErrorUnknown
|
||||
exit /b 0
|
||||
set "con_args=-new_console:n"
|
||||
rem If in DEBUG state then force ConEmu to stay open
|
||||
if defined DEBUG (set "con_args=!con_args! -new_console:c")
|
||||
start "" "%CON%" -run ""%~0" %*" !con_args! || goto ErrorUnknown
|
||||
exit /b 0
|
||||
)
|
||||
|
||||
:CheckLaunchType
|
||||
rem Jump to the selected launch type or show usage
|
||||
if /i "%L_TYPE%" == "Executable" (goto LaunchExecutable)
|
||||
if /i "%L_TYPE%" == "Folder" (goto LaunchFolder)
|
||||
if /i "%L_TYPE%" == "Office" (goto LaunchOffice)
|
||||
if /i "%L_TYPE%" == "PSScript" (goto LaunchPSScript)
|
||||
if /i "%L_TYPE%" == "PyScript" (goto LaunchPyScript)
|
||||
if /i "%L_TYPE%" == "QuickBooks" (goto LaunchQuickBooksSetup)
|
||||
if /i "%L_TYPE%" == "Executable" (goto LaunchExecutable)
|
||||
if /i "%L_TYPE%" == "Folder" (goto LaunchFolder)
|
||||
if /i "%L_TYPE%" == "Office" (goto LaunchOffice)
|
||||
if /i "%L_TYPE%" == "PSScript" (goto LaunchPSScript)
|
||||
if /i "%L_TYPE%" == "PyScript" (goto LaunchPyScript)
|
||||
if /i "%L_TYPE%" == "QuickBooks" (goto LaunchQuickBooksSetup)
|
||||
goto Usage
|
||||
|
||||
:LaunchExecutable
|
||||
|
|
@ -96,9 +97,7 @@ call :ExtractOrFindPath || goto ErrorProgramNotFound
|
|||
rem Check for 64-bit prog (if running on 64-bit system)
|
||||
set "prog=%_path%\%L_ITEM%"
|
||||
if %ARCH% equ 64 (
|
||||
if exist "%_path%\%L_ITEM:.=64.%" set "prog=%_path%\%L_ITEM:.=64.%"
|
||||
) else (
|
||||
if exist "%_path%\%L_ITEM:.=32.%" set "prog=%_path%\%L_ITEM:.=32.%"
|
||||
if exist "%_path%\%L_ITEM:.=64.%" set "prog=%_path%\%L_ITEM:.=64.%"
|
||||
)
|
||||
if not exist "%prog%" goto ErrorProgramNotFound
|
||||
|
||||
|
|
@ -106,9 +105,9 @@ rem Run
|
|||
popd && pushd "%_path%"
|
||||
if defined L__CLI goto LaunchExecutableCLI
|
||||
if defined L_ELEV (
|
||||
goto LaunchExecutableElev
|
||||
goto LaunchExecutableElev
|
||||
) else (
|
||||
goto LaunchExecutableUser
|
||||
goto LaunchExecutableUser
|
||||
)
|
||||
|
||||
:LaunchExecutableCLI
|
||||
|
|
@ -151,20 +150,20 @@ goto Exit
|
|||
:LaunchOffice
|
||||
call "%bin%\Scripts\init_client_dir.cmd" /Office
|
||||
set "_odt=False"
|
||||
if %L_PATH% equ 2013 (set "_odt=True")
|
||||
if %L_PATH% equ 2016 (set "_odt=True")
|
||||
if %L_PATH% equ 2019 (set "_odt=True")
|
||||
if "%_odt%" == "True" (
|
||||
goto LaunchOfficeODT
|
||||
goto LaunchOfficeODT
|
||||
) else (
|
||||
goto LaunchOfficeSetup
|
||||
goto LaunchOfficeSetup
|
||||
)
|
||||
|
||||
:LaunchOfficeODT
|
||||
rem Prep
|
||||
set "args=-aoa -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD%"
|
||||
set "config=%L_ITEM%"
|
||||
set "dest=%client_dir%\Office\ODT"
|
||||
set "odt_exe=setup.exe"
|
||||
set "dest=%client_dir%\Office\%L_PATH%"
|
||||
set "odt_exe=%L_PATH%\setup.exe"
|
||||
set "source=%cbin%\_Office.7z"
|
||||
|
||||
rem Extract
|
||||
|
|
@ -203,14 +202,14 @@ start "" /wait "%FASTCOPY%" %fastcopy_args% "%source%" /to="%dest%\"
|
|||
|
||||
rem Run
|
||||
if exist "%dest%\%product_name%\setup.exe" (
|
||||
start "" "%dest%\%product_name%\setup.exe" || goto ErrorUnknown
|
||||
start "" "%dest%\%product_name%\setup.exe" || goto ErrorUnknown
|
||||
) else if "%product_name:~-3,3%" == "exe" (
|
||||
start "" "%dest%\%product_name%" || goto ErrorUnknown
|
||||
start "" "%dest%\%product_name%" || goto ErrorUnknown
|
||||
) else if "%product_name:~-3,3%" == "msi" (
|
||||
start "" "%dest%\%product_name%" || goto ErrorUnknown
|
||||
start "" "%dest%\%product_name%" || goto ErrorUnknown
|
||||
) else (
|
||||
rem Office source not supported by this script
|
||||
goto ErrorOfficeUnsupported
|
||||
rem Office source not supported by this script
|
||||
goto ErrorOfficeUnsupported
|
||||
)
|
||||
goto Exit
|
||||
|
||||
|
|
@ -226,9 +225,9 @@ if not exist "%script%" goto ErrorScriptNotFound
|
|||
rem Run
|
||||
popd && pushd "%_path%"
|
||||
if defined L_ELEV (
|
||||
goto LaunchPSScriptElev
|
||||
goto LaunchPSScriptElev
|
||||
) else (
|
||||
goto LaunchPSScriptUser
|
||||
goto LaunchPSScriptUser
|
||||
)
|
||||
|
||||
:LaunchPSScriptElev
|
||||
|
|
@ -239,10 +238,10 @@ rem Create VB script
|
|||
mkdir "%bin%\tmp" 2>nul
|
||||
echo Set UAC = CreateObject^("Shell.Application"^) > "%bin%\tmp\Elevate.vbs"
|
||||
if defined L_NCMD (
|
||||
rem use Powershell's window instead of %CON%
|
||||
echo UAC.ShellExecute "%POWERSHELL%", "%ps_args% -File "%script%"", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
|
||||
rem use Powershell's window instead of %CON%
|
||||
echo UAC.ShellExecute "%POWERSHELL%", "%ps_args% -File "%script%"", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
|
||||
) else (
|
||||
echo UAC.ShellExecute "%CON%", "-run %POWERSHELL% %ps_args% -File "^"%script%^"" -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
|
||||
echo UAC.ShellExecute "%CON%", "-run %POWERSHELL% %ps_args% -File "%script%" -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
|
||||
)
|
||||
|
||||
rem Run
|
||||
|
|
@ -252,9 +251,9 @@ goto Exit
|
|||
:LaunchPSScriptUser
|
||||
rem Run
|
||||
if defined L_NCMD (
|
||||
start "" "%POWERSHELL%" %ps_args% -File "%script%" || goto ErrorUnknown
|
||||
start "" "%POWERSHELL%" %ps_args% -File "%script%" || goto ErrorUnknown
|
||||
) else (
|
||||
start "" "%CON%" -run "%POWERSHELL%" %ps_args% -File "%script%" -new_console:n || goto ErrorUnknown
|
||||
start "" "%CON%" -run "%POWERSHELL%" %ps_args% -File "%script%" -new_console:n || goto ErrorUnknown
|
||||
)
|
||||
goto Exit
|
||||
|
||||
|
|
@ -264,14 +263,13 @@ call :ExtractOrFindPath || goto ErrorProgramNotFound
|
|||
set "script=%_path%\%L_ITEM%"
|
||||
|
||||
rem Verify
|
||||
"%PYTHON%" --version >nul || goto ErrorPythonUnsupported
|
||||
if not exist "%script%" goto ErrorScriptNotFound
|
||||
|
||||
rem Run
|
||||
if defined L_ELEV (
|
||||
goto LaunchPyScriptElev
|
||||
goto LaunchPyScriptElev
|
||||
) else (
|
||||
goto LaunchPyScriptUser
|
||||
goto LaunchPyScriptUser
|
||||
)
|
||||
|
||||
:LaunchPyScriptElev
|
||||
|
|
@ -282,9 +280,9 @@ rem Create VB script
|
|||
mkdir "%bin%\tmp" 2>nul
|
||||
echo Set UAC = CreateObject^("Shell.Application"^) > "%bin%\tmp\Elevate.vbs"
|
||||
if defined L_NCMD (
|
||||
echo UAC.ShellExecute "%PYTHON%", """%script%"" %L_ARGS%", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
|
||||
echo UAC.ShellExecute "%PYTHON%", "%script%", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
|
||||
) else (
|
||||
echo UAC.ShellExecute "%CON%", "-run ""%PYTHON%"" ""%script%"" %L_ARGS% -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
|
||||
echo UAC.ShellExecute "%CON%", "-run %PYTHON% %script% -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
|
||||
)
|
||||
|
||||
rem Run
|
||||
|
|
@ -293,9 +291,9 @@ goto Exit
|
|||
|
||||
:LaunchPyScriptUser
|
||||
if defined L_NCMD (
|
||||
start "" "%PYTHON%" "%script%" %L_ARGS% || goto ErrorUnknown
|
||||
start "" "%PYTHON%" "%script%" || goto ErrorUnknown
|
||||
) else (
|
||||
start "" "%CON%" -run "%PYTHON%" "%script%" %L_ARGS% -new_console:n || goto ErrorUnknown
|
||||
start "" "%CON%" -run "%PYTHON%" "%script%" -new_console:n || goto ErrorUnknown
|
||||
)
|
||||
goto Exit
|
||||
|
||||
|
|
@ -318,12 +316,12 @@ start "" /wait "%FASTCOPY%" %fastcopy_args% "%source%" /to="%dest%\"
|
|||
|
||||
rem Run
|
||||
if exist "%dest%\%product_name%\Setup.exe" (
|
||||
pushd "%dest%\%product_name%"
|
||||
start "" "%dest%\%product_name%\Setup.exe" || goto ErrorUnknown
|
||||
popd
|
||||
pushd "%dest%\%product_name%"
|
||||
start "" "%dest%\%product_name%\Setup.exe" || goto ErrorUnknown
|
||||
popd
|
||||
) else (
|
||||
rem QuickBooks source not supported by this script
|
||||
goto ErrorQuickBooksUnsupported
|
||||
rem QuickBooks source not supported by this script
|
||||
goto ErrorQuickBooksUnsupported
|
||||
)
|
||||
goto Exit
|
||||
|
||||
|
|
@ -332,16 +330,16 @@ echo.
|
|||
echo.Usage (via defined variables):
|
||||
echo. L_TYPE L_PATH L_ITEM L_ARGS
|
||||
echo. Executable Working Dir Program Args [L_7ZIP] [L_ELEV] [L__CLI]
|
||||
echo. Folder Folder '.' [L_7ZIP]
|
||||
echo. Office Year Product [L_7ZIP]
|
||||
echo. PSScript Scripts Script [L_7ZIP] [L_ELEV] [L_NCMD]
|
||||
echo. PyScript Scripts Script Args [L_7ZIP] [L_ELEV] [L_NCMD]
|
||||
echo. QuickBooks Year Product [L_7ZIP]
|
||||
echo. Folder Folder '.' [L_7ZIP]
|
||||
echo. Office Year Product [L_7ZIP]
|
||||
echo. PSScript Scripts Script [L_7ZIP] [L_ELEV] [L_NCMD]
|
||||
echo. PyScript Scripts Script [L_7ZIP] [L_ELEV] [L_NCMD]
|
||||
echo. QuickBooks Year Product [L_7ZIP]
|
||||
echo.
|
||||
echo.L_7ZIP: Extra arguments for 7-Zip (in the :ExtractCBin label)
|
||||
echo.L_ELEV: Elevate to run as Admin
|
||||
echo.L_NCMD: Do not run script inside ConEmu (i.e. use the native window)
|
||||
echo.L__CLI: Run executable in ConEmu
|
||||
echo.L_7ZIP: Extra arguments for 7-Zip (in the :ExtractCBin label)
|
||||
echo.L_ELEV: Elevate to run as Admin
|
||||
echo.L_NCMD: Do not run script inside ConEmu (i.e. use the native window)
|
||||
echo.L__CLI: Run executable in ConEmu
|
||||
echo.
|
||||
goto Abort
|
||||
|
||||
|
|
@ -393,15 +391,15 @@ set "%1=%_tmp%"
|
|||
|
||||
:ExtractOrFindPath
|
||||
rem Test L_PATH in the following order:
|
||||
rem 1: %cbin%\L_PATH.7z (which will be extracted to %bin%\L_PATH)
|
||||
rem 2: %bin%\L_PATH
|
||||
rem 3. %L_PATH% (i.e. treat L_PATH as an absolute path)
|
||||
rem 1: %cbin%\L_PATH.7z (which will be extracted to %bin%\L_PATH)
|
||||
rem 2: %bin%\L_PATH
|
||||
rem 3. %L_PATH% (i.e. treat L_PATH as an absolute path)
|
||||
rem NOTE: This function should be called as 'call :ExtractOrFindPath || goto ErrorProgramNotFound' to catch invalid paths.
|
||||
set _path=
|
||||
if exist "%cbin%\%L_PATH%.7z" (
|
||||
call :ExtractCBin
|
||||
call :ExtractCBin
|
||||
) else if exist "%cbin%\%L_PATH%\%L_ITEM:~0,-4%.7z" (
|
||||
call :ExtractCBin
|
||||
call :ExtractCBin
|
||||
)
|
||||
if exist "%bin%\%L_PATH%" (set "_path=%bin%\%L_PATH%")
|
||||
if not defined _path (set "_path=%L_PATH%")
|
||||
|
|
@ -437,16 +435,6 @@ echo ERROR: Office version not supported by this script.
|
|||
start "" "explorer.exe" "%client_dir%\Office"
|
||||
goto Abort
|
||||
|
||||
:ErrorPythonUnsupported
|
||||
rem The Windows installation lacks Windows update KB2999226 needed to run Python
|
||||
echo.
|
||||
echo ERROR: Failed to run Python, try installing Windows update KB2999226.
|
||||
echo NOTE: That update is from October 2015 so this system is SEVERELY outdated
|
||||
if exist "%bin%\..\Installers\Extras\Windows Updates" (
|
||||
start "" "explorer.exe" "%bin%\..\Installers\Extras\Windows Updates"
|
||||
)
|
||||
goto Abort
|
||||
|
||||
:ErrorQuickBooksSourceNotFound
|
||||
echo.
|
||||
echo ERROR: QuickBooks source "%L_ITEM%" not found.
|
||||
|
|
@ -477,9 +465,9 @@ goto Abort
|
|||
:Abort
|
||||
rem Handle color theme for both the native console and ConEmu
|
||||
if defined ConEmuBuild (
|
||||
color c4
|
||||
color c4
|
||||
) else (
|
||||
color 4e
|
||||
color 4e
|
||||
)
|
||||
echo Aborted.
|
||||
echo.
|
||||
|
|
@ -498,11 +486,11 @@ echo Press any key to exit...
|
|||
pause>nul
|
||||
rem reset color and reset errorlevel to 0
|
||||
rem NOTE: This is done to avoid causing a ErrorLaunchCMD in the launcher.cmd
|
||||
color 07
|
||||
color
|
||||
goto Exit
|
||||
|
||||
:: Cleanup and exit ::
|
||||
:Exit
|
||||
popd
|
||||
endlocal
|
||||
exit /b %errorlevel%
|
||||
exit /b %errorlevel%
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
:: WizardKit: Launcher Script ::
|
||||
:: Wizard Kit: Launcher Script ::
|
||||
::
|
||||
:: This script works by setting env variables and then calling Launch.cmd
|
||||
:: which inherits the variables. This bypasses batch file argument parsing
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
:Init
|
||||
setlocal EnableDelayedExpansion
|
||||
title WizardKit: Launcher
|
||||
title Wizard Kit: Launcher
|
||||
call :CheckFlags %*
|
||||
call :FindBin
|
||||
call :SetTitle Launcher
|
||||
|
|
@ -17,7 +17,7 @@ call :SetTitle Launcher
|
|||
rem EXTRA_CODE
|
||||
|
||||
:DefineLaunch
|
||||
:: See %bin%\Scripts\Launch.cmd for details under :Usage label
|
||||
:: See %bin%\SCripts\Launch.cmd for details under :Usage label
|
||||
set L_TYPE=
|
||||
set L_PATH=
|
||||
set L_ITEM=
|
||||
|
|
@ -46,7 +46,7 @@ goto Exit
|
|||
rem Loops through all arguments to check for accepted flags
|
||||
set DEBUG=
|
||||
for %%f in (%*) do (
|
||||
if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG")
|
||||
if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG")
|
||||
)
|
||||
@exit /b 0
|
||||
|
||||
|
|
@ -67,12 +67,12 @@ popd
|
|||
@exit /b 0
|
||||
|
||||
:SetTitle
|
||||
rem Sets title using KIT_NAME_FULL from wk\cfg\main.py
|
||||
set "SETTINGS=%bin%\Scripts\wk\cfg\main.py"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_FULL "%SETTINGS%"`) do (
|
||||
set "_v=%%f"
|
||||
set "_v=!_v:*'=!"
|
||||
set "KIT_NAME_FULL=!_v:~0,-1!"
|
||||
rem Sets title using KIT_NAME_FULL from settings\main.py
|
||||
set "SETTINGS=%bin%\Scripts\settings\main.py"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_FULL %SETTINGS%`) do (
|
||||
set "_v=%%f"
|
||||
set "_v=!_v:*'=!"
|
||||
set "KIT_NAME_FULL=!_v:~0,-1!"
|
||||
)
|
||||
set "window_title=%*"
|
||||
if not defined window_title set "window_title=Launcher"
|
||||
|
|
@ -110,4 +110,4 @@ goto Exit
|
|||
:: Cleanup and exit ::
|
||||
:Exit
|
||||
endlocal
|
||||
exit /b %errorlevel%
|
||||
exit /b %errorlevel%
|
||||
62
.bin/Scripts/activate.py
Normal file
62
.bin/Scripts/activate.py
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
# Wizard Kit: Activate Windows using various methods
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.activation import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Windows Activation Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: Windows Activation Tool\n'.format(KIT_NAME_FULL))
|
||||
# Bail early if already activated
|
||||
if windows_is_activated():
|
||||
print_info('This system is already activated')
|
||||
sleep(5)
|
||||
exit_script()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'BIOSKeyNotFoundError': 'BIOS key not found.',
|
||||
}}
|
||||
|
||||
# Determine activation method
|
||||
activation_methods = [
|
||||
{'Name': 'Activate with BIOS key', 'Function': activate_with_bios},
|
||||
]
|
||||
if global_vars['OS']['Version'] not in ['8', '10']:
|
||||
activation_methods[0]['Disabled'] = True
|
||||
actions = [
|
||||
{'Name': 'Quit', 'Letter': 'Q'},
|
||||
]
|
||||
|
||||
while True:
|
||||
selection = menu_select(
|
||||
'{}: Windows Activation Menu'.format(KIT_NAME_FULL),
|
||||
main_entries=activation_methods, action_entries=actions)
|
||||
|
||||
if (selection.isnumeric()):
|
||||
result = try_and_print(
|
||||
message = activation_methods[int(selection)-1]['Name'],
|
||||
function = activation_methods[int(selection)-1]['Function'],
|
||||
other_results=other_results)
|
||||
if result['CS']:
|
||||
break
|
||||
else:
|
||||
sleep(2)
|
||||
elif selection == 'Q':
|
||||
exit_script()
|
||||
|
||||
# Done
|
||||
print_success('\nDone.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,57 +1,57 @@
|
|||
import sys
|
||||
|
||||
# Code borrowed from https://github.com/aeruder/get_win8key
|
||||
|
||||
if sys.platform.startswith('win32'):
|
||||
import ctypes
|
||||
import ctypes.wintypes
|
||||
|
||||
def EnumAcpiTables():
|
||||
#returns a list of the names of the ACPI tables on this system
|
||||
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
|
||||
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
|
||||
BufferSize=ctypes.wintypes.DWORD(0)
|
||||
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724259
|
||||
EnumSystemFirmwareTables=ctypes.WinDLL("Kernel32").EnumSystemFirmwareTables
|
||||
ret=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
|
||||
pFirmwareTableBuffer=None
|
||||
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
|
||||
BufferSize.value=ret
|
||||
ret2=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
|
||||
return [pFirmwareTableBuffer.value[i:i+4] for i in range(0, len(pFirmwareTableBuffer.value), 4)]
|
||||
|
||||
def GetAcpiTable(table):
|
||||
#returns raw contents of ACPI table
|
||||
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724379x
|
||||
tableID = 0
|
||||
for b in reversed(table):
|
||||
tableID = (tableID << 8) + b
|
||||
GetSystemFirmwareTable=ctypes.WinDLL("Kernel32").GetSystemFirmwareTable
|
||||
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
|
||||
FirmwareTableID=ctypes.wintypes.DWORD(int(tableID))
|
||||
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
|
||||
BufferSize=ctypes.wintypes.DWORD(0)
|
||||
ret = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
|
||||
pFirmwareTableBuffer=None
|
||||
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
|
||||
BufferSize.value=ret
|
||||
ret2 = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
|
||||
return pFirmwareTableBuffer.raw
|
||||
elif sys.platform.startswith('linux'):
|
||||
import os
|
||||
TABLE_ROOT = b'/sys/firmware/acpi/tables'
|
||||
def EnumAcpiTables():
|
||||
return os.listdir(TABLE_ROOT)
|
||||
def GetAcpiTable(table):
|
||||
with open(os.path.join(TABLE_ROOT, table), 'rb') as o:
|
||||
return o.read()
|
||||
else:
|
||||
raise NotImplementedError('acpi support only implemented for linux and win32')
|
||||
|
||||
def FindAcpiTable(table):
|
||||
#checks if specific ACPI table exists and returns True/False
|
||||
tables = EnumAcpiTables()
|
||||
if table in tables:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
import sys
|
||||
|
||||
# Code borrowed from https://github.com/aeruder/get_win8key
|
||||
|
||||
if sys.platform.startswith('win32'):
|
||||
import ctypes
|
||||
import ctypes.wintypes
|
||||
|
||||
def EnumAcpiTables():
|
||||
#returns a list of the names of the ACPI tables on this system
|
||||
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
|
||||
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
|
||||
BufferSize=ctypes.wintypes.DWORD(0)
|
||||
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724259
|
||||
EnumSystemFirmwareTables=ctypes.WinDLL("Kernel32").EnumSystemFirmwareTables
|
||||
ret=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
|
||||
pFirmwareTableBuffer=None
|
||||
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
|
||||
BufferSize.value=ret
|
||||
ret2=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
|
||||
return [pFirmwareTableBuffer.value[i:i+4] for i in range(0, len(pFirmwareTableBuffer.value), 4)]
|
||||
|
||||
def GetAcpiTable(table):
|
||||
#returns raw contents of ACPI table
|
||||
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724379x
|
||||
tableID = 0
|
||||
for b in reversed(table):
|
||||
tableID = (tableID << 8) + b
|
||||
GetSystemFirmwareTable=ctypes.WinDLL("Kernel32").GetSystemFirmwareTable
|
||||
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
|
||||
FirmwareTableID=ctypes.wintypes.DWORD(int(tableID))
|
||||
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
|
||||
BufferSize=ctypes.wintypes.DWORD(0)
|
||||
ret = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
|
||||
pFirmwareTableBuffer=None
|
||||
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
|
||||
BufferSize.value=ret
|
||||
ret2 = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
|
||||
return pFirmwareTableBuffer.raw
|
||||
elif sys.platform.startswith('linux'):
|
||||
import os
|
||||
TABLE_ROOT = b'/sys/firmware/acpi/tables'
|
||||
def EnumAcpiTables():
|
||||
return os.listdir(TABLE_ROOT)
|
||||
def GetAcpiTable(table):
|
||||
with open(os.path.join(TABLE_ROOT, table), 'rb') as o:
|
||||
return o.read()
|
||||
else:
|
||||
raise NotImplementedError('acpi support only implemented for linux and win32')
|
||||
|
||||
def FindAcpiTable(table):
|
||||
#checks if specific ACPI table exists and returns True/False
|
||||
tables = EnumAcpiTables()
|
||||
if table in tables:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
21
.bin/Scripts/borrowed/knownpaths-LICENSE.txt
Normal file
21
.bin/Scripts/borrowed/knownpaths-LICENSE.txt
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Michael Kropat
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
164
.bin/Scripts/borrowed/knownpaths.py
Normal file
164
.bin/Scripts/borrowed/knownpaths.py
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
import ctypes, sys
|
||||
from ctypes import windll, wintypes
|
||||
from uuid import UUID
|
||||
|
||||
class GUID(ctypes.Structure): # [1]
|
||||
_fields_ = [
|
||||
("Data1", wintypes.DWORD),
|
||||
("Data2", wintypes.WORD),
|
||||
("Data3", wintypes.WORD),
|
||||
("Data4", wintypes.BYTE * 8)
|
||||
]
|
||||
|
||||
def __init__(self, uuid_):
|
||||
ctypes.Structure.__init__(self)
|
||||
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid_.fields
|
||||
for i in range(2, 8):
|
||||
self.Data4[i] = rest>>(8 - i - 1)*8 & 0xff
|
||||
|
||||
class FOLDERID: # [2]
|
||||
AccountPictures = UUID('{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}')
|
||||
AdminTools = UUID('{724EF170-A42D-4FEF-9F26-B60E846FBA4F}')
|
||||
ApplicationShortcuts = UUID('{A3918781-E5F2-4890-B3D9-A7E54332328C}')
|
||||
CameraRoll = UUID('{AB5FB87B-7CE2-4F83-915D-550846C9537B}')
|
||||
CDBurning = UUID('{9E52AB10-F80D-49DF-ACB8-4330F5687855}')
|
||||
CommonAdminTools = UUID('{D0384E7D-BAC3-4797-8F14-CBA229B392B5}')
|
||||
CommonOEMLinks = UUID('{C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D}')
|
||||
CommonPrograms = UUID('{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}')
|
||||
CommonStartMenu = UUID('{A4115719-D62E-491D-AA7C-E74B8BE3B067}')
|
||||
CommonStartup = UUID('{82A5EA35-D9CD-47C5-9629-E15D2F714E6E}')
|
||||
CommonTemplates = UUID('{B94237E7-57AC-4347-9151-B08C6C32D1F7}')
|
||||
Contacts = UUID('{56784854-C6CB-462b-8169-88E350ACB882}')
|
||||
Cookies = UUID('{2B0F765D-C0E9-4171-908E-08A611B84FF6}')
|
||||
Desktop = UUID('{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}')
|
||||
DeviceMetadataStore = UUID('{5CE4A5E9-E4EB-479D-B89F-130C02886155}')
|
||||
Documents = UUID('{FDD39AD0-238F-46AF-ADB4-6C85480369C7}')
|
||||
DocumentsLibrary = UUID('{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}')
|
||||
Downloads = UUID('{374DE290-123F-4565-9164-39C4925E467B}')
|
||||
Favorites = UUID('{1777F761-68AD-4D8A-87BD-30B759FA33DD}')
|
||||
Fonts = UUID('{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}')
|
||||
GameTasks = UUID('{054FAE61-4DD8-4787-80B6-090220C4B700}')
|
||||
History = UUID('{D9DC8A3B-B784-432E-A781-5A1130A75963}')
|
||||
ImplicitAppShortcuts = UUID('{BCB5256F-79F6-4CEE-B725-DC34E402FD46}')
|
||||
InternetCache = UUID('{352481E8-33BE-4251-BA85-6007CAEDCF9D}')
|
||||
Libraries = UUID('{1B3EA5DC-B587-4786-B4EF-BD1DC332AEAE}')
|
||||
Links = UUID('{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}')
|
||||
LocalAppData = UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}')
|
||||
LocalAppDataLow = UUID('{A520A1A4-1780-4FF6-BD18-167343C5AF16}')
|
||||
LocalizedResourcesDir = UUID('{2A00375E-224C-49DE-B8D1-440DF7EF3DDC}')
|
||||
Music = UUID('{4BD8D571-6D19-48D3-BE97-422220080E43}')
|
||||
MusicLibrary = UUID('{2112AB0A-C86A-4FFE-A368-0DE96E47012E}')
|
||||
NetHood = UUID('{C5ABBF53-E17F-4121-8900-86626FC2C973}')
|
||||
OriginalImages = UUID('{2C36C0AA-5812-4b87-BFD0-4CD0DFB19B39}')
|
||||
PhotoAlbums = UUID('{69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C}')
|
||||
PicturesLibrary = UUID('{A990AE9F-A03B-4E80-94BC-9912D7504104}')
|
||||
Pictures = UUID('{33E28130-4E1E-4676-835A-98395C3BC3BB}')
|
||||
Playlists = UUID('{DE92C1C7-837F-4F69-A3BB-86E631204A23}')
|
||||
PrintHood = UUID('{9274BD8D-CFD1-41C3-B35E-B13F55A758F4}')
|
||||
Profile = UUID('{5E6C858F-0E22-4760-9AFE-EA3317B67173}')
|
||||
ProgramData = UUID('{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}')
|
||||
ProgramFiles = UUID('{905e63b6-c1bf-494e-b29c-65b732d3d21a}')
|
||||
ProgramFilesX64 = UUID('{6D809377-6AF0-444b-8957-A3773F02200E}')
|
||||
ProgramFilesX86 = UUID('{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}')
|
||||
ProgramFilesCommon = UUID('{F7F1ED05-9F6D-47A2-AAAE-29D317C6F066}')
|
||||
ProgramFilesCommonX64 = UUID('{6365D5A7-0F0D-45E5-87F6-0DA56B6A4F7D}')
|
||||
ProgramFilesCommonX86 = UUID('{DE974D24-D9C6-4D3E-BF91-F4455120B917}')
|
||||
Programs = UUID('{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}')
|
||||
Public = UUID('{DFDF76A2-C82A-4D63-906A-5644AC457385}')
|
||||
PublicDesktop = UUID('{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}')
|
||||
PublicDocuments = UUID('{ED4824AF-DCE4-45A8-81E2-FC7965083634}')
|
||||
PublicDownloads = UUID('{3D644C9B-1FB8-4f30-9B45-F670235F79C0}')
|
||||
PublicGameTasks = UUID('{DEBF2536-E1A8-4c59-B6A2-414586476AEA}')
|
||||
PublicLibraries = UUID('{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}')
|
||||
PublicMusic = UUID('{3214FAB5-9757-4298-BB61-92A9DEAA44FF}')
|
||||
PublicPictures = UUID('{B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5}')
|
||||
PublicRingtones = UUID('{E555AB60-153B-4D17-9F04-A5FE99FC15EC}')
|
||||
PublicUserTiles = UUID('{0482af6c-08f1-4c34-8c90-e17ec98b1e17}')
|
||||
PublicVideos = UUID('{2400183A-6185-49FB-A2D8-4A392A602BA3}')
|
||||
QuickLaunch = UUID('{52a4f021-7b75-48a9-9f6b-4b87a210bc8f}')
|
||||
Recent = UUID('{AE50C081-EBD2-438A-8655-8A092E34987A}')
|
||||
RecordedTVLibrary = UUID('{1A6FDBA2-F42D-4358-A798-B74D745926C5}')
|
||||
ResourceDir = UUID('{8AD10C31-2ADB-4296-A8F7-E4701232C972}')
|
||||
Ringtones = UUID('{C870044B-F49E-4126-A9C3-B52A1FF411E8}')
|
||||
RoamingAppData = UUID('{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}')
|
||||
RoamedTileImages = UUID('{AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E}')
|
||||
RoamingTiles = UUID('{00BCFC5A-ED94-4e48-96A1-3F6217F21990}')
|
||||
SampleMusic = UUID('{B250C668-F57D-4EE1-A63C-290EE7D1AA1F}')
|
||||
SamplePictures = UUID('{C4900540-2379-4C75-844B-64E6FAF8716B}')
|
||||
SamplePlaylists = UUID('{15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5}')
|
||||
SampleVideos = UUID('{859EAD94-2E85-48AD-A71A-0969CB56A6CD}')
|
||||
SavedGames = UUID('{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}')
|
||||
SavedSearches = UUID('{7d1d3a04-debb-4115-95cf-2f29da2920da}')
|
||||
Screenshots = UUID('{b7bede81-df94-4682-a7d8-57a52620b86f}')
|
||||
SearchHistory = UUID('{0D4C3DB6-03A3-462F-A0E6-08924C41B5D4}')
|
||||
SearchTemplates = UUID('{7E636BFE-DFA9-4D5E-B456-D7B39851D8A9}')
|
||||
SendTo = UUID('{8983036C-27C0-404B-8F08-102D10DCFD74}')
|
||||
SidebarDefaultParts = UUID('{7B396E54-9EC5-4300-BE0A-2482EBAE1A26}')
|
||||
SidebarParts = UUID('{A75D362E-50FC-4fb7-AC2C-A8BEAA314493}')
|
||||
SkyDrive = UUID('{A52BBA46-E9E1-435f-B3D9-28DAA648C0F6}')
|
||||
SkyDriveCameraRoll = UUID('{767E6811-49CB-4273-87C2-20F355E1085B}')
|
||||
SkyDriveDocuments = UUID('{24D89E24-2F19-4534-9DDE-6A6671FBB8FE}')
|
||||
SkyDrivePictures = UUID('{339719B5-8C47-4894-94C2-D8F77ADD44A6}')
|
||||
StartMenu = UUID('{625B53C3-AB48-4EC1-BA1F-A1EF4146FC19}')
|
||||
Startup = UUID('{B97D20BB-F46A-4C97-BA10-5E3608430854}')
|
||||
System = UUID('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}')
|
||||
SystemX86 = UUID('{D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27}')
|
||||
Templates = UUID('{A63293E8-664E-48DB-A079-DF759E0509F7}')
|
||||
UserPinned = UUID('{9E3995AB-1F9C-4F13-B827-48B24B6C7174}')
|
||||
UserProfiles = UUID('{0762D272-C50A-4BB0-A382-697DCD729B80}')
|
||||
UserProgramFiles = UUID('{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}')
|
||||
UserProgramFilesCommon = UUID('{BCBD3057-CA5C-4622-B42D-BC56DB0AE516}')
|
||||
Videos = UUID('{18989B1D-99B5-455B-841C-AB7C74E4DDFC}')
|
||||
VideosLibrary = UUID('{491E922F-5643-4AF4-A7EB-4E7A138D8174}')
|
||||
Windows = UUID('{F38BF404-1D43-42F2-9305-67DE0B28FC23}')
|
||||
|
||||
class UserHandle: # [3]
|
||||
current = wintypes.HANDLE(0)
|
||||
common = wintypes.HANDLE(-1)
|
||||
|
||||
_CoTaskMemFree = windll.ole32.CoTaskMemFree # [4]
|
||||
_CoTaskMemFree.restype= None
|
||||
_CoTaskMemFree.argtypes = [ctypes.c_void_p]
|
||||
|
||||
_SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath # [5] [3]
|
||||
_SHGetKnownFolderPath.argtypes = [
|
||||
ctypes.POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p)
|
||||
]
|
||||
|
||||
class PathNotFoundException(Exception): pass
|
||||
|
||||
def get_path(folderid, user_handle=UserHandle.common):
|
||||
fid = GUID(folderid)
|
||||
pPath = ctypes.c_wchar_p()
|
||||
S_OK = 0
|
||||
if _SHGetKnownFolderPath(ctypes.byref(fid), 0, user_handle, ctypes.byref(pPath)) != S_OK:
|
||||
raise PathNotFoundException()
|
||||
path = pPath.value
|
||||
_CoTaskMemFree(pPath)
|
||||
return path
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 2 or sys.argv[1] in ['-?', '/?']:
|
||||
print('python knownpaths.py FOLDERID {current|common}')
|
||||
sys.exit(0)
|
||||
|
||||
try:
|
||||
folderid = getattr(FOLDERID, sys.argv[1])
|
||||
except AttributeError:
|
||||
print('Unknown folder id "%s"' % sys.argv[1], file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
if len(sys.argv) == 2:
|
||||
print(get_path(folderid))
|
||||
else:
|
||||
print(get_path(folderid, getattr(UserHandle, sys.argv[2])))
|
||||
except PathNotFoundException:
|
||||
print('Folder not found "%s"' % ' '.join(sys.argv[1:]), file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# [1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
|
||||
# [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx
|
||||
# [3] http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx
|
||||
# [4] http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722.aspx
|
||||
# [5] http://www.themacaque.com/?p=954
|
||||
207
.bin/Scripts/build_kit.ps1
Normal file
207
.bin/Scripts/build_kit.ps1
Normal file
|
|
@ -0,0 +1,207 @@
|
|||
# Wizard Kit: Download kit components
|
||||
|
||||
## Init ##
|
||||
#Requires -Version 3.0
|
||||
if (Test-Path Env:\DEBUG) {
|
||||
Set-PSDebug -Trace 1
|
||||
}
|
||||
$Host.UI.RawUI.WindowTitle = "Wizard Kit: Build Tool"
|
||||
$WD = $(Split-Path $MyInvocation.MyCommand.Path)
|
||||
$Bin = (Get-Item $WD).Parent.FullName
|
||||
$Root = (Get-Item $Bin -Force).Parent.FullName
|
||||
$Temp = "$Bin\tmp"
|
||||
$System32 = "{0}\System32" -f $Env:SystemRoot
|
||||
Push-Location "$WD"
|
||||
$Host.UI.RawUI.BackgroundColor = "black"
|
||||
$Host.UI.RawUI.ForegroundColor = "white"
|
||||
|
||||
|
||||
## Functions ##
|
||||
function Abort {
|
||||
Write-Host -ForegroundColor "Red" "`nAborted."
|
||||
WKPause "Press Enter to exit..."
|
||||
exit
|
||||
}
|
||||
function DownloadFile ($Path, $Name, $Url) {
|
||||
$OutFile = "{0}\{1}" -f $Path, $Name
|
||||
|
||||
Write-Host ("Downloading: $Name")
|
||||
New-Item -Type Directory $Path 2>&1 | Out-Null
|
||||
try {
|
||||
Invoke-WebRequest -Uri $Url -OutFile $OutFile
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to download file." ) -ForegroundColor "Red"
|
||||
$DownloadErrors += 1
|
||||
}
|
||||
}
|
||||
function FindDynamicUrl ($SourcePage, $RegEx) {
|
||||
# Get source page
|
||||
Invoke-Webrequest -Uri $SourcePage -OutFile "tmp_page"
|
||||
|
||||
# Search for real url
|
||||
$Url = Get-Content "tmp_page" | Where-Object {$_ -imatch $RegEx}
|
||||
$Url = $Url -ireplace '.*(a |)href="([^"]+)".*', '$2'
|
||||
$Url = $Url -ireplace ".*(a |)href='([^']+)'.*", '$2'
|
||||
|
||||
# Remove tmp_page
|
||||
Remove-Item "tmp_page"
|
||||
|
||||
$Url | Select-Object -First 1
|
||||
}
|
||||
function WKPause ($Message = "Press Enter to continue... ") {
|
||||
Write-Host $Message -NoNewLine
|
||||
Read-Host
|
||||
}
|
||||
|
||||
## Safety Check ##
|
||||
if ($PSVersionTable.PSVersion.Major -eq 6 -and $PSVersionTable.OS -imatch "Windows 6.1") {
|
||||
Write-Host "`nThis script doesn't support PowerShell 6.0 on Windows 7."
|
||||
Write-Host "Press Enter to exit... " -NoNewLine
|
||||
Abort
|
||||
}
|
||||
|
||||
## PowerShell equivalent of Python's "if __name__ == '__main__'"
|
||||
# Code based on StackOverflow comments
|
||||
# Question: https://stackoverflow.com/q/4693947
|
||||
# Using answer: https://stackoverflow.com/a/5582692
|
||||
# Asked by: https://stackoverflow.com/users/65164/mark-mascolino
|
||||
# Answer by: https://stackoverflow.com/users/696808/bacon-bits
|
||||
if ($MyInvocation.InvocationName -ne ".") {
|
||||
Clear-Host
|
||||
Write-Host "Wizard Kit: Build Tool`n`n`n`n`n"
|
||||
|
||||
## Download ##
|
||||
$DownloadErrors = 0
|
||||
$Path = $Temp
|
||||
|
||||
# 7-Zip
|
||||
DownloadFile -Path $Path -Name "7z-installer.msi" -Url "http://www.7-zip.org/a/7z1701.msi"
|
||||
DownloadFile -Path $Path -Name "7z-extra.7z" -Url "http://www.7-zip.org/a/7z1701-extra.7z"
|
||||
|
||||
# ConEmu
|
||||
$Url = "https://github.com/Maximus5/ConEmu/releases/download/v17.11.09/ConEmuPack.171109.7z"
|
||||
DownloadFile -Path $Path -Name "ConEmuPack.7z" -Url $Url
|
||||
|
||||
# Notepad++
|
||||
$Url = "https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.7z"
|
||||
DownloadFile -Path $Path -Name "npp.7z" -Url $Url
|
||||
|
||||
# Python
|
||||
$Url = "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-win32.zip"
|
||||
DownloadFile -Path $Path -Name "python32.zip" -Url $Url
|
||||
$Url = "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-amd64.zip"
|
||||
DownloadFile -Path $Path -Name "python64.zip" -Url $Url
|
||||
|
||||
# Python: psutil
|
||||
$DownloadPage = "https://pypi.python.org/pypi/psutil"
|
||||
$RegEx = "href=.*-cp36-cp36m-win32.whl"
|
||||
$Url = FindDynamicUrl $DownloadPage $RegEx
|
||||
DownloadFile -Path $Path -Name "psutil32.whl" -Url $Url
|
||||
$RegEx = "href=.*-cp36-cp36m-win_amd64.whl"
|
||||
$Url = FindDynamicUrl $DownloadPage $RegEx
|
||||
DownloadFile -Path $Path -Name "psutil64.whl" -Url $Url
|
||||
|
||||
# Python: requests & dependancies
|
||||
$RegEx = "href=.*.py3-none-any.whl"
|
||||
foreach ($Module in @("chardet", "certifi", "idna", "urllib3", "requests")) {
|
||||
$DownloadPage = "https://pypi.python.org/pypi/$Module"
|
||||
$Name = "$Module.whl"
|
||||
$Url = FindDynamicUrl -SourcePage $DownloadPage -RegEx $RegEx
|
||||
DownloadFile -Path $Path -Name $Name -Url $Url
|
||||
}
|
||||
|
||||
## Bail ##
|
||||
# If errors were encountered during downloads
|
||||
if ($DownloadErrors -gt 0) {
|
||||
Abort
|
||||
}
|
||||
|
||||
## Extract ##
|
||||
# 7-Zip
|
||||
Write-Host "Extracting: 7-Zip"
|
||||
try {
|
||||
$ArgumentList = @("/a", "$Temp\7z-installer.msi", "TARGETDIR=$Temp\7zi", "/qn")
|
||||
Start-Process -FilePath "$System32\msiexec.exe" -ArgumentList $ArgumentList -Wait
|
||||
$SevenZip = "$Temp\7zi\Files\7-Zip\7z.exe"
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\7z-extra.7z", "-o$Bin\7-Zip",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"-x!x64\*.dll", "-x!Far", "-x!*.dll")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Start-Sleep 1
|
||||
Move-Item "$Bin\7-Zip\x64\7za.exe" "$Bin\7-Zip\7za64.exe"
|
||||
Remove-Item "$Bin\7-Zip\x64" -Recurse
|
||||
Remove-Item "$Temp\7z*" -Recurse
|
||||
$SevenZip = "$Bin\7-Zip\7za.exe"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Notepad++
|
||||
Write-Host "Extracting: Notepad++"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\npp.7z", "-o$Bin\NotepadPlusPlus",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\npp.7z"
|
||||
Move-Item "$Bin\NotepadPlusPlus\notepad++.exe" "$Bin\NotepadPlusPlus\notepadplusplus.exe"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# ConEmu
|
||||
Write-Host "Extracting: ConEmu"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\ConEmuPack.7z", "-o$Bin\ConEmu",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\ConEmuPack.7z"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Python
|
||||
foreach ($Arch in @("32", "64")) {
|
||||
Write-Host "Extracting: Python (x$Arch)"
|
||||
$Files = @(
|
||||
"python$Arch.zip",
|
||||
"certifi.whl",
|
||||
"chardet.whl",
|
||||
"idna.whl",
|
||||
"psutil$Arch.whl",
|
||||
"requests.whl",
|
||||
"urllib3.whl"
|
||||
)
|
||||
try {
|
||||
foreach ($File in $Files) {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\$File", "-o$Bin\Python\x$Arch",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
}
|
||||
Remove-Item "$Temp\python*.zip"
|
||||
Remove-Item "$Temp\*.whl"
|
||||
|
||||
## Configure ##
|
||||
Write-Host "Configuring kit"
|
||||
WKPause "Press Enter to open settings..."
|
||||
$Cmd = "$Bin\NotepadPlusPlus\notepadplusplus.exe"
|
||||
Start-Process -FilePath $Cmd -ArgumentList @("$Bin\Scripts\settings\main.py") -Wait
|
||||
Start-Sleep 1
|
||||
|
||||
## Done ##
|
||||
Pop-Location
|
||||
$ArgumentList = @("-run", "$Bin\Python\x32\python.exe", "$Bin\Scripts\update_kit.py", "-new_console:n")
|
||||
Start-Process -FilePath "$Bin\ConEmu\ConEmu.exe" -ArgumentList $ArgumentList -verb RunAs
|
||||
}
|
||||
614
.bin/Scripts/build_pe.ps1
Normal file
614
.bin/Scripts/build_pe.ps1
Normal file
|
|
@ -0,0 +1,614 @@
|
|||
# Wizard Kit: Windows PE Build Tool
|
||||
|
||||
## Init ##
|
||||
#Requires -Version 3.0
|
||||
#Requires -RunAsAdministrator
|
||||
if (Test-Path Env:\DEBUG) {
|
||||
Set-PSDebug -Trace 1
|
||||
}
|
||||
$Host.UI.RawUI.WindowTitle = "Wizard Kit: Windows PE Build Tool"
|
||||
$WD = $(Split-Path $MyInvocation.MyCommand.Path)
|
||||
$Bin = (Get-Item $WD -Force).Parent.FullName
|
||||
$Root = (Get-Item $Bin -Force).Parent.FullName
|
||||
$Build = "$Root\BUILD"
|
||||
$LogDir = "$Build\Logs"
|
||||
$Temp = "$Build\Temp"
|
||||
$Date = Get-Date -UFormat "%Y-%m-%d"
|
||||
$Host.UI.RawUI.BackgroundColor = "Black"
|
||||
$Host.UI.RawUI.ForegroundColor = "White"
|
||||
$HostSystem32 = "{0}\System32" -f $Env:SystemRoot
|
||||
$DISM = "{0}\DISM.exe" -f $Env:DISMRoot
|
||||
|
||||
## Functions ##
|
||||
function Ask-User ($text = "Kotaero") {
|
||||
$text += " [Y/N]"
|
||||
while ($true) {
|
||||
$answer = read-host $text
|
||||
if ($answer -imatch "^(y|yes)$") {
|
||||
$answer = $true
|
||||
break
|
||||
} elseif ($answer -imatch "^(n|no|nope)$") {
|
||||
$answer = $false
|
||||
break
|
||||
}
|
||||
}
|
||||
$answer
|
||||
}
|
||||
function Abort {
|
||||
Write-Host -ForegroundColor "Red" "`nAborted."
|
||||
WKPause "Press Enter to exit... "
|
||||
exit
|
||||
}
|
||||
function MakeClean {
|
||||
$Folders = @(
|
||||
"$Build\Mount",
|
||||
"$Build\PEFiles")
|
||||
$Clean = $false
|
||||
foreach ($f in $Folders) {
|
||||
if (Test-Path $f) {
|
||||
Write-Host -ForegroundColor "Yellow" ("Found: {0}" -f $f)
|
||||
$Clean = $true
|
||||
}
|
||||
}
|
||||
if (($Clean) -and (Ask-User "Delete the above folder(s)?")) {
|
||||
foreach ($f in $Folders) {
|
||||
if (Test-Path $f) {
|
||||
Remove-Item -Path $f -Recurse -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function DownloadFile ($Path, $Name, $Url) {
|
||||
$OutFile = "{0}\{1}" -f $Path, $Name
|
||||
|
||||
Write-Host ("Downloading: $Name")
|
||||
New-Item -Type Directory $Path 2>&1 | Out-Null
|
||||
try {
|
||||
Invoke-WebRequest -Uri $Url -OutFile $OutFile
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to download file." ) -ForegroundColor "Red"
|
||||
$DownloadErrors += 1
|
||||
}
|
||||
}
|
||||
function FindDynamicUrl ($SourcePage, $RegEx) {
|
||||
# Get source page
|
||||
Invoke-Webrequest -Uri $SourcePage -OutFile "tmp_page"
|
||||
|
||||
# Search for real url
|
||||
$Url = Get-Content "tmp_page" | Where-Object {$_ -imatch $RegEx}
|
||||
$Url = $Url -ireplace '.*(a |)href="([^"]+)".*', '$2'
|
||||
$Url = $Url -ireplace ".*(a |)href='([^']+)'.*", '$2'
|
||||
|
||||
# Remove tmp_page
|
||||
Remove-Item "tmp_page"
|
||||
|
||||
$Url | Select-Object -First 1
|
||||
}
|
||||
function WKPause ($Message = "Press Enter to continue... ") {
|
||||
Write-Host $Message -NoNewLine
|
||||
Read-Host
|
||||
}
|
||||
|
||||
## PowerShell equivalent of Python's "if __name__ == '__main__'"
|
||||
# Code based on StackOverflow comments
|
||||
# Question: https://stackoverflow.com/q/4693947
|
||||
# Using answer: https://stackoverflow.com/a/5582692
|
||||
# Asked by: https://stackoverflow.com/users/65164/mark-mascolino
|
||||
# Answer by: https://stackoverflow.com/users/696808/bacon-bits
|
||||
if ($MyInvocation.InvocationName -ne ".") {
|
||||
Clear-Host
|
||||
Write-Host "Wizard Kit: Windows PE Build Tool`n`n`n`n`n"
|
||||
|
||||
## Prep ##
|
||||
try {
|
||||
Import-Module -Name $Env:DISMRoot -ErrorAction "stop"
|
||||
}
|
||||
catch {
|
||||
Write-Host -ForegroundColor "Red" "ERROR: Failed to load DISM CmdLet"
|
||||
Abort
|
||||
}
|
||||
Push-Location "$WD"
|
||||
MakeClean
|
||||
New-Item -Type Directory $Build 2>&1 | Out-Null
|
||||
New-Item -Type Directory $LogDir 2>&1 | Out-Null
|
||||
|
||||
## main.py ##
|
||||
if (!(Test-Path "$Build\main.py") -or (Ask-User "Replace existing main.py?")) {
|
||||
Copy-Item -Path "$Bin\Scripts\settings\main.py" -Destination "$Build\main.py" -Force
|
||||
}
|
||||
WKPause "Press Enter to open settings..."
|
||||
Start-Process "$HostSystem32\notepad.exe" -ArgumentList @("$Build\main.py") -Wait
|
||||
$KitNameFull = (Get-Content "$Build\main.py" | Where-Object {$_ -match 'FULL'}) -replace ".*'(.*)'$", '$1'
|
||||
$KitNameShort = (Get-Content "$Build\main.py" | Where-Object {$_ -match 'SHORT'}) -replace ".*'(.*)'$", '$1'
|
||||
|
||||
if (Ask-User "Update Tools?") {
|
||||
$DownloadErrors = 0
|
||||
|
||||
## Download Tools ##
|
||||
$ToolSources = @(
|
||||
# 7-Zip
|
||||
@("7z-installer.msi", "http://www.7-zip.org/a/7z1701.msi"),
|
||||
@("7z-extra.7z", "http://www.7-zip.org/a/7z1701-extra.7z"),
|
||||
# Blue Screen View
|
||||
@("bluescreenview64.zip", "http://www.nirsoft.net/utils/bluescreenview-x64.zip"),
|
||||
@("bluescreenview32.zip", "http://www.nirsoft.net/utils/bluescreenview.zip"),
|
||||
# ConEmu
|
||||
@("ConEmuPack.7z", "https://github.com/Maximus5/ConEmu/releases/download/v17.11.09/ConEmuPack.171109.7z"),
|
||||
# Fast Copy
|
||||
@("fastcopy64.zip", "http://ftp.vector.co.jp/69/28/2323/FastCopy332_x64.zip"),
|
||||
@("fastcopy32.zip", "http://ftp.vector.co.jp/69/28/2323/FastCopy332.zip"),
|
||||
# HWiNFO
|
||||
@("hwinfo64.zip", "http://app.oldfoss.com:81/download/HWiNFO/hw64_560.zip"),
|
||||
@("hwinfo32.zip", "http://app.oldfoss.com:81/download/HWiNFO/hw32_560.zip"),
|
||||
# Killer Network Drivers
|
||||
@(
|
||||
"killerinf.zip",
|
||||
("http://www.killernetworking.com"+(FindDynamicUrl "http://www.killernetworking.com/driver-downloads/item/killer-drivers-inf" "Download Killer-Ethernet").replace('&', '&'))
|
||||
),
|
||||
# Notepad++
|
||||
@("npp_amd64.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.x64.7z"),
|
||||
@("npp_x86.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.7z"),
|
||||
# NT Password Editor
|
||||
@("ntpwed.zip", "http://cdslow.org.ru/files/ntpwedit/ntpwed07.zip"),
|
||||
# Prime95
|
||||
@("prime95_64.zip", "http://www.mersenne.org/ftp_root/gimps/p95v294b5.win64.zip"),
|
||||
@("prime95_32.zip", "http://www.mersenne.org/ftp_root/gimps/p95v294b5.win32.zip"),
|
||||
# ProduKey
|
||||
@("produkey64.zip", "http://www.nirsoft.net/utils/produkey-x64.zip"),
|
||||
@("produkey32.zip", "http://www.nirsoft.net/utils/produkey.zip"),
|
||||
# Python
|
||||
@("python64.zip", "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-amd64.zip"),
|
||||
@("python32.zip", "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-win32.zip"),
|
||||
# Python: psutil
|
||||
@(
|
||||
"psutil64.whl",
|
||||
(FindDynamicUrl "https://pypi.python.org/pypi/psutil" "href=.*-cp36-cp36m-win_amd64.whl")
|
||||
),
|
||||
@(
|
||||
"psutil32.whl",
|
||||
(FindDynamicUrl "https://pypi.python.org/pypi/psutil" "href=.*-cp36-cp36m-win32.whl")
|
||||
),
|
||||
# Q-Dir
|
||||
@("qdir64.zip", "https://www.softwareok.com/Download/Q-Dir_Portable_x64.zip"),
|
||||
@("qdir32.zip", "https://www.softwareok.com/Download/Q-Dir_Portable.zip"),
|
||||
# TestDisk / PhotoRec
|
||||
@("testdisk64.zip", "https://www.cgsecurity.org/testdisk-7.1-WIP.win64.zip"),
|
||||
@("testdisk32.zip", "https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip"),
|
||||
# wimlib-imagex
|
||||
@("wimlib64.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip"),
|
||||
@("wimlib32.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip")
|
||||
)
|
||||
foreach ($Tool in $ToolSources) {
|
||||
DownloadFile -Path $Temp -Name $Tool[0] -Url $Tool[1]
|
||||
}
|
||||
|
||||
## Bail ##
|
||||
# If errors were encountered during downloads
|
||||
if ($DownloadErrors -gt 0) {
|
||||
Abort
|
||||
}
|
||||
|
||||
## Extract ##
|
||||
# 7-Zip
|
||||
Write-Host "Extracting: 7-Zip"
|
||||
try {
|
||||
$ArgumentList = @("/a", "$Temp\7z-installer.msi", "TARGETDIR=$Temp\7zi", "/qn")
|
||||
Start-Process -FilePath "$HostSystem32\msiexec.exe" -ArgumentList $ArgumentList -Wait
|
||||
$SevenZip = "$Temp\7zi\Files\7-Zip\7z.exe"
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\7z-extra.7z", "-o$Build\bin\amd64\7-Zip",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"x64\7za.exe", "*.txt")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\7z-extra.7z", "-o$Build\bin\x86\7-Zip",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"7za.exe", "*.txt")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\7z*" -Recurse
|
||||
$SevenZip = "$Build\bin\x86\7-Zip\7za.exe"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Blue Screen View
|
||||
Write-Host "Extracting: BlueScreenView"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\bluescreenview64.zip", "-o$Build\bin\amd64\BlueScreenView",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\bluescreenview32.zip", "-o$Build\bin\x86\BlueScreenView",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\bluescreenview*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# ConEmu
|
||||
Write-Host "Extracting: ConEmu"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\ConEmuPack.7z", "-o$Build\bin\amd64\ConEmu",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Build\bin\amd64\ConEmu\ConEmu.exe"
|
||||
Remove-Item "$Build\bin\amd64\ConEmu\ConEmu.map"
|
||||
Move-Item "$Build\bin\amd64\ConEmu\ConEmu64.exe" "$Build\bin\amd64\ConEmu\ConEmu.exe" -Force
|
||||
Move-Item "$Build\bin\amd64\ConEmu\ConEmu64.map" "$Build\bin\amd64\ConEmu\ConEmu.map" -Force
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\ConEmuPack.7z", "-o$Build\bin\x86\ConEmu",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Build\bin\x86\ConEmu\ConEmu64.exe"
|
||||
Remove-Item "$Build\bin\x86\ConEmu\ConEmu64.map"
|
||||
Remove-Item "$Temp\ConEmuPack*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Fast Copy
|
||||
Write-Host "Extracting: FastCopy"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\fastcopy64.zip", "-o$Build\bin\amd64\FastCopy",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"-x!setup.exe", "-x!*.dll")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\fastcopy32.zip", "-o$Build\bin\x86\FastCopy",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"-x!setup.exe", "-x!*.dll")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\fastcopy*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Killer Network Driver
|
||||
Write-Host "Extracting: Killer Network Driver"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\killerinf.zip", "-o$Build\Drivers\amd64\Killer",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"Production\Windows10-x64\Eth\*")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\killerinf.zip", "-o$Build\Drivers\x86\Killer",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"Production\Windows10-x86\Eth\*")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\killerinf*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# HWiNFO
|
||||
Write-Host "Extracting: HWiNFO"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\hwinfo64.zip", "-o$Build\bin\amd64\HWiNFO",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0", "HWiNFO64.exe")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\hwinfo32.zip", "-o$Build\bin\x86\HWiNFO",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0", "HWiNFO32.exe")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\hwinfo*"
|
||||
Move-Item "$Build\bin\amd64\HWiNFO\HWiNFO64.exe" "$Build\bin\amd64\HWiNFO\HWiNFO.exe" -Force
|
||||
Move-Item "$Build\bin\x86\HWiNFO\HWiNFO32.exe" "$Build\bin\x86\HWiNFO\HWiNFO.exe" -Force
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Notepad++
|
||||
Write-Host "Extracting: Notepad++"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\npp_amd64.7z", "-o$Build\bin\amd64\NotepadPlusPlus",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\npp_x86.7z", "-o$Build\bin\x86\NotepadPlusPlus",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\npp*"
|
||||
Move-Item "$Build\bin\amd64\NotepadPlusPlus\notepad++.exe" "$Build\bin\amd64\NotepadPlusPlus\notepadplusplus.exe" -Force
|
||||
Move-Item "$Build\bin\x86\NotepadPlusPlus\notepad++.exe" "$Build\bin\x86\NotepadPlusPlus\notepadplusplus.exe" -Force
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# NT Password Editor
|
||||
Write-Host "Extracting: NT Password Editor"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\ntpwed.zip", ('-o"{0}\bin\amd64\NT Password Editor"' -f $Build),
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"ntpwedit64.exe", "*.txt")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Move-Item "$Build\bin\amd64\NT Password Editor\ntpwedit64.exe" "$Build\bin\amd64\NT Password Editor\ntpwedit.exe" -Force
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\ntpwed.zip", ('-o"{0}\bin\x86\NT Password Editor"' -f $Build),
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"ntpwedit.exe", "*.txt")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\ntpwed*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# PhotoRec / TestDisk
|
||||
Write-Host "Extracting: PhotoRec / TestDisk"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\testdisk64.zip", "-o$Build\bin\amd64\TestDisk",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
# Remove destination since Move-Item -Force can't handle this recursive merge
|
||||
Remove-Item "$Build\bin\amd64\TestDisk" -Recurse -Force 2>&1 | Out-Null
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Move-Item "$Build\bin\amd64\TestDisk\testdisk-7.1-WIP\*" "$Build\bin\amd64\TestDisk" -Force
|
||||
Remove-Item "$Build\bin\amd64\TestDisk\testdisk-7.1-WIP" -Recurse -Force
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\testdisk32.zip", "-o$Build\bin\x86\TestDisk",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
# Remove destination since Move-Item -Force can't handle this recursive merge
|
||||
Remove-Item "$Build\bin\x86\TestDisk" -Recurse -Force 2>&1 | Out-Null
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Move-Item "$Build\bin\x86\TestDisk\testdisk-7.1-WIP\*" "$Build\bin\x86\TestDisk" -Force
|
||||
Remove-Item "$Build\bin\x86\TestDisk\testdisk-7.1-WIP" -Recurse -Force
|
||||
Remove-Item "$Temp\testdisk*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Prime95
|
||||
Write-Host "Extracting: Prime95"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\prime95_64.zip", "-o$Build\bin\amd64\Prime95",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\prime95_32.zip", "-o$Build\bin\x86\Prime95",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\prime95*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# ProduKey
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\produkey64.zip", "-o$Build\bin\amd64\ProduKey",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\produkey32.zip", "-o$Build\bin\x86\ProduKey",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\produkey*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Python (x64)
|
||||
Write-Host "Extracting: Python (x64)"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\python64.zip", "-o$Build\bin\amd64\python",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\psutil64.whl", "-o$Build\bin\amd64\python",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Python (x32)
|
||||
Write-Host "Extracting: Python (x32)"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\python32.zip", "-o$Build\bin\x86\python",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\psutil32.whl", "-o$Build\bin\x86\python",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
Remove-Item "$Temp\python*"
|
||||
Remove-Item "$Temp\*.whl"
|
||||
|
||||
# Q-Dir
|
||||
Write-Host "Extracting: Q-Dir"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\qdir64.zip", "-o$Build\bin\amd64",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\qdir32.zip", "-o$Build\bin\x86",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\qdir*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# wimlib-imagex
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\wimlib64.zip", "-o$Build\bin\amd64\wimlib",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\wimlib32.zip", "-o$Build\bin\x86\wimlib",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\wimlib*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
}
|
||||
|
||||
## Build ##
|
||||
foreach ($Arch in @("amd64", "x86")) {
|
||||
$Drivers = "$Build\Drivers\$Arch"
|
||||
$Mount = "$Build\Mount"
|
||||
$PEFiles = "$Build\PEFiles\$Arch"
|
||||
|
||||
# Copy WinPE files
|
||||
Write-Host "Copying files..."
|
||||
$Cmd = ("{0}\copype.cmd" -f $Env:WinPERoot)
|
||||
Start-Process -FilePath $Cmd -ArgumentList @($Arch, $PEFiles) -NoNewWindow -Wait
|
||||
|
||||
# Remove unwanted items
|
||||
foreach ($SubDir in @("media", "media\Boot", "media\EFI\Microsoft\Boot")) {
|
||||
foreach ($Item in Get-ChildItem "$PEFiles\$SubDir") {
|
||||
if ($Item.Name -inotmatch "^(boot|efi|en-us|sources|fonts|resources|bcd|memtest)") {
|
||||
Remove-Item -Path $Item.FullName -Recurse -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Mount image
|
||||
Write-Host "Mounting image..."
|
||||
New-Item -Path $Mount -ItemType "directory" -Force | Out-Null
|
||||
Mount-WindowsImage -Path $Mount -ImagePath "$PEFiles\media\sources\boot.wim" -Index 1 -LogPath "$LogDir\DISM.log"
|
||||
|
||||
# Add drivers
|
||||
Add-WindowsDriver -Path $Mount -Driver $Drivers -Recurse -LogPath "$LogDir\DISM.log"
|
||||
|
||||
# Add packages
|
||||
Write-Host "Adding packages:"
|
||||
$WinPEPackages = @(
|
||||
"WinPE-EnhancedStorage",
|
||||
"WinPE-FMAPI",
|
||||
"WinPE-WMI",
|
||||
"WinPE-SecureStartup"
|
||||
)
|
||||
foreach ($Package in $WinPEPackages) {
|
||||
$PackagePath = ("{0}\{1}\WinPE_OCs\{2}.cab" -f $Env:WinPERoot, $Arch, $Package)
|
||||
Write-Host " $Package..."
|
||||
Add-WindowsPackage –PackagePath $PackagePath –Path $Mount -LogPath "$LogDir\DISM.log"
|
||||
$LangPackagePath = ("{0}\{1}\WinPE_OCs\en-us\{2}_en-us.cab" -f $Env:WinPERoot, $Arch, $Package)
|
||||
if (Test-Path $LangPackagePath) {
|
||||
Add-WindowsPackage –PackagePath $LangPackagePath –Path $Mount -LogPath "$LogDir\DISM.log"
|
||||
}
|
||||
}
|
||||
|
||||
# Set RamDisk size
|
||||
$ArgumentList = @(
|
||||
('/Image:"{0}"' -f $Mount),
|
||||
"/Set-ScratchSpace:512",
|
||||
('/LogPath:"{0}\DISM.log"' -f $LogDir)
|
||||
)
|
||||
Start-Process -FilePath $DISM -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
|
||||
# Add tools
|
||||
Write-Host "Copying tools..."
|
||||
Copy-Item -Path "$Build\bin\$Arch" -Destination "$Mount\.bin" -Recurse -Force
|
||||
Copy-Item -Path "$Root\.pe_items\_include\*" -Destination "$Mount\.bin" -Recurse -Force
|
||||
if ($Arch -eq "amd64") {
|
||||
$DestIni = "$Mount\.bin\HWiNFO\HWiNFO64.INI"
|
||||
} else {
|
||||
$DestIni = "$Mount\.bin\HWiNFO\HWiNFO32.INI"
|
||||
}
|
||||
Move-Item -Path "$Mount\.bin\HWiNFO\HWiNFO.INI" -Destination $DestIni -Force
|
||||
Copy-Item -Path "$Root\Images\WinPE.jpg" -Destination "$Mount\.bin\ConEmu\ConEmu.jpg" -Recurse -Force
|
||||
Copy-Item -Path "$Bin\Scripts" -Destination "$Mount\.bin\Scripts" -Recurse -Force
|
||||
Copy-Item -Path "$Build\main.py" -Destination "$Mount\.bin\Scripts\settings\main.py" -Force
|
||||
|
||||
# Add System32 items
|
||||
$HostSystem32 = "{0}\System32" -f $Env:SystemRoot
|
||||
Copy-Item -Path "$Root\.pe_items\System32\*" -Destination "$Mount\Windows\System32" -Recurse -Force
|
||||
$ArgumentList = @("/f", "$Mount\Windows\System32\winpe.jpg", "/a")
|
||||
Start-Process -FilePath "$HostSystem32\takeown.exe" -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @("$Mount\Windows\System32\winpe.jpg", "/grant", "Administrators:F")
|
||||
Start-Process -FilePath "$HostSystem32\icacls.exe" -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Copy-Item -Path "$Root\Images\WinPE.jpg" -Destination "$Mount\Windows\System32\winpe.jpg" -Recurse -Force
|
||||
|
||||
# Load registry hives
|
||||
Write-Host "Updating Registry..."
|
||||
$Reg = "$HostSystem32\reg.exe"
|
||||
$ArgumentList = @("load", "HKLM\WinPE-SW", "$Mount\Windows\System32\config\SOFTWARE")
|
||||
Start-Process -FilePath $Reg -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @("load", "HKLM\WinPE-SYS", "$Mount\Windows\System32\config\SYSTEM")
|
||||
Start-Process -FilePath $Reg -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
|
||||
# Add tools to path
|
||||
## .NET code to properly handle REG_EXPAND_SZ values
|
||||
## Credit: https://www.sepago.com/blog/2013/08/22/reading-and-writing-regexpandsz-data-with-powershell
|
||||
## By: Marius Gawenda
|
||||
$Hive = [Microsoft.Win32.Registry]::LocalMachine
|
||||
$RegPath = "WinPE-SYS\ControlSet001\Control\Session Manager\Environment"
|
||||
$RegKey = $Hive.OpenSubKey($RegPath)
|
||||
$CurValue = $RegKey.GetValue(
|
||||
"Path", $false, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
|
||||
$NewValue = "$CurValue;%SystemDrive%\.bin\7-Zip;%SystemDrive%\.bin\python;%SystemDrive%\.bin\wimlib"
|
||||
Set-ItemProperty -Path "HKLM:\$RegPath" -Name "Path" -Value $NewValue -Force | Out-Null
|
||||
$Hive.close()
|
||||
$RegKey.close()
|
||||
|
||||
# Replace Notepad
|
||||
$RegPath = "HKLM:\WinPE-SW\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe"
|
||||
$NewValue = 'cmd /c "%SystemDrive%\.bin\NotepadPlusPlus\npp.cmd"'
|
||||
New-Item -Path $RegPath -Force | Out-Null
|
||||
New-ItemProperty -Path $RegPath -Name "Debugger" -Value $NewValue -Force | Out-Null
|
||||
|
||||
# Run garbage collection to release potential stale handles
|
||||
## Credit: https://jrich523.wordpress.com/2012/03/06/powershell-loading-and-unloading-registry-hives/
|
||||
Start-Sleep -Seconds 2
|
||||
[gc]::collect()
|
||||
|
||||
# Unload registry hives
|
||||
Start-Sleep -Seconds 2
|
||||
Start-Process -FilePath $Reg -ArgumentList @("unload", "HKLM\WinPE-SW") -NoNewWindow -Wait
|
||||
Start-Process -FilePath $Reg -ArgumentList @("unload", "HKLM\WinPE-SYS") -NoNewWindow -Wait
|
||||
|
||||
# Unmount image
|
||||
Write-Host "Dismounting image..."
|
||||
Dismount-WindowsImage -Path $Mount -Save -LogPath "$LogDir\DISM.log"
|
||||
|
||||
# Create ISO
|
||||
New-Item -Type Directory "$Root\OUT_PE" 2>&1 | Out-Null
|
||||
$ArgumentList = @("/iso", $PEFiles, "$Root\OUT_PE\$KitNameShort-WinPE-$Date-$Arch.iso")
|
||||
$Cmd = "{0}\MakeWinPEMedia.cmd" -f $Env:WinPERoot
|
||||
Start-Process -FilePath $Cmd -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
}
|
||||
|
||||
## Cleanup ##
|
||||
Remove-Item -Path "$Build\Mount" -Recurse -Force
|
||||
Remove-Item -Path "$Build\PEFiles" -Recurse -Force
|
||||
|
||||
## Done ##
|
||||
Pop-Location
|
||||
Write-Host "`nDone."
|
||||
WKPause "Press Enter to exit... "
|
||||
}
|
||||
42
.bin/Scripts/cbs_fix.py
Normal file
42
.bin/Scripts/cbs_fix.py
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
# Wizard Kit: Backup CBS Logs and prep CBS temp data for deletion
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.cleanup import *
|
||||
from functions.data import *
|
||||
init_global_vars()
|
||||
os.system('title {}: CBS Cleanup'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\CBS Cleanup.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
# Prep
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
folder_path = r'{}\Backups'.format(KIT_NAME_SHORT)
|
||||
dest = select_destination(folder_path=folder_path,
|
||||
prompt='Which disk are we using for temp data and backup?')
|
||||
|
||||
# Show details
|
||||
print_info('{}: CBS Cleanup Tool\n'.format(KIT_NAME_FULL))
|
||||
show_info('Backup / Temp path:', dest)
|
||||
print_standard('\n')
|
||||
if (not ask('Proceed with CBS cleanup?')):
|
||||
abort()
|
||||
|
||||
# Run Cleanup
|
||||
try_and_print(message='Running cleanup...', function=cleanup_cbs,
|
||||
cs='Done', dest_folder=dest)
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
56
.bin/Scripts/check_disk.py
Normal file
56
.bin/Scripts/check_disk.py
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
# Wizard Kit: Check or repair the %SYSTEMDRIVE% filesystem via CHKDSK
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Check Disk Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\Check Disk.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
options = [
|
||||
{'Name': 'Run CHKDSK scan (read-only)', 'Repair': False},
|
||||
{'Name': 'Schedule CHKDSK scan (offline repair)', 'Repair': True}]
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
selection = menu_select(
|
||||
'{}: Check Disk Menu\n'.format(KIT_NAME_FULL),
|
||||
main_entries=options,
|
||||
action_entries=actions)
|
||||
print_info('{}: Check Disk Menu\n'.format(KIT_NAME_FULL))
|
||||
if selection == 'Q':
|
||||
abort()
|
||||
elif selection.isnumeric():
|
||||
repair = options[int(selection)-1]['Repair']
|
||||
if repair:
|
||||
cs = 'Scheduled'
|
||||
else:
|
||||
cs = 'CS'
|
||||
message = 'CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env'])
|
||||
try_and_print(message=message, function=run_chkdsk,
|
||||
cs=cs, other_results=other_results, repair=repair)
|
||||
else:
|
||||
abort()
|
||||
|
||||
# Done
|
||||
print_success('Done.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
28
.bin/Scripts/compress_bin.cmd
Normal file
28
.bin/Scripts/compress_bin.cmd
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
@echo off
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
pushd "%~dp0"
|
||||
|
||||
rem Prep
|
||||
mkdir _out\_Drivers
|
||||
set "out=%cd%\_out"
|
||||
|
||||
rem _Drivers
|
||||
pushd _Drivers
|
||||
for %%f in (*) do (
|
||||
set "file=%%f"
|
||||
"%programfiles%\7-Zip\7z.exe" a -t7z -mx=9 -myx=9 -ms=on -mhe -pAbracadabra "%out%\_Drivers\!file:~0,-4!.7z" "%%f"
|
||||
)
|
||||
popd
|
||||
|
||||
rem Rest
|
||||
for /d %%d in (*) do (
|
||||
if not "%%d" == "_out" (
|
||||
pushd "%%d"
|
||||
"%programfiles%\7-Zip\7z.exe" a -t7z -mx=9 -myx=9 -ms=on -mhe -pAbracadabra "%out%\%%d.7z" *
|
||||
popd
|
||||
)
|
||||
)
|
||||
|
||||
popd
|
||||
endlocal
|
||||
57
.bin/Scripts/dism.py
Normal file
57
.bin/Scripts/dism.py
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
# Wizard Kit: Check or repair component store health via DISM
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: DISM helper Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\DISM helper tool.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
disabled = bool(global_vars['OS']['Version'] not in ['8', '10'])
|
||||
options = [
|
||||
{'Name': 'Check Health', 'Repair': False, 'Disabled': disabled},
|
||||
{'Name': 'Restore Health', 'Repair': True, 'Disabled': disabled}]
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
selection = menu_select(
|
||||
'{}: DISM Menu\n'.format(KIT_NAME_FULL),
|
||||
main_entries=options,
|
||||
action_entries=actions)
|
||||
print_info('{}: DISM Menu\n'.format(KIT_NAME_FULL))
|
||||
if selection == 'Q':
|
||||
abort()
|
||||
elif selection.isnumeric():
|
||||
repair = options[int(selection)-1]['Repair']
|
||||
if repair:
|
||||
message='DISM RestoreHealth...'
|
||||
else:
|
||||
message='DISM ScanHealth...'
|
||||
try_and_print(message=message, function=run_dism,
|
||||
cs='No corruption', ns='Corruption detected',
|
||||
other_results=other_results, repair=repair)
|
||||
else:
|
||||
abort()
|
||||
|
||||
# Done
|
||||
print_success('Done.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
66
.bin/Scripts/functions/activation.py
Normal file
66
.bin/Scripts/functions/activation.py
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
# Wizard Kit: Functions - Activation
|
||||
|
||||
import subprocess
|
||||
|
||||
from borrowed import acpi
|
||||
from functions.common import *
|
||||
from os import environ
|
||||
|
||||
# Variables
|
||||
SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT'))
|
||||
|
||||
def activate_with_bios():
|
||||
"""Attempt to activate Windows with a key stored in the BIOS."""
|
||||
# Code borrowed from https://github.com/aeruder/get_win8key
|
||||
#####################################################
|
||||
#script to query windows 8.x OEM key from PC firmware
|
||||
#ACPI -> table MSDM -> raw content -> byte offset 56 to end
|
||||
#ck, 03-Jan-2014 (christian@korneck.de)
|
||||
#####################################################
|
||||
bios_key = None
|
||||
table = b"MSDM"
|
||||
if acpi.FindAcpiTable(table) is True:
|
||||
rawtable = acpi.GetAcpiTable(table)
|
||||
#http://msdn.microsoft.com/library/windows/hardware/hh673514
|
||||
#byte offset 36 from beginning \
|
||||
# = Microsoft 'software licensing data structure' \
|
||||
# / 36 + 20 bytes offset from beginning = Win Key
|
||||
bios_key = rawtable[56:len(rawtable)].decode("utf-8")
|
||||
if bios_key is None:
|
||||
raise BIOSKeyNotFoundError
|
||||
|
||||
# Install Key
|
||||
cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key]
|
||||
subprocess.run(cmd, check=False)
|
||||
sleep(5)
|
||||
|
||||
# Attempt activation
|
||||
cmd = ['cscript', '//nologo', SLMGR, '/ato']
|
||||
subprocess.run(cmd, check=False)
|
||||
sleep(5)
|
||||
|
||||
# Check status
|
||||
if not windows_is_activated():
|
||||
raise Exception('Activation Failed')
|
||||
|
||||
def get_activation_string():
|
||||
"""Get activation status, returns str."""
|
||||
act_str = subprocess.run(
|
||||
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
act_str = act_str.stdout.decode()
|
||||
act_str = act_str.splitlines()
|
||||
act_str = act_str[1].strip()
|
||||
return act_str
|
||||
|
||||
def windows_is_activated():
|
||||
"""Check if Windows is activated via slmgr.vbs and return bool."""
|
||||
activation_string = subprocess.run(
|
||||
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
activation_string = activation_string.stdout.decode()
|
||||
|
||||
return bool(activation_string and 'permanent' in activation_string)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
150
.bin/Scripts/functions/backup.py
Normal file
150
.bin/Scripts/functions/backup.py
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
# Wizard Kit: Functions - Backup
|
||||
|
||||
from functions.disk import *
|
||||
|
||||
# Regex
|
||||
REGEX_BAD_PATH_NAMES = re.compile(
|
||||
r'([<>:"/\|\?\*]'
|
||||
r'|^(CON|PRN|AUX|NUL|COM\d*|LPT\d*)$)'
|
||||
r'|^\s+'
|
||||
r'|[\s\.]+$',
|
||||
re.IGNORECASE)
|
||||
|
||||
def backup_partition(disk, par):
|
||||
if par.get('Image Exists', False) or par['Number'] in disk['Bad Partitions']:
|
||||
raise GenericAbort
|
||||
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'capture',
|
||||
'{}:\\'.format(par['Letter']),
|
||||
par['Image Path'],
|
||||
par['Image Name'], # Image name
|
||||
par['Image Name'], # Image description
|
||||
'--compress=none',
|
||||
]
|
||||
dest_dir = re.sub(r'(.*)\\.*$', r'\1', par['Image Path'], re.IGNORECASE)
|
||||
os.makedirs(dest_dir, exist_ok=True)
|
||||
run_program(cmd)
|
||||
|
||||
def fix_path(path):
|
||||
return REGEX_BAD_PATH_NAMES.sub('_', path)
|
||||
|
||||
def prep_disk_for_backup(destination, disk, ticket_number):
|
||||
disk['Clobber Risk'] = []
|
||||
width = len(str(len(disk['Partitions'])))
|
||||
|
||||
# Get partition totals
|
||||
disk['Bad Partitions'] = [par['Number'] for par in disk['Partitions']
|
||||
if is_bad_partition(par)]
|
||||
num_valid_partitions = len(disk['Partitions']) - len(disk['Bad Partitions'])
|
||||
disk['Valid Partitions'] = num_valid_partitions
|
||||
if disk['Valid Partitions'] <= 0:
|
||||
print_error('ERROR: No partitions can be backed up for this disk')
|
||||
raise GenericAbort
|
||||
|
||||
# Prep partitions
|
||||
for par in disk['Partitions']:
|
||||
display = '{size} {fs}'.format(
|
||||
num = par['Number'],
|
||||
width = width,
|
||||
size = par['Size'],
|
||||
fs = par['FileSystem'])
|
||||
|
||||
if par['Number'] in disk['Bad Partitions']:
|
||||
# Set display string using partition description & OS type
|
||||
display = '* {display}\t\t{q}{name}{q}\t{desc} ({os})'.format(
|
||||
display = display,
|
||||
q = '"' if par['Name'] != '' else '',
|
||||
name = par['Name'],
|
||||
desc = par['Description'],
|
||||
os = par['OS'])
|
||||
else:
|
||||
# Update info for WIM capturing
|
||||
par['Image Name'] = par['Name'] if par['Name'] else 'Unknown'
|
||||
if 'IP' in destination:
|
||||
par['Image Path'] = r'\\{}\{}\{}'.format(
|
||||
destination['IP'], destination['Share'], ticket_number)
|
||||
else:
|
||||
par['Image Path'] = r'{}:\{}'.format(
|
||||
ticket_number, destination['Letter'])
|
||||
par['Image Path'] += r'\{}_{}.wim'.format(
|
||||
par['Number'], par['Image Name'])
|
||||
par['Image Path'] = fix_path(par['Image Path'])
|
||||
|
||||
# Check for existing backups
|
||||
par['Image Exists'] = os.path.exists(par['Image Path'])
|
||||
if par['Image Exists']:
|
||||
disk['Clobber Risk'].append(par['Number'])
|
||||
display = '+ {}'.format(display)
|
||||
else:
|
||||
display = ' {}'.format(display)
|
||||
|
||||
# Append rest of Display String for valid/clobber partitions
|
||||
display += ' (Used: {used})\t{q}{name}{q}'.format(
|
||||
used = par['Used Space'],
|
||||
q = '"' if par['Name'] != '' else '',
|
||||
name = par['Name'])
|
||||
# For all partitions
|
||||
par['Display String'] = display
|
||||
|
||||
# Set description for bad partitions
|
||||
warnings = '\n'
|
||||
if disk['Bad Partitions']:
|
||||
warnings += '{} * Unsupported filesystem{}\n'.format(
|
||||
COLORS['YELLOW'], COLORS['CLEAR'])
|
||||
if disk['Clobber Risk']:
|
||||
warnings += '{} + Backup exists on {}{}\n'.format(
|
||||
COLORS['BLUE'], destination['Name'], COLORS['CLEAR'])
|
||||
if disk['Bad Partitions'] or disk['Clobber Risk']:
|
||||
warnings += '\n{}Marked partition(s) will NOT be backed up.{}\n'.format(
|
||||
COLORS['YELLOW'], COLORS['CLEAR'])
|
||||
disk['Backup Warnings'] = warnings
|
||||
|
||||
def select_backup_destination(auto_select=True):
|
||||
# Build menu
|
||||
destinations = [s for s in BACKUP_SERVERS if s['Mounted']]
|
||||
actions = [
|
||||
{'Name': 'Main Menu', 'Letter': 'M'},
|
||||
]
|
||||
|
||||
# Size check
|
||||
for dest in destinations:
|
||||
if 'IP' in dest:
|
||||
dest['Usage'] = shutil.disk_usage(r'\\{IP}\{Share}'.format(**dest))
|
||||
else:
|
||||
dest['Usage'] = shutil.disk_usage('{}:\\'.format(dest['Letter']))
|
||||
dest['Free Space'] = human_readable_size(dest['Usage'].free)
|
||||
dest['Display Name'] = '{Name} ({Free Space} available)'.format(**dest)
|
||||
|
||||
# Bail
|
||||
if not destinations:
|
||||
print_warning('No backup destinations found.')
|
||||
raise GenericAbort
|
||||
|
||||
# Skip menu?
|
||||
if len(destinations) == 1 and auto_select:
|
||||
return destinations[0]
|
||||
|
||||
selection = menu_select(
|
||||
title = 'Where are we backing up to?',
|
||||
main_entries = destinations,
|
||||
action_entries = actions)
|
||||
if selection == 'M':
|
||||
raise GenericAbort
|
||||
else:
|
||||
return destinations[int(selection)-1]
|
||||
|
||||
def verify_wim_backup(partition):
|
||||
if not os.path.exists(partition['Image Path']):
|
||||
raise PathNotFoundError
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'verify',
|
||||
partition['Image Path'],
|
||||
'--nocheck',
|
||||
]
|
||||
run_program(cmd)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
446
.bin/Scripts/functions/browsers.py
Normal file
446
.bin/Scripts/functions/browsers.py
Normal file
|
|
@ -0,0 +1,446 @@
|
|||
# Wizard Kit: Functions - Browsers
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# Define other_results for later try_and_print
|
||||
browser_data = {}
|
||||
other_results = {
|
||||
'Error': {
|
||||
'MultipleInstallationsError': 'Multiple installations detected',
|
||||
},
|
||||
'Warning': {
|
||||
'NotInstalledError': 'Not installed',
|
||||
'NoProfilesError': 'No profiles found',
|
||||
}
|
||||
}
|
||||
|
||||
# Regex
|
||||
REGEX_BACKUP = re.compile(
|
||||
r'\.\w*bak.*',
|
||||
re.IGNORECASE)
|
||||
REGEX_CHROMIUM_PROFILE = re.compile(
|
||||
r'^(Default|Profile)',
|
||||
re.IGNORECASE)
|
||||
REGEX_CHROMIUM_ITEMS = re.compile(
|
||||
r'^(Bookmarks|Cookies|Favicons|Google Profile'
|
||||
r'|History|Login Data|Top Sites|TransportSecurity'
|
||||
r'|Visited Links|Web Data)',
|
||||
re.IGNORECASE)
|
||||
REGEX_MOZILLA = re.compile(
|
||||
r'^(bookmarkbackups|(cookies|formhistory|places).sqlite'
|
||||
r'|key3.db|logins.json|persdict.dat)$',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
DEFAULT_HOMEPAGE = 'https://www.google.com/'
|
||||
IE_GALLERY = 'https://www.microsoft.com/en-us/iegallery'
|
||||
MOZILLA_PREFS = {
|
||||
'browser.search.defaultenginename': '"Google"',
|
||||
'browser.search.defaultenginename.US': '"Google"',
|
||||
'browser.search.geoSpecificDefaults': 'false',
|
||||
'browser.startup.homepage': '"{}"'.format(DEFAULT_HOMEPAGE),
|
||||
'extensions.ui.lastCategory': '"addons://list/extension"',
|
||||
}
|
||||
UBO_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en'
|
||||
UBO_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm'
|
||||
UBO_EXTRA_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin-extra/pgdnlhfefecpicbbihgmbmffkjpaplco?hl=en'
|
||||
UBO_EXTRA_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco'
|
||||
UBO_MOZILLA = 'https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/'
|
||||
UBO_OPERA = 'https://addons.opera.com/en/extensions/details/ublock/?display=en'
|
||||
SUPPORTED_BROWSERS = {
|
||||
'Internet Explorer': {
|
||||
'base': 'ie',
|
||||
'exe_name': 'iexplore.exe',
|
||||
'rel_install_path': 'Internet Explorer',
|
||||
'user_data_path': r'{USERPROFILE}\Favorites',
|
||||
},
|
||||
'Google Chrome': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'chrome.exe',
|
||||
'rel_install_path': r'Google\Chrome\Application',
|
||||
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome\User Data',
|
||||
},
|
||||
'Google Chrome Canary': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'chrome.exe',
|
||||
'rel_install_path': r'Google\Chrome SxS\Application',
|
||||
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome SxS\User Data',
|
||||
},
|
||||
'Mozilla Firefox': {
|
||||
'base': 'mozilla',
|
||||
'exe_name': 'firefox.exe',
|
||||
'rel_install_path': 'Mozilla Firefox',
|
||||
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
||||
},
|
||||
'Mozilla Firefox Dev': {
|
||||
'base': 'mozilla',
|
||||
'exe_name': 'firefox.exe',
|
||||
'rel_install_path': 'Firefox Developer Edition',
|
||||
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
||||
},
|
||||
'Opera': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'launcher.exe',
|
||||
'rel_install_path': 'Opera',
|
||||
'user_data_path': r'{APPDATA}\Opera Software\Opera Stable',
|
||||
},
|
||||
'Opera Beta': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'launcher.exe',
|
||||
'rel_install_path': 'Opera beta',
|
||||
'user_data_path': r'{APPDATA}\Opera Software\Opera Next',
|
||||
},
|
||||
'Opera Dev': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'launcher.exe',
|
||||
'rel_install_path': 'Opera developer',
|
||||
'user_data_path': r'{APPDATA}\Opera Software\Opera Developer',
|
||||
},
|
||||
}
|
||||
|
||||
def archive_browser(name):
|
||||
"""Create backup of Browser saved in the BackupDir."""
|
||||
source = '{}*'.format(browser_data[name]['user_data_path'])
|
||||
dest = r'{BackupDir}\Browsers ({USERNAME})'.format(
|
||||
**global_vars, **global_vars['Env'])
|
||||
archive = r'{}\{}.7z'.format(dest, name)
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', '-aoa', '-bso0', '-bse0', '-mx=1',
|
||||
archive, source]
|
||||
run_program(cmd)
|
||||
|
||||
def backup_browsers():
|
||||
"""Create backup of all detected browser profiles."""
|
||||
for name in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
||||
try_and_print(message='{}...'.format(name),
|
||||
function=archive_browser, name=name)
|
||||
|
||||
def clean_chromium_profile(profile):
|
||||
"""Renames profile, creates a new folder, and copies the user data to it."""
|
||||
if profile is None:
|
||||
raise Exception
|
||||
backup_path = '{path}_{Date}.bak'.format(
|
||||
path=profile['path'], **global_vars)
|
||||
backup_path = non_clobber_rename(backup_path)
|
||||
shutil.move(profile['path'], backup_path)
|
||||
os.makedirs(profile['path'], exist_ok=True)
|
||||
|
||||
# Restore essential files from backup_path
|
||||
for entry in os.scandir(backup_path):
|
||||
if REGEX_CHROMIUM_ITEMS.search(entry.name):
|
||||
shutil.copy(entry.path, r'{}\{}'.format(
|
||||
profile['path'], entry.name))
|
||||
|
||||
def clean_internet_explorer(**kwargs):
|
||||
"""Uses the built-in function to reset IE and sets the homepage.
|
||||
|
||||
NOTE: kwargs set but unused as a workaround."""
|
||||
kill_process('iexplore.exe')
|
||||
run_program(['rundll32.exe', 'inetcpl.cpl,ResetIEtoDefaults'], check=False)
|
||||
key = r'Software\Microsoft\Internet Explorer\Main'
|
||||
|
||||
# Set homepage
|
||||
with winreg.OpenKey(HKCU, key, access=winreg.KEY_WRITE) as _key:
|
||||
winreg.SetValueEx(_key, 'Start Page', 0,
|
||||
winreg.REG_SZ, DEFAULT_HOMEPAGE)
|
||||
try:
|
||||
winreg.DeleteValue(_key, 'Secondary Start Pages')
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
def clean_mozilla_profile(profile):
|
||||
"""Renames profile, creates a new folder, and copies the user data to it."""
|
||||
if profile is None:
|
||||
raise Exception
|
||||
backup_path = '{path}_{Date}.bak'.format(
|
||||
path=profile['path'], **global_vars)
|
||||
backup_path = non_clobber_rename(backup_path)
|
||||
shutil.move(profile['path'], backup_path)
|
||||
homepages = []
|
||||
os.makedirs(profile['path'], exist_ok=True)
|
||||
|
||||
# Restore essential files from backup_path
|
||||
for entry in os.scandir(backup_path):
|
||||
if REGEX_MOZILLA.search(entry.name):
|
||||
if entry.is_dir():
|
||||
shutil.copytree(entry.path, r'{}\{}'.format(
|
||||
profile['path'], entry.name))
|
||||
else:
|
||||
shutil.copy(entry.path, r'{}\{}'.format(
|
||||
profile['path'], entry.name))
|
||||
|
||||
# Set profile defaults
|
||||
with open(r'{path}\prefs.js'.format(**profile), 'a', encoding='ascii') as f:
|
||||
for k, v in MOZILLA_PREFS.items():
|
||||
f.write('user_pref("{}", {});\n'.format(k, v))
|
||||
|
||||
def get_browser_details(name):
|
||||
"""Get installation status and profile details for all supported browsers."""
|
||||
browser = SUPPORTED_BROWSERS[name].copy()
|
||||
|
||||
# Update user_data_path
|
||||
browser['user_data_path'] = browser['user_data_path'].format(
|
||||
**global_vars['Env'])
|
||||
|
||||
# Find executable (if multiple files are found, the last one is used)
|
||||
exe_path = None
|
||||
num_installs = 0
|
||||
for install_path in ['LOCALAPPDATA', 'PROGRAMFILES(X86)', 'PROGRAMFILES']:
|
||||
test_path = r'{install_path}\{rel_install_path}\{exe_name}'.format(
|
||||
install_path = global_vars['Env'].get(install_path, ''),
|
||||
**browser)
|
||||
if os.path.exists(test_path):
|
||||
num_installs += 1
|
||||
exe_path = test_path
|
||||
|
||||
# Find profile(s)
|
||||
profiles = []
|
||||
if browser['base'] == 'ie':
|
||||
profiles.append({'name': 'Default', 'path': None})
|
||||
elif 'Google Chrome' in name:
|
||||
profiles.extend(
|
||||
get_chromium_profiles(
|
||||
search_path=browser['user_data_path']))
|
||||
elif browser['base'] == 'mozilla':
|
||||
dev = 'Dev' in name
|
||||
profiles.extend(
|
||||
get_mozilla_profiles(
|
||||
search_path=browser['user_data_path'], dev=dev))
|
||||
if exe_path and not dev and len(profiles) == 0:
|
||||
# e.g. If Firefox is installed but no profiles were found.
|
||||
## Rename profiles.ini and create a new default profile
|
||||
profiles_ini_path = browser['user_data_path'].replace(
|
||||
'Profiles', 'profiles.ini')
|
||||
if os.path.exists(profiles_ini_path):
|
||||
backup_path = '{path}_{Date}.bak'.format(
|
||||
path=profiles_ini_path, **global_vars)
|
||||
backup_path = non_clobber_rename(backup_path)
|
||||
shutil.move(profiles_ini_path, backup_path)
|
||||
run_program([exe_path, '-createprofile', 'default'], check=False)
|
||||
profiles.extend(
|
||||
get_mozilla_profiles(
|
||||
search_path=browser['user_data_path'], dev=dev))
|
||||
|
||||
elif 'Opera' in name:
|
||||
if os.path.exists(browser['user_data_path']):
|
||||
profiles.append(
|
||||
{'name': 'Default', 'path': browser['user_data_path']})
|
||||
|
||||
# Get homepages
|
||||
if browser['base'] == 'ie':
|
||||
# IE is set to only have one profile above
|
||||
profiles[0]['homepages'] = get_ie_homepages()
|
||||
elif browser['base'] == 'mozilla':
|
||||
for profile in profiles:
|
||||
prefs_path = r'{path}\prefs.js'.format(**profile)
|
||||
profile['homepages'] = get_mozilla_homepages(prefs_path=prefs_path)
|
||||
|
||||
# Add to browser_data
|
||||
browser_data[name] = browser
|
||||
browser_data[name].update({
|
||||
'exe_path': exe_path,
|
||||
'profiles': profiles,
|
||||
})
|
||||
|
||||
# Raise installation warnings (if any)
|
||||
if num_installs == 0:
|
||||
raise NotInstalledError
|
||||
elif num_installs > 1 and browser['base'] != 'ie':
|
||||
raise MultipleInstallationsError
|
||||
|
||||
def get_chromium_profiles(search_path):
|
||||
"""Find any chromium-style profiles and return as a list of dicts."""
|
||||
profiles = []
|
||||
try:
|
||||
for entry in os.scandir(search_path):
|
||||
if entry.is_dir() and REGEX_CHROMIUM_PROFILE.search(entry.name):
|
||||
profiles.append(entry)
|
||||
REGEX_PROFILE_BACKUP = r'\.\w+bak.*'
|
||||
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
|
||||
# Convert os.DirEntries to dicts
|
||||
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return profiles
|
||||
|
||||
def get_ie_homepages():
|
||||
"""Read homepages from the registry and return as a list."""
|
||||
homepages = []
|
||||
main_page = ''
|
||||
extra_pages = []
|
||||
key = r'Software\Microsoft\Internet Explorer\Main'
|
||||
with winreg.OpenKey(HKCU, key) as _key:
|
||||
try:
|
||||
main_page = winreg.QueryValueEx(_key, 'Start Page')[0]
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
try:
|
||||
extra_pages = winreg.QueryValueEx(_key, 'Secondary Start Pages')[0]
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
if main_page != '':
|
||||
homepages.append(main_page)
|
||||
if len(extra_pages) > 0:
|
||||
homepages.extend(extra_pages)
|
||||
return homepages
|
||||
|
||||
def get_mozilla_homepages(prefs_path):
|
||||
"""Read homepages from prefs.js and return as a list."""
|
||||
homepages = []
|
||||
try:
|
||||
with open(prefs_path, 'r') as f:
|
||||
search = re.search(
|
||||
r'browser\.startup\.homepage", "([^"]*)"',
|
||||
f.read(), re.IGNORECASE)
|
||||
if search:
|
||||
homepages = search.group(1).split('|')
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return homepages
|
||||
|
||||
def get_mozilla_profiles(search_path, dev=False):
|
||||
"""Find any mozilla-style profiles and return as a list of dicts."""
|
||||
profiles = []
|
||||
try:
|
||||
for entry in os.scandir(search_path):
|
||||
if entry.is_dir():
|
||||
if 'dev-edition' in entry.name:
|
||||
# NOTE: Not always present which can lead
|
||||
# to Dev profiles being marked as non-Dev
|
||||
## NOTE 2: It is possible that a non-Dev profile
|
||||
## to be created with 'dev-edition' in the name.
|
||||
## (It wouldn't make sense, but possible)
|
||||
if dev:
|
||||
profiles.append(entry)
|
||||
elif not dev:
|
||||
profiles.append(entry)
|
||||
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
|
||||
# Convert os.DirEntries to dicts
|
||||
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return profiles
|
||||
|
||||
def install_adblock(indent=8, width=32):
|
||||
"""Install adblock for all supported browsers."""
|
||||
for browser in sorted(browser_data):
|
||||
exe_path = browser_data[browser].get('exe_path', None)
|
||||
function=run_program
|
||||
if not exe_path:
|
||||
if browser_data[browser]['profiles']:
|
||||
print_standard(
|
||||
'{indent}{browser:<{width}}'.format(
|
||||
indent=' '*indent, width=width, browser=browser+'...'),
|
||||
end='', flush=True)
|
||||
print_warning('Profile(s) detected but browser not installed',
|
||||
timestamp=False)
|
||||
else:
|
||||
# Only warn if profile(s) are detected.
|
||||
pass
|
||||
else:
|
||||
# Set urls to open
|
||||
urls = []
|
||||
if browser_data[browser]['base'] == 'chromium':
|
||||
if browser == 'Google Chrome':
|
||||
# Check for system exensions
|
||||
try:
|
||||
winreg.QueryValue(HKLM, UBO_CHROME_REG)
|
||||
except FileNotFoundError:
|
||||
urls.append(UBO_CHROME)
|
||||
try:
|
||||
winreg.QueryValue(HKLM, UBO_EXTRA_CHROME_REG)
|
||||
except FileNotFoundError:
|
||||
urls.append(UBO_EXTRA_CHROME)
|
||||
|
||||
if len(urls) == 0:
|
||||
urls = ['chrome://extensions']
|
||||
elif 'Opera' in browser:
|
||||
urls.append(UBO_OPERA)
|
||||
else:
|
||||
urls.append(UBO_CHROME)
|
||||
urls.append(UBO_EXTRA_CHROME)
|
||||
|
||||
elif browser_data[browser]['base'] == 'mozilla':
|
||||
# Assume UBO is not installed first and change if it is
|
||||
urls.append(UBO_MOZILLA)
|
||||
if browser == 'Mozilla Firefox':
|
||||
ubo = browser_data[browser]['exe_path'].replace(
|
||||
'firefox.exe',
|
||||
r'distribution\extensions\uBlock0@raymondhill.net')
|
||||
if os.path.exists(ubo):
|
||||
urls = ['about:addons']
|
||||
|
||||
elif browser_data[browser]['base'] == 'ie':
|
||||
urls.append(IE_GALLERY)
|
||||
function=popen_program
|
||||
|
||||
# By using check=False we're skipping any return codes so
|
||||
# it should only fail if the program can't be run
|
||||
# (or can't be found).
|
||||
# In other words, this isn't tracking the addon/extension's
|
||||
# installation status.
|
||||
try_and_print(message='{}...'.format(browser),
|
||||
indent=indent, width=width,
|
||||
cs='Done', function=function,
|
||||
cmd=[exe_path, *urls], check=False)
|
||||
|
||||
def list_homepages(indent=8, width=32):
|
||||
"""List current homepages for reference."""
|
||||
|
||||
for browser in [k for k, v in sorted(browser_data.items()) if v['exe_path']]:
|
||||
# Skip Chromium-based browsers
|
||||
if browser_data[browser]['base'] == 'chromium':
|
||||
print_info(
|
||||
'{indent}{browser:<{width}}'.format(
|
||||
indent=' '*indent, width=width, browser=browser+'...'),
|
||||
end='', flush=True)
|
||||
print_warning('Not implemented', timestamp=False)
|
||||
continue
|
||||
|
||||
# All other browsers
|
||||
print_info('{indent}{browser:<{width}}'.format(
|
||||
indent=' '*indent, width=width, browser=browser+'...'))
|
||||
for profile in browser_data[browser].get('profiles', []):
|
||||
name = profile.get('name', '?')
|
||||
homepages = profile.get('homepages', [])
|
||||
if len(homepages) == 0:
|
||||
print_standard(
|
||||
'{indent}{name:<{width}}'.format(
|
||||
indent=' '*indent, width=width, name=name),
|
||||
end='', flush=True)
|
||||
print_warning('None found', timestamp=False)
|
||||
else:
|
||||
for page in homepages:
|
||||
print_standard('{indent}{name:<{width}}{page}'.format(
|
||||
indent=' '*indent, width=width, name=name, page=page))
|
||||
|
||||
def reset_browsers(indent=8, width=32):
|
||||
"""Reset all detected browsers to safe defaults."""
|
||||
for browser in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
||||
print_info('{indent}{name}'.format(indent=' '*indent, name=browser))
|
||||
for profile in browser_data[browser]['profiles']:
|
||||
if browser_data[browser]['base'] == 'chromium':
|
||||
function = clean_chromium_profile
|
||||
elif browser_data[browser]['base'] == 'ie':
|
||||
function = clean_internet_explorer
|
||||
elif browser_data[browser]['base'] == 'mozilla':
|
||||
function = clean_mozilla_profile
|
||||
try_and_print(
|
||||
message='{}...'.format(profile['name']),
|
||||
indent=indent, width=width, function=function,
|
||||
other_results=other_results, profile=profile)
|
||||
|
||||
def scan_for_browsers():
|
||||
"""Scan system for any supported browsers."""
|
||||
for name in sorted(SUPPORTED_BROWSERS):
|
||||
try_and_print(message='{}...'.format(name),
|
||||
function=get_browser_details, cs='Detected',
|
||||
other_results=other_results, name=name)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
91
.bin/Scripts/functions/cleanup.py
Normal file
91
.bin/Scripts/functions/cleanup.py
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
# Wizard Kit: Functions - Cleanup
|
||||
|
||||
from functions.common import *
|
||||
|
||||
def cleanup_adwcleaner():
|
||||
"""Move AdwCleaner folders into the ClientDir."""
|
||||
source_path = r'{SYSTEMDRIVE}\AdwCleaner'.format(**global_vars['Env'])
|
||||
source_quarantine = r'{}\Quarantine'.format(source_path)
|
||||
|
||||
# Quarantine
|
||||
if os.path.exists(source_quarantine):
|
||||
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
|
||||
dest_name = r'{QuarantineDir}\AdwCleaner_{Date-Time}'.format(
|
||||
**global_vars)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(source_quarantine, dest_name)
|
||||
|
||||
# Delete source folder if empty
|
||||
try:
|
||||
os.rmdir(source_path)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
# Main folder
|
||||
if os.path.exists(source_path):
|
||||
os.makedirs(global_vars['ProgBackupDir'], exist_ok=True)
|
||||
dest_name = r'{ProgBackupDir}\AdwCleaner_{Date-Time}'.format(
|
||||
**global_vars)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(source_path, dest_name)
|
||||
|
||||
def cleanup_cbs(dest_folder):
|
||||
"""Safely cleanup a known CBS archive bug under Windows 7.
|
||||
|
||||
If a CbsPersist file is larger than 2 Gb then the auto archive feature
|
||||
continually fails and will fill up the system drive with temp files.
|
||||
|
||||
This function moves the temp files and CbsPersist file to a temp folder,
|
||||
compresses the CbsPersist files with 7-Zip, and then opens the temp folder
|
||||
for the user to manually save the backup files and delete the temp files.
|
||||
"""
|
||||
backup_folder = r'{dest_folder}\CbsFix'.format(dest_folder=dest_folder)
|
||||
temp_folder = r'{backup_folder}\Temp'.format(backup_folder=backup_folder)
|
||||
os.makedirs(backup_folder, exist_ok=True)
|
||||
os.makedirs(temp_folder, exist_ok=True)
|
||||
|
||||
# Move files into temp folder
|
||||
cbs_path = r'{SYSTEMROOT}\Logs\CBS'.format(**global_vars['Env'])
|
||||
for entry in os.scandir(cbs_path):
|
||||
# CbsPersist files
|
||||
if entry.name.lower().startswith('cbspersist'):
|
||||
dest_name = r'{}\{}'.format(temp_folder, entry.name)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(entry.path, dest_name)
|
||||
temp_path = r'{SYSTEMROOT}\Temp'.format(**global_vars['Env'])
|
||||
for entry in os.scandir(temp_path):
|
||||
# cab_ files
|
||||
if entry.name.lower().startswith('cab_'):
|
||||
dest_name = r'{}\{}'.format(temp_folder, entry.name)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(entry.path, dest_name)
|
||||
|
||||
# Compress CbsPersist files with 7-Zip
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', '-t7z', '-mx=3', '-bso0', '-bse0',
|
||||
r'{}\CbsPersists.7z'.format(backup_folder),
|
||||
r'{}\CbsPersist*'.format(temp_folder)]
|
||||
run_program(cmd)
|
||||
|
||||
def cleanup_desktop():
|
||||
"""Move known backup files and reports into the ClientDir."""
|
||||
dest_folder = r'{ProgBackupDir}\Desktop_{Date-Time}'.format(**global_vars)
|
||||
os.makedirs(dest_folder, exist_ok=True)
|
||||
|
||||
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
||||
for entry in os.scandir(desktop_path):
|
||||
# JRT, RKill, Shortcut cleaner
|
||||
if re.search(r'^(JRT|RKill|sc-cleaner)', entry.name, re.IGNORECASE):
|
||||
dest_name = r'{}\{}'.format(dest_folder, entry.name)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(entry.path, dest_name)
|
||||
|
||||
# Remove dir if empty
|
||||
try:
|
||||
os.rmdir(dest_folder)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
716
.bin/Scripts/functions/common.py
Normal file
716
.bin/Scripts/functions/common.py
Normal file
|
|
@ -0,0 +1,716 @@
|
|||
# Wizard Kit: Functions - Common
|
||||
|
||||
import os
|
||||
import psutil
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
import traceback
|
||||
import winreg
|
||||
|
||||
from subprocess import CalledProcessError
|
||||
|
||||
from settings.main import *
|
||||
from settings.tools import *
|
||||
|
||||
# Global variables
|
||||
global_vars = {}
|
||||
|
||||
# STATIC VARIABLES
|
||||
COLORS = {
|
||||
'CLEAR': '\033[0m',
|
||||
'RED': '\033[31m',
|
||||
'GREEN': '\033[32m',
|
||||
'YELLOW': '\033[33m',
|
||||
'BLUE': '\033[34m'
|
||||
}
|
||||
HKU = winreg.HKEY_USERS
|
||||
HKCU = winreg.HKEY_CURRENT_USER
|
||||
HKLM = winreg.HKEY_LOCAL_MACHINE
|
||||
|
||||
# Error Classes
|
||||
class BIOSKeyNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
class BinNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
class GenericAbort(Exception):
|
||||
pass
|
||||
|
||||
class GenericError(Exception):
|
||||
pass
|
||||
|
||||
class GenericRepair(Exception):
|
||||
pass
|
||||
|
||||
class MultipleInstallationsError(Exception):
|
||||
pass
|
||||
|
||||
class NotInstalledError(Exception):
|
||||
pass
|
||||
|
||||
class NoProfilesError(Exception):
|
||||
pass
|
||||
|
||||
class PathNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
class UnsupportedOSError(Exception):
|
||||
pass
|
||||
|
||||
# General functions
|
||||
def abort():
|
||||
"""Abort script."""
|
||||
print_warning('Aborted.')
|
||||
sleep(1)
|
||||
pause(prompt='Press Enter to exit... ')
|
||||
exit_script()
|
||||
|
||||
def ask(prompt='Kotaero!'):
|
||||
"""Prompt the user with a Y/N question, log answer, and return a bool."""
|
||||
answer = None
|
||||
prompt = '{} [Y/N]: '.format(prompt)
|
||||
while answer is None:
|
||||
tmp = input(prompt)
|
||||
if re.search(r'^y(es|)$', tmp, re.IGNORECASE):
|
||||
answer = True
|
||||
elif re.search(r'^n(o|ope|)$', tmp, re.IGNORECASE):
|
||||
answer = False
|
||||
message = '{prompt}{answer_text}'.format(
|
||||
prompt = prompt,
|
||||
answer_text = 'Yes' if answer else 'No')
|
||||
print_log(message=message)
|
||||
return answer
|
||||
|
||||
def clear_screen():
|
||||
"""Simple wrapper for cls."""
|
||||
os.system('cls')
|
||||
|
||||
def convert_to_bytes(size):
|
||||
"""Convert human-readable size str to bytes and return an int."""
|
||||
size = str(size)
|
||||
tmp = re.search(r'(\d+)\s+([KMGT]B)', size.upper())
|
||||
if tmp:
|
||||
size = int(tmp.group(1))
|
||||
units = tmp.group(2)
|
||||
if units == 'TB':
|
||||
size *= 1099511627776
|
||||
elif units == 'GB':
|
||||
size *= 1073741824
|
||||
elif units == 'MB':
|
||||
size *= 1048576
|
||||
elif units == 'KB':
|
||||
size *= 1024
|
||||
else:
|
||||
return -1
|
||||
|
||||
return size
|
||||
|
||||
def exit_script(return_value=0):
|
||||
"""Exits the script after some cleanup and opens the log (if set)."""
|
||||
# Remove dirs (if empty)
|
||||
for dir in ['BackupDir', 'LogDir', 'TmpDir']:
|
||||
try:
|
||||
dir = global_vars[dir]
|
||||
os.rmdir(dir)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Open Log (if it exists)
|
||||
log = global_vars.get('LogFile', '')
|
||||
if log and os.path.exists(log):
|
||||
try:
|
||||
extract_item('NotepadPlusPlus', silent=True)
|
||||
popen_program(
|
||||
[global_vars['Tools']['NotepadPlusPlus'],
|
||||
global_vars['LogFile']])
|
||||
except Exception:
|
||||
print_error('ERROR: Failed to extract Notepad++ and open log.')
|
||||
pause('Press Enter to exit...')
|
||||
|
||||
# Kill Caffeine if still running
|
||||
kill_process('caffeine.exe')
|
||||
|
||||
# Exit
|
||||
sys.exit(return_value)
|
||||
|
||||
def extract_item(item, filter='', silent=False):
|
||||
"""Extract item from .cbin into .bin."""
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0',
|
||||
'-p{ArchivePassword}'.format(**global_vars),
|
||||
r'-o{BinDir}\{item}'.format(item=item, **global_vars),
|
||||
r'{CBinDir}\{item}.7z'.format(item=item, **global_vars),
|
||||
filter]
|
||||
if not silent:
|
||||
print_standard('Extracting "{item}"...'.format(item=item))
|
||||
try:
|
||||
run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
if not silent:
|
||||
print_warning('WARNING: Errors encountered while exctracting data')
|
||||
|
||||
def get_ticket_number():
|
||||
"""Get TicketNumber from user, save in LogDir, and return as str."""
|
||||
ticket_number = None
|
||||
while ticket_number is None:
|
||||
_input = input('Enter ticket number: ')
|
||||
if re.match(r'^([0-9]+([-_]?\w+|))$', _input):
|
||||
ticket_number = _input
|
||||
with open(r'{LogDir}\TicketNumber'.format(**global_vars), 'w') as f:
|
||||
f.write(ticket_number)
|
||||
return ticket_number
|
||||
|
||||
def human_readable_size(size, decimals=0):
|
||||
"""Convert size in bytes to a human-readable format and return a str."""
|
||||
# Prep string formatting
|
||||
width = 3+decimals
|
||||
if decimals > 0:
|
||||
width += 1
|
||||
|
||||
# Convert size to int
|
||||
try:
|
||||
size = int(size)
|
||||
except ValueError:
|
||||
size = convert_to_bytes(size)
|
||||
|
||||
# Verify we have a valid size
|
||||
if size < 0:
|
||||
return '{size:>{width}} b'.format(size='???', width=width)
|
||||
|
||||
# Convert to sensible units
|
||||
if size >= 1099511627776:
|
||||
size /= 1099511627776
|
||||
units = 'Tb'
|
||||
elif size >= 1073741824:
|
||||
size /= 1073741824
|
||||
units = 'Gb'
|
||||
elif size >= 1048576:
|
||||
size /= 1048576
|
||||
units = 'Mb'
|
||||
elif size >= 1024:
|
||||
size /= 1024
|
||||
units = 'Kb'
|
||||
else:
|
||||
units = ' b'
|
||||
|
||||
# Return
|
||||
return '{size:>{width}.{decimals}f} {units}'.format(
|
||||
size=size, width=width, decimals=decimals, units=units)
|
||||
|
||||
def kill_process(name):
|
||||
"""Kill any running caffeine.exe processes."""
|
||||
for proc in psutil.process_iter():
|
||||
if proc.name() == name:
|
||||
proc.kill()
|
||||
|
||||
def major_exception():
|
||||
"""Display traceback and exit"""
|
||||
print_error('Major exception')
|
||||
print_warning(SUPPORT_MESSAGE)
|
||||
print(traceback.format_exc())
|
||||
print_log(traceback.format_exc())
|
||||
sleep(30)
|
||||
pause('Press Enter to exit...')
|
||||
exit_script(1)
|
||||
|
||||
def menu_select(title='~ Untitled Menu ~',
|
||||
prompt='Please make a selection', secret_exit=False,
|
||||
main_entries=[], action_entries=[], disabled_label='DISABLED'):
|
||||
"""Display options in a menu and return selected option as a str."""
|
||||
# Bail early
|
||||
if not main_entries and not action_entries:
|
||||
raise Exception("MenuError: No items given")
|
||||
|
||||
# Set title
|
||||
if 'Title' in global_vars:
|
||||
title = '{}\n\n{}'.format(global_vars['Title'], title)
|
||||
|
||||
# Build menu
|
||||
menu_splash = '{}\n\n'.format(title)
|
||||
width = len(str(len(main_entries)))
|
||||
valid_answers = []
|
||||
if (secret_exit):
|
||||
valid_answers.append('Q')
|
||||
|
||||
# Add main entries
|
||||
for i in range(len(main_entries)):
|
||||
entry = main_entries[i]
|
||||
# Add Spacer
|
||||
if ('CRLF' in entry):
|
||||
menu_splash += '\n'
|
||||
entry_str = '{number:>{width}}: {name}'.format(
|
||||
number = i+1,
|
||||
width = width,
|
||||
name = entry.get('Display Name', entry['Name']))
|
||||
if entry.get('Disabled', False):
|
||||
entry_str = '{YELLOW}{entry_str} ({disabled}){CLEAR}'.format(
|
||||
entry_str = entry_str,
|
||||
disabled = disabled_label,
|
||||
**COLORS)
|
||||
else:
|
||||
valid_answers.append(str(i+1))
|
||||
menu_splash += '{}\n'.format(entry_str)
|
||||
menu_splash += '\n'
|
||||
|
||||
# Add action entries
|
||||
for entry in action_entries:
|
||||
# Add Spacer
|
||||
if ('CRLF' in entry):
|
||||
menu_splash += '\n'
|
||||
valid_answers.append(entry['Letter'])
|
||||
menu_splash += '{letter:>{width}}: {name}\n'.format(
|
||||
letter = entry['Letter'].upper(),
|
||||
width = len(str(len(action_entries))),
|
||||
name = entry['Name'])
|
||||
menu_splash += '\n'
|
||||
|
||||
answer = ''
|
||||
|
||||
while (answer.upper() not in valid_answers):
|
||||
os.system('cls')
|
||||
print(menu_splash)
|
||||
answer = input('{}: '.format(prompt))
|
||||
|
||||
return answer.upper()
|
||||
|
||||
def non_clobber_rename(full_path):
|
||||
"""Append suffix to path, if necessary, to avoid clobbering path"""
|
||||
new_path = full_path
|
||||
_i = 1;
|
||||
while os.path.exists(new_path):
|
||||
new_path = '{path}_{i}'.format(i=_i, path=full_path)
|
||||
_i += 1
|
||||
|
||||
return new_path
|
||||
|
||||
def pause(prompt='Press Enter to continue... '):
|
||||
"""Simple pause implementation."""
|
||||
input(prompt)
|
||||
|
||||
def ping(addr='google.com'):
|
||||
"""Attempt to ping addr."""
|
||||
cmd = ['ping', '-n', '2', addr]
|
||||
run_program(cmd)
|
||||
|
||||
def popen_program(cmd, pipe=False, minimized=False, shell=False, **kwargs):
|
||||
"""Run program and return a subprocess.Popen object."""
|
||||
startupinfo=None
|
||||
if minimized:
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW
|
||||
startupinfo.wShowWindow = 6
|
||||
|
||||
if pipe:
|
||||
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
else:
|
||||
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo)
|
||||
|
||||
return popen_obj
|
||||
|
||||
def print_error(*args, **kwargs):
|
||||
"""Prints message to screen in RED."""
|
||||
print_standard(*args, color=COLORS['RED'], **kwargs)
|
||||
|
||||
def print_info(*args, **kwargs):
|
||||
"""Prints message to screen in BLUE."""
|
||||
print_standard(*args, color=COLORS['BLUE'], **kwargs)
|
||||
|
||||
def print_standard(message='Generic info',
|
||||
color=None, end='\n', timestamp=True, **kwargs):
|
||||
"""Prints message to screen and log (if set)."""
|
||||
display_message = message
|
||||
if color:
|
||||
display_message = color + message + COLORS['CLEAR']
|
||||
# **COLORS is used below to support non-"standard" color printing
|
||||
print(display_message.format(**COLORS), end=end, **kwargs)
|
||||
print_log(message, end, timestamp)
|
||||
|
||||
def print_success(*args, **kwargs):
|
||||
"""Prints message to screen in GREEN."""
|
||||
print_standard(*args, color=COLORS['GREEN'], **kwargs)
|
||||
|
||||
def print_warning(*args, **kwargs):
|
||||
"""Prints message to screen in YELLOW."""
|
||||
print_standard(*args, color=COLORS['YELLOW'], **kwargs)
|
||||
|
||||
def print_log(message='', end='\n', timestamp=True):
|
||||
time_str = time.strftime("%Y-%m-%d %H%M%z: ") if timestamp else ''
|
||||
if 'LogFile' in global_vars and global_vars['LogFile'] is not None:
|
||||
with open(global_vars['LogFile'], 'a') as f:
|
||||
for line in message.splitlines():
|
||||
f.write('{timestamp}{line}{end}'.format(
|
||||
timestamp = time_str,
|
||||
line = line,
|
||||
end = end))
|
||||
|
||||
def run_program(cmd, args=[], check=True, pipe=True, shell=False):
|
||||
"""Run program and return a subprocess.CompletedProcess object."""
|
||||
if args:
|
||||
# Deprecated so let's raise an exception to find & fix all occurances
|
||||
print_error('ERROR: Using args is no longer supported.')
|
||||
raise Exception
|
||||
cmd = [c for c in cmd if c]
|
||||
if shell:
|
||||
cmd = ' '.join(cmd)
|
||||
|
||||
if pipe:
|
||||
process_return = subprocess.run(cmd, check=check, shell=shell,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
else:
|
||||
process_return = subprocess.run(cmd, check=check, shell=shell)
|
||||
|
||||
return process_return
|
||||
|
||||
def set_title(title='~Some Title~'):
|
||||
"""Set title.
|
||||
|
||||
Used for window title and menu titles."""
|
||||
global_vars['Title'] = title
|
||||
os.system('title {}'.format(title))
|
||||
|
||||
def show_data(message='~Some message~', data='~Some data~', indent=8, width=32,
|
||||
info=False, warning=False, error=False):
|
||||
"""Display info with formatting."""
|
||||
message = '{indent}{message:<{width}}{data}'.format(
|
||||
indent=' '*indent, width=width, message=message, data=data)
|
||||
if error:
|
||||
print_error(message)
|
||||
elif warning:
|
||||
print_warning(message)
|
||||
elif info:
|
||||
print_info(message)
|
||||
else:
|
||||
print_standard(message)
|
||||
|
||||
def show_info(message='~Some message~', info='~Some info~', indent=8, width=32):
|
||||
show_data(message=message, data=info, indent=indent, width=width)
|
||||
|
||||
def sleep(seconds=2):
|
||||
"""Wait for a while."""
|
||||
time.sleep(seconds)
|
||||
|
||||
def stay_awake():
|
||||
"""Prevent the system from sleeping or hibernating."""
|
||||
# Bail if caffeine is already running
|
||||
for proc in psutil.process_iter():
|
||||
if proc.name() == 'caffeine.exe':
|
||||
return
|
||||
# Extract and run
|
||||
extract_item('Caffeine', silent=True)
|
||||
try:
|
||||
popen_program(global_vars['Tools']['Caffeine'])
|
||||
except Exception:
|
||||
print_error('ERROR: No caffeine available.')
|
||||
print_warning('Please set the power setting to High Performance.')
|
||||
|
||||
def get_exception(s):
|
||||
"""Get exception by name, returns Exception object."""
|
||||
return getattr(sys.modules[__name__], s)
|
||||
|
||||
def try_and_print(message='Trying...',
|
||||
function=None, cs='CS', ns='NS', other_results={},
|
||||
catch_all=True, print_return=False, silent_function=True,
|
||||
indent=8, width=32, *args, **kwargs):
|
||||
"""Run function, print if successful or not, and return dict.
|
||||
|
||||
other_results is in the form of
|
||||
{
|
||||
'Warning': {'ExceptionClassName': 'Result Message'},
|
||||
'Error': {'ExceptionClassName': 'Result Message'}
|
||||
}
|
||||
The the ExceptionClassNames will be excepted conditions
|
||||
and the result string will be printed in the correct color.
|
||||
catch_all=False will result in unspecified exceptions being re-raised."""
|
||||
err = None
|
||||
out = None
|
||||
w_exceptions = other_results.get('Warning', {}).keys()
|
||||
w_exceptions = tuple(get_exception(e) for e in w_exceptions)
|
||||
e_exceptions = other_results.get('Error', {}).keys()
|
||||
e_exceptions = tuple(get_exception(e) for e in e_exceptions)
|
||||
w_results = other_results.get('Warning', {})
|
||||
e_results = other_results.get('Error', {})
|
||||
|
||||
# Run function and catch errors
|
||||
print_standard('{indent}{message:<{width}}'.format(
|
||||
indent=' '*indent, message=message, width=width), end='', flush=True)
|
||||
try:
|
||||
out = function(*args, **kwargs)
|
||||
if print_return:
|
||||
print_standard(out[0], timestamp=False)
|
||||
for item in out[1:]:
|
||||
print_standard('{indent}{item}'.format(
|
||||
indent=' '*(indent+width), item=item))
|
||||
elif silent_function:
|
||||
print_success(cs, timestamp=False)
|
||||
except w_exceptions as e:
|
||||
_result = w_results.get(e.__class__.__name__, 'Warning')
|
||||
print_warning(_result, timestamp=False)
|
||||
err = e
|
||||
except e_exceptions as e:
|
||||
_result = e_results.get(e.__class__.__name__, 'Error')
|
||||
print_error(_result, timestamp=False)
|
||||
err = e
|
||||
except Exception:
|
||||
print_error(ns, timestamp=False)
|
||||
err = traceback.format_exc()
|
||||
|
||||
# Return or raise?
|
||||
if err and not catch_all:
|
||||
raise
|
||||
else:
|
||||
return {'CS': not bool(err), 'Error': err, 'Out': out}
|
||||
|
||||
def upload_data(path, file):
|
||||
"""Add CLIENT_INFO_SERVER to authorized connections and upload file."""
|
||||
if not ENABLED_UPLOAD_DATA:
|
||||
raise GenericError('Feature disabled.')
|
||||
|
||||
extract_item('PuTTY', filter='wizkit.ppk psftp.exe', silent=True)
|
||||
|
||||
# Authorize connection to the server
|
||||
winreg.CreateKey(HKCU, r'Software\SimonTatham\PuTTY\SshHostKeys')
|
||||
with winreg.OpenKey(HKCU, r'Software\SimonTatham\PuTTY\SshHostKeys',
|
||||
access=winreg.KEY_WRITE) as key:
|
||||
winreg.SetValueEx(key,
|
||||
'rsa2@22:{IP}'.format(**CLIENT_INFO_SERVER), 0,
|
||||
winreg.REG_SZ, CLIENT_INFO_SERVER['RegEntry'])
|
||||
|
||||
# Write batch file
|
||||
with open(r'{TmpDir}\psftp.batch'.format(**global_vars),
|
||||
'w', encoding='ascii') as f:
|
||||
f.write('lcd "{path}"\n'.format(path=path))
|
||||
f.write('cd "{Share}"\n'.format(**CLIENT_INFO_SERVER))
|
||||
f.write('mkdir {TicketNumber}\n'.format(**global_vars))
|
||||
f.write('cd {TicketNumber}\n'.format(**global_vars))
|
||||
f.write('put "{file}"\n'.format(file=file))
|
||||
|
||||
# Upload Info
|
||||
cmd = [
|
||||
global_vars['Tools']['PuTTY-PSFTP'],
|
||||
'-noagent',
|
||||
'-i', r'{BinDir}\PuTTY\wizkit.ppk'.format(**global_vars),
|
||||
'{User}@{IP}'.format(**CLIENT_INFO_SERVER),
|
||||
'-b', r'{TmpDir}\psftp.batch'.format(**global_vars)]
|
||||
run_program(cmd)
|
||||
|
||||
def upload_info():
|
||||
"""Upload compressed Info file to the NAS as set in settings.main.py."""
|
||||
if not ENABLED_UPLOAD_DATA:
|
||||
raise GenericError('Feature disabled.')
|
||||
|
||||
path = '{ClientDir}'.format(**global_vars)
|
||||
file = 'Info_{Date-Time}.7z'.format(**global_vars)
|
||||
upload_data(path, file)
|
||||
|
||||
def compress_info():
|
||||
"""Compress ClientDir info folders with 7-Zip for upload_info()."""
|
||||
path = '{ClientDir}'.format(**global_vars)
|
||||
file = 'Info_{Date-Time}.7z'.format(**global_vars)
|
||||
_cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', '-t7z', '-mx=9', '-bso0', '-bse0',
|
||||
r'{}\{}'.format(path, file),
|
||||
r'{ClientDir}\Info'.format(**global_vars)]
|
||||
run_program(_cmd)
|
||||
|
||||
def wait_for_process(name, poll_rate=3):
|
||||
"""Wait for process by name."""
|
||||
running = True
|
||||
while running:
|
||||
sleep(poll_rate)
|
||||
running = False
|
||||
for proc in psutil.process_iter():
|
||||
if re.search(r'^{}'.format(name), proc.name(), re.IGNORECASE):
|
||||
running = True
|
||||
sleep(1)
|
||||
|
||||
# global_vars functions
|
||||
def init_global_vars():
|
||||
"""Sets global variables based on system info."""
|
||||
print_info('Initializing')
|
||||
os.system('title Wizard Kit')
|
||||
init_functions = [
|
||||
['Checking .bin...', find_bin],
|
||||
['Checking environment...', set_common_vars],
|
||||
['Checking OS...', check_os],
|
||||
['Checking tools...', check_tools],
|
||||
['Creating folders...', make_tmp_dirs],
|
||||
['Clearing collisions...', clean_env_vars],
|
||||
]
|
||||
try:
|
||||
for f in init_functions:
|
||||
try_and_print(
|
||||
message=f[0], function=f[1],
|
||||
cs='Done', ns='Error', catch_all=False)
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
def check_os():
|
||||
"""Set OS specific variables."""
|
||||
tmp = {}
|
||||
|
||||
# Query registry
|
||||
path = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion'
|
||||
with winreg.OpenKey(HKLM, path) as key:
|
||||
for name in ['CurrentBuild', 'CurrentVersion', 'ProductName']:
|
||||
try:
|
||||
tmp[name] = winreg.QueryValueEx(key, name)[0]
|
||||
except FileNotFoundError:
|
||||
tmp[name] = 'Unknown'
|
||||
try:
|
||||
tmp['CurrentBuild'] = int(tmp['CurrentBuild'])
|
||||
except ValueError:
|
||||
# This should be interesting...
|
||||
tmp['CurrentBuild'] = -1
|
||||
try:
|
||||
tmp['CurrentVersion'] = float(tmp['CurrentVersion'])
|
||||
except ValueError:
|
||||
# This should also be interesting...
|
||||
tmp['CurrentVersion'] = -1
|
||||
|
||||
# Check bit depth
|
||||
tmp['Arch'] = 32
|
||||
if 'PROGRAMFILES(X86)' in global_vars['Env']:
|
||||
tmp['Arch'] = 64
|
||||
|
||||
# Set name
|
||||
tmp['Name'] = tmp['ProductName']
|
||||
if tmp['CurrentBuild'] == 7601:
|
||||
tmp['Name'] += ' SP1' # Win 7
|
||||
if tmp['CurrentBuild'] == 9600:
|
||||
tmp['Name'] += ' Update' # Win 8.1u
|
||||
if tmp['CurrentBuild'] == 10240:
|
||||
tmp['Name'] += ' Release 1507 "Threshold 1"'
|
||||
if tmp['CurrentBuild'] == 10586:
|
||||
tmp['Name'] += ' Release 1511 "Threshold 2"'
|
||||
if tmp['CurrentBuild'] == 14393:
|
||||
tmp['Name'] += ' Release 1607 "Redstone 1" / "Anniversary Update"'
|
||||
if tmp['CurrentBuild'] == 15063:
|
||||
tmp['Name'] += ' Release 1703 "Redstone 2" / "Creators Update"'
|
||||
if tmp['CurrentBuild'] == 16299:
|
||||
tmp['Name'] += ' Release 1709 "Redstone 3" / "Fall Creators Update"'
|
||||
tmp['Name'] = re.sub(r'\s+', ' ', tmp['Name'])
|
||||
|
||||
# Set display name
|
||||
tmp['DisplayName'] = '{} x{}'.format(tmp['Name'], tmp['Arch'])
|
||||
if tmp['CurrentBuild'] in [7600, 9200, 10240, 10586]:
|
||||
tmp['DisplayName'] += ' (very outdated)'
|
||||
elif tmp['CurrentBuild'] in [7601, 9600, 14393, 15063]:
|
||||
tmp['DisplayName'] += ' (outdated)'
|
||||
elif tmp['CurrentBuild'] == 16299:
|
||||
pass # Current Win10 release
|
||||
else:
|
||||
tmp['DisplayName'] += ' (unrecognized)'
|
||||
|
||||
# Set version
|
||||
if tmp['CurrentVersion'] == 6.0:
|
||||
tmp['Version'] = 'Vista'
|
||||
elif tmp['CurrentVersion'] == 6.1:
|
||||
tmp['Version'] = '7'
|
||||
elif 6.2 <= tmp['CurrentVersion'] <= 6.3:
|
||||
if tmp['CurrentBuild'] <= 9600:
|
||||
tmp['Version'] = '8'
|
||||
elif tmp['CurrentBuild'] >= 10240:
|
||||
tmp['Version'] = '10'
|
||||
else:
|
||||
tmp['Version'] = 'Unknown'
|
||||
|
||||
# == vista ==
|
||||
# 6.0.6000
|
||||
# 6.0.6001 # SP1
|
||||
# 6.0.6002 # SP2
|
||||
# ==== 7 ====
|
||||
# 6.1.7600
|
||||
# 6.1.7601 # SP1
|
||||
# 6.1.7602 # Umm.. where'd this come from?
|
||||
# ==== 8 ====
|
||||
# 6.2.9200
|
||||
# === 8.1 ===
|
||||
# 6.3.9200
|
||||
# === 8.1u ==
|
||||
# 6.3.9600
|
||||
# === 10 v1507 "Threshold 1" ==
|
||||
# 6.3.10240
|
||||
# === 10 v1511 "Threshold 2" ==
|
||||
# 6.3.10586
|
||||
# === 10 v1607 "Redstone 1" "Anniversary Update" ==
|
||||
# 6.3.14393
|
||||
# === 10 v1703 "Redstone 2" "Creators Update" ==
|
||||
# 6.3.15063
|
||||
# === 10 v1709 "Redstone 3" "Fall Creators Update" ==
|
||||
# 6.3.16299
|
||||
global_vars['OS'] = tmp
|
||||
|
||||
def check_tools():
|
||||
"""Set tool variables based on OS bit-depth and tool availability."""
|
||||
if global_vars['OS'].get('Arch', 32) == 64:
|
||||
global_vars['Tools'] = {
|
||||
k: v.get('64', v.get('32')) for (k, v) in TOOLS.items()}
|
||||
else:
|
||||
global_vars['Tools'] = {k: v.get('32') for (k, v) in TOOLS.items()}
|
||||
|
||||
# Fix paths
|
||||
global_vars['Tools'] = {k: os.path.join(global_vars['BinDir'], v)
|
||||
for (k, v) in global_vars['Tools'].items()}
|
||||
|
||||
def clean_env_vars():
|
||||
"""Remove conflicting global_vars and env variables.
|
||||
|
||||
This fixes an issue where both global_vars and
|
||||
global_vars['Env'] are expanded at the same time."""
|
||||
for key in global_vars.keys():
|
||||
global_vars['Env'].pop(key, None)
|
||||
|
||||
def find_bin():
|
||||
"""Find .bin folder in the cwd or it's parents."""
|
||||
wd = os.getcwd()
|
||||
base = None
|
||||
while base is None:
|
||||
if os.path.exists('.bin'):
|
||||
base = os.getcwd()
|
||||
break
|
||||
if re.fullmatch(r'\w:\\', os.getcwd()):
|
||||
break
|
||||
os.chdir('..')
|
||||
os.chdir(wd)
|
||||
if base is None:
|
||||
raise BinNotFoundError
|
||||
global_vars['BaseDir'] = base
|
||||
|
||||
def make_tmp_dirs():
|
||||
"""Make temp directories."""
|
||||
os.makedirs(global_vars['BackupDir'], exist_ok=True)
|
||||
os.makedirs(global_vars['LogDir'], exist_ok=True)
|
||||
os.makedirs(global_vars['TmpDir'], exist_ok=True)
|
||||
|
||||
def set_common_vars():
|
||||
"""Set common variables."""
|
||||
global_vars['Date'] = time.strftime("%Y-%m-%d")
|
||||
global_vars['Date-Time'] = time.strftime("%Y-%m-%d_%H%M_%z")
|
||||
global_vars['Env'] = os.environ.copy()
|
||||
|
||||
global_vars['ArchivePassword'] = ARCHIVE_PASSWORD
|
||||
global_vars['BinDir'] = r'{BaseDir}\.bin'.format(
|
||||
**global_vars)
|
||||
global_vars['CBinDir'] = r'{BaseDir}\.cbin'.format(
|
||||
**global_vars)
|
||||
global_vars['ClientDir'] = r'{SYSTEMDRIVE}\{prefix}'.format(
|
||||
prefix=KIT_NAME_SHORT, **global_vars['Env'])
|
||||
global_vars['BackupDir'] = r'{ClientDir}\Backups\{Date}'.format(
|
||||
**global_vars)
|
||||
global_vars['LogDir'] = r'{ClientDir}\Info\{Date}'.format(
|
||||
**global_vars)
|
||||
global_vars['ProgBackupDir'] = r'{ClientDir}\Backups'.format(
|
||||
**global_vars)
|
||||
global_vars['QuarantineDir'] = r'{ClientDir}\Quarantine'.format(
|
||||
**global_vars)
|
||||
global_vars['TmpDir'] = r'{BinDir}\tmp'.format(
|
||||
**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
628
.bin/Scripts/functions/data.py
Normal file
628
.bin/Scripts/functions/data.py
Normal file
|
|
@ -0,0 +1,628 @@
|
|||
# Wizard Kit: Functions - Data
|
||||
|
||||
import ctypes
|
||||
|
||||
from operator import itemgetter
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# Classes
|
||||
class LocalDisk():
|
||||
def __init__(self, disk):
|
||||
self.disk = disk
|
||||
self.name = disk.mountpoint.upper()
|
||||
self.path = self.name
|
||||
def is_dir(self):
|
||||
# Should always be true
|
||||
return True
|
||||
|
||||
# Regex
|
||||
REGEX_EXCL_ITEMS = re.compile(
|
||||
r'^(\.(AppleDB|AppleDesktop|AppleDouble'
|
||||
r'|com\.apple\.timemachine\.supported|dbfseventsd'
|
||||
r'|DocumentRevisions-V100.*|DS_Store|fseventsd|PKInstallSandboxManager'
|
||||
r'|Spotlight.*|SymAV.*|symSchedScanLockxz|TemporaryItems|Trash.*'
|
||||
r'|vol|VolumeIcon\.icns)|desktop\.(ini|.*DB|.*DF)'
|
||||
r'|(hiberfil|pagefile)\.sys|lost\+found|Network\.*Trash\.*Folder'
|
||||
r'|Recycle[dr]|System\.*Volume\.*Information|Temporary\.*Items'
|
||||
r'|Thumbs\.db)$',
|
||||
re.IGNORECASE)
|
||||
REGEX_EXCL_ROOT_ITEMS = re.compile(
|
||||
r'^\\?(boot(mgr|nxt)$|Config.msi'
|
||||
r'|(eula|globdata|install|vc_?red)'
|
||||
r'|.*.sys$|System Volume Information|RECYCLER?|\$Recycle\.bin'
|
||||
r'|\$?Win(dows(.old.*|\.~BT|)$|RE_)|\$GetCurrent|Windows10Upgrade'
|
||||
r'|PerfLogs|Program Files|SYSTEM.SAV'
|
||||
r'|.*\.(esd|swm|wim|dd|map|dmg|image)$)',
|
||||
re.IGNORECASE)
|
||||
REGEX_INCL_ROOT_ITEMS = re.compile(
|
||||
r'^\\?(AdwCleaner|(My\s*|)(Doc(uments?( and Settings|)|s?)|Downloads'
|
||||
r'|Media|Music|Pic(ture|)s?|Vid(eo|)s?)'
|
||||
r'|{prefix}(-?Info|-?Transfer|)'
|
||||
r'|(ProgramData|Recovery|Temp.*|Users)$'
|
||||
r'|.*\.(log|txt|rtf|qb\w*|avi|m4a|m4v|mp4|mkv|jpg|png|tiff?)$)'
|
||||
r''.format(prefix=KIT_NAME_SHORT),
|
||||
re.IGNORECASE)
|
||||
REGEX_WIM_FILE = re.compile(
|
||||
r'\.wim$',
|
||||
re.IGNORECASE)
|
||||
REGEX_WINDOWS_OLD = re.compile(
|
||||
r'^\\Win(dows|)\.old',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
FAST_COPY_EXCLUDES = [
|
||||
r'\*.esd',
|
||||
r'\*.swm',
|
||||
r'\*.wim',
|
||||
r'\*.dd',
|
||||
r'\*.dd.tgz',
|
||||
r'\*.dd.txz',
|
||||
r'\*.map',
|
||||
r'\*.dmg',
|
||||
r'\*.image',
|
||||
r'$RECYCLE.BIN',
|
||||
r'$Recycle.Bin',
|
||||
r'.AppleDB',
|
||||
r'.AppleDesktop',
|
||||
r'.AppleDouble',
|
||||
r'.com.apple.timemachine.supported',
|
||||
r'.dbfseventsd',
|
||||
r'.DocumentRevisions-V100*',
|
||||
r'.DS_Store',
|
||||
r'.fseventsd',
|
||||
r'.PKInstallSandboxManager',
|
||||
r'.Spotlight*',
|
||||
r'.SymAV*',
|
||||
r'.symSchedScanLockxz',
|
||||
r'.TemporaryItems',
|
||||
r'.Trash*',
|
||||
r'.vol',
|
||||
r'.VolumeIcon.icns',
|
||||
r'desktop.ini',
|
||||
r'Desktop?DB',
|
||||
r'Desktop?DF',
|
||||
r'hiberfil.sys',
|
||||
r'lost+found',
|
||||
r'Network?Trash?Folder',
|
||||
r'pagefile.sys',
|
||||
r'Recycled',
|
||||
r'RECYCLER',
|
||||
r'System?Volume?Information',
|
||||
r'Temporary?Items',
|
||||
r'Thumbs.db',
|
||||
]
|
||||
FAST_COPY_ARGS = [
|
||||
'/cmd=noexist_only',
|
||||
'/utf8',
|
||||
'/skip_empty_dir',
|
||||
'/linkdest',
|
||||
'/no_ui',
|
||||
'/auto_close',
|
||||
'/exclude={}'.format(';'.join(FAST_COPY_EXCLUDES)),
|
||||
]
|
||||
# Code borrowed from: https://stackoverflow.com/a/29075319
|
||||
SEM_NORMAL = ctypes.c_uint()
|
||||
SEM_FAILCRITICALERRORS = 1
|
||||
SEM_NOOPENFILEERRORBOX = 0x8000
|
||||
SEM_FAIL = SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS
|
||||
|
||||
def cleanup_transfer(dest_path):
|
||||
"""Fix attributes and move extraneous items outside the Transfer folder."""
|
||||
try:
|
||||
# Remove dest_path if empty
|
||||
os.rmdir(dest_path)
|
||||
except OSError:
|
||||
pass
|
||||
if not os.path.exists(dest_path):
|
||||
# Bail if dest_path was empty and removed
|
||||
raise Exception
|
||||
|
||||
# Fix attributes
|
||||
cmd = ['attrib', '-a', '-h', '-r', '-s', dest_path]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
for root, dirs, files in os.walk(dest_path, topdown=False):
|
||||
for name in dirs:
|
||||
# Remove empty directories and junction points
|
||||
try:
|
||||
os.rmdir(os.path.join(root, name))
|
||||
except OSError:
|
||||
pass
|
||||
for name in files:
|
||||
# "Remove" files based on exclusion regex
|
||||
if REGEX_EXCL_ITEMS.search(name):
|
||||
# Make dest folder
|
||||
dest_name = root.replace(dest_path, dest_path+'.Removed')
|
||||
os.makedirs(dest_name, exist_ok=True)
|
||||
# Set dest filename
|
||||
dest_name = os.path.join(dest_name, name)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
source_name = os.path.join(root, name)
|
||||
try:
|
||||
shutil.move(source_name, dest_name)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def is_valid_wim_file(item):
|
||||
"""Checks if the provided os.DirEntry is a valid WIM file, returns bool."""
|
||||
valid = bool(item.is_file() and REGEX_WIM_FILE.search(item.name))
|
||||
if valid:
|
||||
extract_item('wimlib', silent=True)
|
||||
cmd = [global_vars['Tools']['wimlib-imagex'], 'info', item.path]
|
||||
try:
|
||||
run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
valid = False
|
||||
print_log('WARNING: Image "{}" damaged.'.format(item.name))
|
||||
return valid
|
||||
|
||||
def mount_backup_shares():
|
||||
"""Mount the backup shares unless labeled as already mounted."""
|
||||
for server in BACKUP_SERVERS:
|
||||
# Blindly skip if we mounted earlier
|
||||
if server['Mounted']:
|
||||
continue
|
||||
|
||||
mount_network_share(server)
|
||||
|
||||
def mount_network_share(server):
|
||||
"""Mount a network share defined by server."""
|
||||
# Test connection
|
||||
try:
|
||||
ping(server['IP'])
|
||||
except subprocess.CalledProcessError:
|
||||
print_error(
|
||||
r'Failed to mount \\{Name}\{Share}, {IP} unreachable.'.format(
|
||||
**server))
|
||||
sleep(1)
|
||||
return False
|
||||
|
||||
# Mount
|
||||
cmd = r'net use \\{IP}\{Share} /user:{User} {Pass}'.format(**server)
|
||||
cmd = cmd.split(' ')
|
||||
try:
|
||||
run_program(cmd)
|
||||
except Exception:
|
||||
print_warning(r'Failed to mount \\{Name}\{Share} ({IP})'.format(
|
||||
**server))
|
||||
sleep(1)
|
||||
else:
|
||||
print_info('Mounted {Name}'.format(**server))
|
||||
server['Mounted'] = True
|
||||
|
||||
def run_fast_copy(items, dest):
|
||||
"""Copy items to dest using FastCopy."""
|
||||
if not items:
|
||||
raise Exception
|
||||
|
||||
cmd = [global_vars['Tools']['FastCopy'], *FAST_COPY_ARGS]
|
||||
if 'LogFile' in global_vars:
|
||||
cmd.append('/logfile={LogFile}'.format(**global_vars))
|
||||
cmd.extend(items)
|
||||
cmd.append('/to={}\\'.format(dest))
|
||||
|
||||
run_program(cmd)
|
||||
|
||||
def run_wimextract(source, items, dest):
|
||||
"""Extract items from source WIM to dest folder."""
|
||||
if not items:
|
||||
raise Exception
|
||||
extract_item('wimlib', silent=True)
|
||||
|
||||
# Write files.txt
|
||||
with open(r'{}\wim_files.txt'.format(global_vars['TmpDir']), 'w') as f:
|
||||
# Defaults
|
||||
for item in items:
|
||||
f.write('{}\n'.format(item))
|
||||
sleep(1) # For safety?
|
||||
|
||||
# Extract files
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'extract',
|
||||
source, '1',
|
||||
r'@{}\wim_files.txt'.format(global_vars['TmpDir']),
|
||||
'--dest-dir={}\\'.format(dest),
|
||||
'--no-acls',
|
||||
'--nullglob']
|
||||
run_program(cmd)
|
||||
|
||||
def scan_source(source_obj, dest_path):
|
||||
"""Scan source for files/folders to transfer."""
|
||||
selected_items = []
|
||||
|
||||
if source_obj.is_dir():
|
||||
# File-Based
|
||||
print_standard('Scanning source (folder): {}'.format(source_obj.path))
|
||||
selected_items = scan_source_path(source_obj.path, dest_path)
|
||||
else:
|
||||
# Image-Based
|
||||
if REGEX_WIM_FILE.search(source_obj.name):
|
||||
print_standard('Scanning source (image): {}'.format(
|
||||
source_obj.path))
|
||||
selected_items = scan_source_wim(source_obj.path, dest_path)
|
||||
else:
|
||||
print_error('ERROR: Unsupported image: {}'.format(
|
||||
source_obj.path))
|
||||
raise GenericError
|
||||
|
||||
return selected_items
|
||||
|
||||
def scan_source_path(source_path, dest_path, rel_path=None, interactive=True):
|
||||
"""Scan source folder for files/folders to transfer, returns list.
|
||||
|
||||
This will scan the root and (recursively) any Windows.old folders."""
|
||||
rel_path = '\\' + rel_path if rel_path else ''
|
||||
if rel_path:
|
||||
dest_path = dest_path + rel_path
|
||||
selected_items = []
|
||||
win_olds = []
|
||||
|
||||
# Root items
|
||||
root_items = []
|
||||
for item in os.scandir(source_path):
|
||||
if REGEX_INCL_ROOT_ITEMS.search(item.name):
|
||||
root_items.append(item.path)
|
||||
elif not REGEX_EXCL_ROOT_ITEMS.search(item.name):
|
||||
if (not interactive
|
||||
or ask('Copy: "{}{}" ?'.format(rel_path, item.name))):
|
||||
root_items.append(item.path)
|
||||
if REGEX_WINDOWS_OLD.search(item.name):
|
||||
win_olds.append(item)
|
||||
if root_items:
|
||||
selected_items.append({
|
||||
'Message': '{}Root Items...'.format(rel_path),
|
||||
'Items': root_items.copy(),
|
||||
'Destination': dest_path})
|
||||
|
||||
# Fonts
|
||||
if os.path.exists(r'{}\Windows\Fonts'.format(source_path)):
|
||||
selected_items.append({
|
||||
'Message': '{}Fonts...'.format(rel_path),
|
||||
'Items': [r'{}\Windows\Fonts'.format(rel_path)],
|
||||
'Destination': r'{}\Windows'.format(dest_path)})
|
||||
|
||||
# Registry
|
||||
registry_items = []
|
||||
for folder in ['config', 'OEM']:
|
||||
folder = r'Windows\System32\{}'.format(folder)
|
||||
folder = os.path.join(source_path, folder)
|
||||
if os.path.exists(folder):
|
||||
registry_items.append(folder)
|
||||
if registry_items:
|
||||
selected_items.append({
|
||||
'Message': '{}Registry...'.format(rel_path),
|
||||
'Items': registry_items.copy(),
|
||||
'Destination': r'{}\Windows\System32'.format(dest_path)})
|
||||
|
||||
# Windows.old(s)
|
||||
for old in win_olds:
|
||||
selected_items.append(
|
||||
scan_source_path(
|
||||
old.path, dest_path, rel_path=old.name, interactive=False))
|
||||
|
||||
# Done
|
||||
return selected_items
|
||||
|
||||
def scan_source_wim(source_wim, dest_path, rel_path=None, interactive=True):
|
||||
"""Scan source WIM file for files/folders to transfer, returns list.
|
||||
|
||||
This will scan the root and (recursively) any Windows.old folders."""
|
||||
rel_path = '\\' + rel_path if rel_path else ''
|
||||
selected_items = []
|
||||
win_olds = []
|
||||
|
||||
# Scan source
|
||||
extract_item('wimlib', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'], 'dir',
|
||||
source_wim, '1']
|
||||
try:
|
||||
file_list = run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
print_error('ERROR: Failed to get file list.')
|
||||
raise
|
||||
|
||||
# Root Items
|
||||
file_list = [i.strip()
|
||||
for i in file_list.stdout.decode('utf-8', 'ignore').splitlines()
|
||||
if i.count('\\') == 1 and i.strip() != '\\']
|
||||
root_items = []
|
||||
if rel_path:
|
||||
file_list = [i.replace(rel_path, '') for i in file_list]
|
||||
for item in file_list:
|
||||
if REGEX_INCL_ROOT_ITEMS.search(item):
|
||||
root_items.append(item)
|
||||
elif not REGEX_EXCL_ROOT_ITEMS.search(item):
|
||||
if (not interactive
|
||||
or ask('Extract: "{}{}" ?'.format(rel_path, item))):
|
||||
root_items.append('{}{}'.format(rel_path, item))
|
||||
if REGEX_WINDOWS_OLD.search(item):
|
||||
win_olds.append(item)
|
||||
if root_items:
|
||||
selected_items.append({
|
||||
'Message': '{}Root Items...'.format(rel_path),
|
||||
'Items': root_items.copy(),
|
||||
'Destination': dest_path})
|
||||
|
||||
# Fonts
|
||||
if wim_contains(source_wim, r'{}Windows\Fonts'.format(rel_path)):
|
||||
selected_items.append({
|
||||
'Message': '{}Fonts...'.format(rel_path),
|
||||
'Items': [r'{}\Windows\Fonts'.format(rel_path)],
|
||||
'Destination': dest_path})
|
||||
|
||||
# Registry
|
||||
registry_items = []
|
||||
for folder in ['config', 'OEM']:
|
||||
folder = r'{}Windows\System32\{}'.format(rel_path, folder)
|
||||
if wim_contains(source_wim, folder):
|
||||
registry_items.append(folder)
|
||||
if registry_items:
|
||||
selected_items.append({
|
||||
'Message': '{}Registry...'.format(rel_path),
|
||||
'Items': registry_items.copy(),
|
||||
'Destination': dest_path})
|
||||
|
||||
# Windows.old(s)
|
||||
for old in win_olds:
|
||||
scan_source_wim(source_wim, dest_path, rel_path=old, interactive=False)
|
||||
|
||||
# Done
|
||||
return selected_items
|
||||
|
||||
def select_destination(folder_path, prompt='Select destination'):
|
||||
"""Select destination drive, returns path as string."""
|
||||
disk = select_volume(prompt)
|
||||
if 'fixed' not in disk['Disk'].opts:
|
||||
folder_path = folder_path.replace('\\', '-')
|
||||
path = '{disk}{folder_path}_{Date}'.format(
|
||||
disk = disk['Disk'].mountpoint,
|
||||
folder_path = folder_path,
|
||||
**global_vars)
|
||||
|
||||
# Avoid merging with existing folder
|
||||
path = non_clobber_rename(path)
|
||||
os.makedirs(path, exist_ok=True)
|
||||
|
||||
return path
|
||||
|
||||
def select_source(ticket_number):
|
||||
"""Select backup from those found on the BACKUP_SERVERS for the ticket."""
|
||||
selected_source = None
|
||||
local_sources = []
|
||||
remote_sources = []
|
||||
sources = []
|
||||
mount_backup_shares()
|
||||
|
||||
# Check for ticket folders on servers
|
||||
for server in BACKUP_SERVERS:
|
||||
if server['Mounted']:
|
||||
print_standard('Scanning {}...'.format(server['Name']))
|
||||
for d in os.scandir(r'\\{IP}\{Share}'.format(**server)):
|
||||
if (d.is_dir()
|
||||
and d.name.lower().startswith(ticket_number.lower())):
|
||||
# Add folder to remote_sources
|
||||
remote_sources.append({
|
||||
'Name': '{:9}| File-Based: [DIR] {}'.format(
|
||||
server['Name'], d.name),
|
||||
'Server': server,
|
||||
'Sort': d.name,
|
||||
'Source': d})
|
||||
|
||||
# Check for images and subfolders
|
||||
for ticket_path in remote_sources.copy():
|
||||
for item in os.scandir(ticket_path['Source'].path):
|
||||
if item.is_dir():
|
||||
# Add folder to remote_sources
|
||||
remote_sources.append({
|
||||
'Name': r'{:9}| File-Based: [DIR] {}\{}'.format(
|
||||
ticket_path['Server']['Name'], # Server
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Sub-folder
|
||||
),
|
||||
'Server': ticket_path['Server'],
|
||||
'Sort': r'{}\{}'.format(
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Sub-folder
|
||||
),
|
||||
'Source': item})
|
||||
|
||||
# Check for images in folder
|
||||
for subitem in os.scandir(item.path):
|
||||
if REGEX_WIM_FILE.search(item.name):
|
||||
# Add image to remote_sources
|
||||
try:
|
||||
size = human_readable_size(item.stat().st_size)
|
||||
except Exception:
|
||||
size = ' ? ?' # unknown
|
||||
remote_sources.append({
|
||||
'Disabled': bool(not is_valid_wim_file(subitem)),
|
||||
'Name': r'{:9}| Image-Based: {:>7} {}\{}\{}'.format(
|
||||
ticket_path['Server']['Name'], # Server
|
||||
size, # Size (duh)
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Sub-folder
|
||||
subitem.name, # Image file
|
||||
),
|
||||
'Server': ticket_path['Server'],
|
||||
'Sort': r'{}\{}\{}'.format(
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Sub-folder
|
||||
subitem.name, # Image file
|
||||
),
|
||||
'Source': subitem})
|
||||
elif REGEX_WIM_FILE.search(item.name):
|
||||
# Add image to remote_sources
|
||||
try:
|
||||
size = human_readable_size(item.stat().st_size)
|
||||
except Exception:
|
||||
size = ' ? ?' # unknown
|
||||
remote_sources.append({
|
||||
'Disabled': bool(not is_valid_wim_file(item)),
|
||||
'Name': r'{:9}| Image-Based: {:>7} {}\{}'.format(
|
||||
ticket_path['Server']['Name'], # Server
|
||||
size, # Size (duh)
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Image file
|
||||
),
|
||||
'Server': ticket_path['Server'],
|
||||
'Sort': r'{}\{}'.format(
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Image file
|
||||
),
|
||||
'Source': item})
|
||||
|
||||
# Check for local sources
|
||||
print_standard('Scanning for local sources...')
|
||||
set_thread_error_mode(silent=True) # Prevents "No disk" popups
|
||||
sys_drive = global_vars['Env']['SYSTEMDRIVE']
|
||||
for d in psutil.disk_partitions():
|
||||
if re.search(r'^{}'.format(sys_drive), d.mountpoint, re.IGNORECASE):
|
||||
# Skip current OS drive
|
||||
continue
|
||||
if 'fixed' in d.opts:
|
||||
# Skip DVD, etc
|
||||
local_sources.append({
|
||||
'Name': '{:9}| File-Based: [DISK] {}'.format(
|
||||
' Local', d.mountpoint),
|
||||
'Sort': d.mountpoint,
|
||||
'Source': LocalDisk(d)})
|
||||
set_thread_error_mode(silent=False) # Return to normal
|
||||
|
||||
# Build Menu
|
||||
local_sources.sort(key=itemgetter('Sort'))
|
||||
remote_sources.sort(key=itemgetter('Sort'))
|
||||
sources.extend(local_sources)
|
||||
sources.extend(remote_sources)
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
|
||||
# Select backup from sources
|
||||
if len(sources) > 0:
|
||||
selection = menu_select(
|
||||
'Which backup are we using?',
|
||||
main_entries=sources,
|
||||
action_entries=actions,
|
||||
disabled_label='DAMAGED')
|
||||
if selection == 'Q':
|
||||
umount_backup_shares()
|
||||
exit_script()
|
||||
else:
|
||||
selected_source = sources[int(selection)-1]['Source']
|
||||
else:
|
||||
print_error('ERROR: No backups found for ticket: {}.'.format(
|
||||
ticket_number))
|
||||
umount_backup_shares()
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
|
||||
# Done
|
||||
return selected_source
|
||||
|
||||
def select_volume(title='Select disk', auto_select=True):
|
||||
"""Select disk from attached disks. returns dict."""
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
disks = []
|
||||
|
||||
# Build list of disks
|
||||
set_thread_error_mode(silent=True) # Prevents "No disk" popups
|
||||
for d in psutil.disk_partitions():
|
||||
info = {
|
||||
'Disk': d,
|
||||
'Name': d.mountpoint}
|
||||
try:
|
||||
usage = psutil.disk_usage(d.device)
|
||||
free = '{free} / {total} available'.format(
|
||||
free = human_readable_size(usage.free, 2),
|
||||
total = human_readable_size(usage.total, 2))
|
||||
except Exception:
|
||||
# Meh, leaving unsupported destinations out
|
||||
pass
|
||||
# free = 'Unknown'
|
||||
# info['Disabled'] = True
|
||||
else:
|
||||
info['Display Name'] = '{} ({})'.format(info['Name'], free)
|
||||
disks.append(info)
|
||||
set_thread_error_mode(silent=False) # Return to normal
|
||||
|
||||
# Skip menu?
|
||||
if len(disks) == 1 and auto_select:
|
||||
return disks[0]
|
||||
|
||||
# Show menu
|
||||
selection = menu_select(title, main_entries=disks, action_entries=actions)
|
||||
if selection == 'Q':
|
||||
exit_script()
|
||||
else:
|
||||
return disks[int(selection)-1]
|
||||
|
||||
def set_thread_error_mode(silent=True):
|
||||
"""Disable or Enable Windows error message dialogs.
|
||||
|
||||
Disable when scanning for disks to avoid popups for empty cardreaders, etc
|
||||
"""
|
||||
# Code borrowed from: https://stackoverflow.com/a/29075319
|
||||
kernel32 = ctypes.WinDLL('kernel32')
|
||||
|
||||
if silent:
|
||||
kernel32.SetThreadErrorMode(SEM_FAIL, ctypes.byref(SEM_NORMAL))
|
||||
else:
|
||||
kernel32.SetThreadErrorMode(SEM_NORMAL, ctypes.byref(SEM_NORMAL))
|
||||
|
||||
def transfer_source(source_obj, dest_path, selected_items):
|
||||
"""Transfer, or extract, files/folders from source to destination."""
|
||||
if source_obj.is_dir():
|
||||
# Run FastCopy for each selection "group"
|
||||
for group in selected_items:
|
||||
try_and_print(message=group['Message'],
|
||||
function=run_fast_copy, cs='Done',
|
||||
items=group['Items'],
|
||||
dest=group['Destination'])
|
||||
else:
|
||||
if REGEX_WIM_FILE.search(source_obj.name):
|
||||
# Extract files from WIM
|
||||
for group in selected_items:
|
||||
try_and_print(message=group['Message'],
|
||||
function=run_wimextract, cs='Done',
|
||||
source=source_obj.path,
|
||||
items=group['Items'],
|
||||
dest=group['Destination'])
|
||||
else:
|
||||
print_error('ERROR: Unsupported image: {}'.format(source_obj.path))
|
||||
raise GenericError
|
||||
|
||||
def umount_backup_shares():
|
||||
"""Unnount the backup shares regardless of current status."""
|
||||
for server in BACKUP_SERVERS:
|
||||
umount_network_share(server)
|
||||
|
||||
def umount_network_share(server):
|
||||
"""Unnount a network share defined by server."""
|
||||
cmd = r'net use \\{IP}\{Share} /delete'.format(**server)
|
||||
cmd = cmd.split(' ')
|
||||
try:
|
||||
run_program(cmd)
|
||||
except Exception:
|
||||
print_error(r'Failed to umount \\{Name}\{Share}.'.format(**server))
|
||||
sleep(1)
|
||||
else:
|
||||
print_info('Umounted {Name}'.format(**server))
|
||||
server['Mounted'] = False
|
||||
|
||||
def wim_contains(source_path, file_path):
|
||||
"""Check if the WIM contains a file or folder."""
|
||||
_cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'], 'dir',
|
||||
source_path, '1',
|
||||
'--path={}'.format(file_path),
|
||||
'--one-file-only']
|
||||
try:
|
||||
run_program(_cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
114
.bin/Scripts/functions/diags.py
Normal file
114
.bin/Scripts/functions/diags.py
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
# Wizard Kit: Functions - Diagnostics
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
AUTORUNS_SETTINGS = {
|
||||
r'Software\Sysinternals\AutoRuns': {
|
||||
'checkvirustotal': 1,
|
||||
'EulaAccepted': 1,
|
||||
'shownomicrosoft': 1,
|
||||
'shownowindows': 1,
|
||||
'showonlyvirustotal': 1,
|
||||
'submitvirustotal': 0,
|
||||
'verifysignatures': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\SigCheck': {
|
||||
'EulaAccepted': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\Streams': {
|
||||
'EulaAccepted': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\VirusTotal': {
|
||||
'VirusTotalTermsAccepted': 1,
|
||||
},
|
||||
}
|
||||
|
||||
def check_connection():
|
||||
"""Check if the system is online and optionally abort the script."""
|
||||
while True:
|
||||
result = try_and_print(message='Ping test...', function=ping, cs='OK')
|
||||
if result['CS']:
|
||||
break
|
||||
else:
|
||||
if not ask('ERROR: System appears offline, try again?'):
|
||||
if ask('Continue anyway?'):
|
||||
break
|
||||
else:
|
||||
abort()
|
||||
|
||||
def run_autoruns():
|
||||
"""Run AutoRuns in the background with VirusTotal checks enabled."""
|
||||
extract_item('Autoruns', filter='autoruns*', silent=True)
|
||||
# Update AutoRuns settings before running
|
||||
for path, settings in AUTORUNS_SETTINGS.items():
|
||||
winreg.CreateKey(HKCU, path)
|
||||
with winreg.OpenKey(HKCU, path, access=winreg.KEY_WRITE) as key:
|
||||
for name, value in settings.items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
||||
popen_program(global_vars['Tools']['AutoRuns'], minimized=True)
|
||||
|
||||
def run_hwinfo_sensors():
|
||||
"""Run HWiNFO sensors."""
|
||||
path = r'{BinDir}\HWiNFO'.format(**global_vars)
|
||||
for bit in [32, 64]:
|
||||
# Configure
|
||||
source = r'{}\general.ini'.format(path)
|
||||
dest = r'{}\HWiNFO{}.ini'.format(path, bit)
|
||||
shutil.copy(source, dest)
|
||||
with open(dest, 'a') as f:
|
||||
f.write('SensorsOnly=1\n')
|
||||
f.write('SummaryOnly=0\n')
|
||||
popen_program(global_vars['Tools']['HWiNFO'])
|
||||
|
||||
def run_xmplay():
|
||||
"""Run XMPlay to test audio."""
|
||||
extract_item('XMPlay', silent=True)
|
||||
cmd = [global_vars['Tools']['XMPlay'],
|
||||
r'{BinDir}\XMPlay\music.7z'.format(**global_vars)]
|
||||
popen_program(cmd)
|
||||
|
||||
def run_hitmanpro():
|
||||
"""Run HitmanPro in the background."""
|
||||
extract_item('HitmanPro', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['HitmanPro'],
|
||||
'/quiet', '/noinstall', '/noupload',
|
||||
r'/log={LogDir}\hitman.xml'.format(**global_vars)]
|
||||
popen_program(cmd)
|
||||
|
||||
def run_process_killer():
|
||||
"""Kill most running processes skipping those in the whitelist.txt."""
|
||||
# borrowed from TronScript (reddit.com/r/TronScript)
|
||||
# credit to /u/cuddlychops06
|
||||
prev_dir = os.getcwd()
|
||||
extract_item('ProcessKiller', silent=True)
|
||||
os.chdir(r'{BinDir}\ProcessKiller'.format(**global_vars))
|
||||
run_program(['ProcessKiller.exe', '/silent'], check=False)
|
||||
os.chdir(prev_dir)
|
||||
|
||||
def run_rkill():
|
||||
"""Run RKill and cleanup afterwards."""
|
||||
extract_item('RKill', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['RKill'],
|
||||
'-l', r'{LogDir}\RKill.log'.format(**global_vars),
|
||||
'-new_console:n', '-new_console:s33V']
|
||||
run_program(cmd, check=False)
|
||||
wait_for_process('RKill')
|
||||
kill_process('notepad.exe')
|
||||
|
||||
# RKill cleanup
|
||||
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
||||
if os.path.exists(desktop_path):
|
||||
for item in os.scandir(desktop_path):
|
||||
if re.search(r'^RKill', item.name, re.IGNORECASE):
|
||||
dest = re.sub(r'^(.*)\.', '\1_{Date-Time}.'.format(
|
||||
**global_vars), item.name)
|
||||
dest = r'{ClientDir}\Info\{name}'.format(
|
||||
name=dest, **global_vars)
|
||||
dest = non_clobber_rename(dest)
|
||||
shutil.move(item.path, dest)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
382
.bin/Scripts/functions/disk.py
Normal file
382
.bin/Scripts/functions/disk.py
Normal file
|
|
@ -0,0 +1,382 @@
|
|||
# Wizard Kit: Functions - Disk
|
||||
|
||||
from functions.common import *
|
||||
from functions import partition_uids
|
||||
|
||||
# Regex
|
||||
REGEX_BAD_PARTITION = re.compile(r'(RAW|Unknown)', re.IGNORECASE)
|
||||
REGEX_DISK_GPT = re.compile(
|
||||
r'Disk ID: {[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+}',
|
||||
re.IGNORECASE)
|
||||
REGEX_DISK_MBR = re.compile(r'Disk ID: [A-Z0-9]+', re.IGNORECASE)
|
||||
REGEX_DISK_RAW = re.compile(r'Disk ID: 00000000', re.IGNORECASE)
|
||||
|
||||
def assign_volume_letters():
|
||||
remove_volume_letters()
|
||||
|
||||
# Write script
|
||||
script = []
|
||||
for vol in get_volumes():
|
||||
script.append('select volume {}'.format(vol['Number']))
|
||||
script.append('assign')
|
||||
|
||||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
def get_boot_mode():
|
||||
boot_mode = 'Legacy'
|
||||
try:
|
||||
reg_key = winreg.OpenKey(
|
||||
winreg.HKEY_LOCAL_MACHINE, r'System\CurrentControlSet\Control')
|
||||
reg_value = winreg.QueryValueEx(reg_key, 'PEFirmwareType')[0]
|
||||
if reg_value == 2:
|
||||
boot_mode = 'UEFI'
|
||||
except:
|
||||
boot_mode = 'Unknown'
|
||||
|
||||
return boot_mode
|
||||
|
||||
def get_disk_details(disk):
|
||||
details = {}
|
||||
script = [
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'detail disk']
|
||||
|
||||
# Run
|
||||
try:
|
||||
result = run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
output = result.stdout.decode().strip()
|
||||
# Remove empty lines
|
||||
tmp = [s.strip() for s in output.splitlines() if s.strip() != '']
|
||||
# Set disk name
|
||||
details['Name'] = tmp[4]
|
||||
# Split each line on ':' skipping those without ':'
|
||||
tmp = [s.split(':') for s in tmp if ':' in s]
|
||||
# Add key/value pairs to the details variable and return dict
|
||||
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
||||
|
||||
return details
|
||||
|
||||
def get_disks():
|
||||
disks = []
|
||||
|
||||
try:
|
||||
# Run script
|
||||
result = run_diskpart(['list disk'])
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
# Append disk numbers
|
||||
output = result.stdout.decode().strip()
|
||||
for tmp in re.findall(r'Disk (\d+)\s+\w+\s+(\d+\s+\w+)', output):
|
||||
num = tmp[0]
|
||||
size = human_readable_size(tmp[1])
|
||||
disks.append({'Number': num, 'Size': size})
|
||||
|
||||
return disks
|
||||
|
||||
def get_partition_details(disk, partition):
|
||||
details = {}
|
||||
script = [
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'select partition {}'.format(partition['Number']),
|
||||
'detail partition']
|
||||
|
||||
# Diskpart details
|
||||
try:
|
||||
# Run script
|
||||
result = run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
# Get volume letter or RAW status
|
||||
output = result.stdout.decode().strip()
|
||||
tmp = re.search(r'Volume\s+\d+\s+(\w|RAW)\s+', output)
|
||||
if tmp:
|
||||
if tmp.group(1).upper() == 'RAW':
|
||||
details['FileSystem'] = RAW
|
||||
else:
|
||||
details['Letter'] = tmp.group(1)
|
||||
# Remove empty lines from output
|
||||
tmp = [s.strip() for s in output.splitlines() if s.strip() != '']
|
||||
# Split each line on ':' skipping those without ':'
|
||||
tmp = [s.split(':') for s in tmp if ':' in s]
|
||||
# Add key/value pairs to the details variable and return dict
|
||||
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
||||
|
||||
# Get MBR type / GPT GUID for extra details on "Unknown" partitions
|
||||
guid = partition_uids.lookup_guid(details.get('Type'))
|
||||
if guid:
|
||||
details.update({
|
||||
'Description': guid.get('Description', '')[:29],
|
||||
'OS': guid.get('OS', 'Unknown')[:27]})
|
||||
|
||||
if 'Letter' in details:
|
||||
# Disk usage
|
||||
try:
|
||||
tmp = psutil.disk_usage('{}:\\'.format(details['Letter']))
|
||||
except OSError as err:
|
||||
details['FileSystem'] = 'Unknown'
|
||||
details['Error'] = err.strerror
|
||||
else:
|
||||
details['Used Space'] = human_readable_size(tmp.used)
|
||||
|
||||
# fsutil details
|
||||
cmd = [
|
||||
'fsutil',
|
||||
'fsinfo',
|
||||
'volumeinfo',
|
||||
'{}:'.format(details['Letter'])
|
||||
]
|
||||
try:
|
||||
result = run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
output = result.stdout.decode().strip()
|
||||
# Remove empty lines from output
|
||||
tmp = [s.strip() for s in output.splitlines() if s.strip() != '']
|
||||
# Add "Feature" lines
|
||||
details['File System Features'] = [s.strip() for s in tmp
|
||||
if ':' not in s]
|
||||
# Split each line on ':' skipping those without ':'
|
||||
tmp = [s.split(':') for s in tmp if ':' in s]
|
||||
# Add key/value pairs to the details variable and return dict
|
||||
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
||||
|
||||
# Set Volume Name
|
||||
details['Name'] = details.get('Volume Name', '')
|
||||
|
||||
# Set FileSystem Type
|
||||
if details.get('FileSystem', '') not in ['RAW', 'Unknown']:
|
||||
details['FileSystem'] = details.get('File System Name', 'Unknown')
|
||||
|
||||
return details
|
||||
|
||||
def get_partitions(disk):
|
||||
partitions = []
|
||||
script = [
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'list partition']
|
||||
|
||||
try:
|
||||
# Run script
|
||||
result = run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
# Append partition numbers
|
||||
output = result.stdout.decode().strip()
|
||||
regex = r'Partition\s+(\d+)\s+\w+\s+(\d+\s+\w+)\s+'
|
||||
for tmp in re.findall(regex, output, re.IGNORECASE):
|
||||
num = tmp[0]
|
||||
size = human_readable_size(tmp[1])
|
||||
partitions.append({'Number': num, 'Size': size})
|
||||
|
||||
return partitions
|
||||
|
||||
def get_table_type(disk):
|
||||
part_type = 'Unknown'
|
||||
script = [
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'uniqueid disk']
|
||||
|
||||
try:
|
||||
result = run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
output = result.stdout.decode().strip()
|
||||
if REGEX_DISK_GPT.search(output):
|
||||
part_type = 'GPT'
|
||||
elif REGEX_DISK_MBR.search(output):
|
||||
part_type = 'MBR'
|
||||
elif REGEX_DISK_RAW.search(output):
|
||||
part_type = 'RAW'
|
||||
|
||||
return part_type
|
||||
|
||||
def get_volumes():
|
||||
vols = []
|
||||
try:
|
||||
result = run_diskpart(['list volume'])
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
# Append volume numbers
|
||||
output = result.stdout.decode().strip()
|
||||
for tmp in re.findall(r'Volume (\d+)\s+([A-Za-z]?)\s+', output):
|
||||
vols.append({'Number': tmp[0], 'Letter': tmp[1]})
|
||||
|
||||
return vols
|
||||
|
||||
def is_bad_partition(par):
|
||||
return 'Letter' not in par or REGEX_BAD_PARTITION.search(par['FileSystem'])
|
||||
|
||||
def prep_disk_for_formatting(disk=None):
|
||||
disk['Format Warnings'] = '\n'
|
||||
width = len(str(len(disk['Partitions'])))
|
||||
|
||||
# Bail early
|
||||
if disk is None:
|
||||
raise Exception('Disk not provided.')
|
||||
|
||||
# Set boot method and partition table type
|
||||
disk['Use GPT'] = True
|
||||
if (get_boot_mode() == 'UEFI'):
|
||||
if (not ask("Setup Windows to use UEFI booting?")):
|
||||
disk['Use GPT'] = False
|
||||
else:
|
||||
if (ask("Setup Windows to use BIOS/Legacy booting?")):
|
||||
disk['Use GPT'] = False
|
||||
|
||||
# Set Display and Warning Strings
|
||||
if len(disk['Partitions']) == 0:
|
||||
disk['Format Warnings'] += 'No partitions found\n'
|
||||
for partition in disk['Partitions']:
|
||||
display = '{size} {fs}'.format(
|
||||
num = partition['Number'],
|
||||
width = width,
|
||||
size = partition['Size'],
|
||||
fs = partition['FileSystem'])
|
||||
|
||||
if is_bad_partition(partition):
|
||||
# Set display string using partition description & OS type
|
||||
display += '\t\t{q}{name}{q}\t{desc} ({os})'.format(
|
||||
display = display,
|
||||
q = '"' if partition['Name'] != '' else '',
|
||||
name = partition['Name'],
|
||||
desc = partition['Description'],
|
||||
os = partition['OS'])
|
||||
else:
|
||||
# List space used instead of partition description & OS type
|
||||
display += ' (Used: {used})\t{q}{name}{q}'.format(
|
||||
used = partition['Used Space'],
|
||||
q = '"' if partition['Name'] != '' else '',
|
||||
name = partition['Name'])
|
||||
# For all partitions
|
||||
partition['Display String'] = display
|
||||
|
||||
def reassign_volume_letter(letter, new_letter='I'):
|
||||
if not letter:
|
||||
# Ignore
|
||||
return None
|
||||
script = [
|
||||
'select volume {}'.format(letter),
|
||||
'remove noerr',
|
||||
'assign letter={}'.format(new_letter)]
|
||||
try:
|
||||
run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
return new_letter
|
||||
|
||||
def remove_volume_letters(keep=None):
|
||||
if not keep:
|
||||
keep = ''
|
||||
|
||||
script = []
|
||||
for vol in get_volumes():
|
||||
if vol['Letter'].upper() != keep.upper():
|
||||
script.append('select volume {}'.format(vol['Number']))
|
||||
script.append('remove noerr')
|
||||
|
||||
# Run script
|
||||
try:
|
||||
run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
def run_diskpart(script):
|
||||
tempfile = r'{}\diskpart.script'.format(global_vars['Env']['TMP'])
|
||||
|
||||
# Write script
|
||||
with open(tempfile, 'w') as f:
|
||||
for line in script:
|
||||
f.write('{}\n'.format(line))
|
||||
|
||||
# Run script
|
||||
cmd = [
|
||||
r'{}\Windows\System32\diskpart.exe'.format(
|
||||
global_vars['Env']['SYSTEMDRIVE']),
|
||||
'/s', tempfile]
|
||||
result = run_program(cmd)
|
||||
sleep(2)
|
||||
return result
|
||||
|
||||
def scan_disks():
|
||||
"""Get details about the attached disks"""
|
||||
disks = get_disks()
|
||||
|
||||
# Get disk details
|
||||
for disk in disks:
|
||||
# Get partition style
|
||||
disk['Table'] = get_table_type(disk)
|
||||
|
||||
# Get disk name/model and physical details
|
||||
disk.update(get_disk_details(disk))
|
||||
|
||||
# Get partition info for disk
|
||||
disk['Partitions'] = get_partitions(disk)
|
||||
|
||||
for partition in disk['Partitions']:
|
||||
# Get partition details
|
||||
partition.update(get_partition_details(disk, partition))
|
||||
|
||||
# Done
|
||||
return disks
|
||||
|
||||
def select_disk(title='Which disk?', disks=[]):
|
||||
"""Select a disk from the attached disks"""
|
||||
# Build menu
|
||||
disk_options = []
|
||||
for disk in disks:
|
||||
display_name = '{}\t[{}] ({}) {}'.format(
|
||||
disk.get('Size', ''),
|
||||
disk.get('Table', ''),
|
||||
disk.get('Type', ''),
|
||||
disk.get('Name', 'Unknown'),
|
||||
)
|
||||
pwidth=len(str(len(disk['Partitions'])))
|
||||
for partition in disk['Partitions']:
|
||||
# Main text
|
||||
p_name = 'Partition {num:>{width}}: {size} ({fs})'.format(
|
||||
num = partition['Number'],
|
||||
width = pwidth,
|
||||
size = partition['Size'],
|
||||
fs = partition['FileSystem'])
|
||||
if partition['Name']:
|
||||
p_name += '\t"{}"'.format(partition['Name'])
|
||||
|
||||
# Show unsupported partition(s)
|
||||
if is_bad_partition(partition):
|
||||
p_name = '{YELLOW}{p_name}{CLEAR}'.format(
|
||||
p_name=p_name, **COLORS)
|
||||
|
||||
display_name += '\n\t\t\t{}'.format(p_name)
|
||||
if not disk['Partitions']:
|
||||
display_name += '\n\t\t\t{}No partitions found.{}'.format(
|
||||
COLORS['YELLOW'], COLORS['CLEAR'])
|
||||
|
||||
disk_options.append({'Name': display_name, 'Disk': disk})
|
||||
actions = [
|
||||
{'Name': 'Main Menu', 'Letter': 'M'},
|
||||
]
|
||||
|
||||
# Menu loop
|
||||
selection = menu_select(
|
||||
title = title,
|
||||
main_entries = disk_options,
|
||||
action_entries = actions)
|
||||
|
||||
if (selection.isnumeric()):
|
||||
return disk_options[int(selection)-1]['Disk']
|
||||
elif (selection == 'M'):
|
||||
raise GenericAbort
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
465
.bin/Scripts/functions/info.py
Normal file
465
.bin/Scripts/functions/info.py
Normal file
|
|
@ -0,0 +1,465 @@
|
|||
# Wizard Kit: Functions - Information
|
||||
|
||||
from borrowed import knownpaths
|
||||
from operator import itemgetter
|
||||
|
||||
from functions.common import *
|
||||
from functions.activation import *
|
||||
|
||||
# Regex
|
||||
REGEX_OFFICE = re.compile(
|
||||
r'(Microsoft (Office\s+'
|
||||
r'(365|Enterprise|Home|Pro(\s|fessional)'
|
||||
r'|Single|Small|Standard|Starter|Ultimate|system)'
|
||||
r'|Works[-\s\d]+\d)'
|
||||
r'|(Libre|Open|Star)\s*Office'
|
||||
r'|WordPerfect|Gnumeric|Abiword)',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
REG_PROFILE_LIST = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
|
||||
REG_SHELL_FOLDERS = r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'
|
||||
TMP_HIVE_PATH = 'TEMP_HIVE_MOUNT'
|
||||
EXTRA_FOLDERS = [
|
||||
'Dropbox',
|
||||
'Google Drive',
|
||||
'OneDrive',
|
||||
'SkyDrive',
|
||||
]
|
||||
SHELL_FOLDERS = {
|
||||
#GUIDs from: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
|
||||
'Desktop': (
|
||||
'{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}',
|
||||
),
|
||||
'Documents': (
|
||||
'Personal',
|
||||
'{FDD39AD0-238F-46AF-ADB4-6C85480369C7}',
|
||||
),
|
||||
'Downloads': (
|
||||
'{374DE290-123F-4565-9164-39C4925E467B}',
|
||||
),
|
||||
'Favorites': (
|
||||
'{1777F761-68AD-4D8A-87BD-30B759FA33DD}',
|
||||
),
|
||||
'Music': (
|
||||
'My Music',
|
||||
'{4BD8D571-6D19-48D3-BE97-422220080E43}',
|
||||
),
|
||||
'Pictures': (
|
||||
'My Pictures',
|
||||
'{33E28130-4E1E-4676-835A-98395C3BC3BB}',
|
||||
),
|
||||
'Videos': (
|
||||
'My Video',
|
||||
'{18989B1D-99B5-455B-841C-AB7C74E4DDFC}',
|
||||
),
|
||||
}
|
||||
|
||||
def backup_file_list():
|
||||
"""Export current file listing for the system."""
|
||||
extract_item('Everything', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['Everything'],
|
||||
'-nodb',
|
||||
'-create-filelist',
|
||||
r'{LogDir}\File List.txt'.format(**global_vars),
|
||||
global_vars['Env']['SYSTEMDRIVE']]
|
||||
run_program(cmd)
|
||||
|
||||
def backup_power_plans():
|
||||
"""Export current power plans."""
|
||||
os.makedirs(r'{BackupDir}\Power Plans'.format(**global_vars), exist_ok=True)
|
||||
plans = run_program(['powercfg', '/L'])
|
||||
plans = plans.stdout.decode().splitlines()
|
||||
plans = [p for p in plans if re.search(r'^Power Scheme', p)]
|
||||
for p in plans:
|
||||
guid = re.sub(r'Power Scheme GUID:\s+([0-9a-f\-]+).*', r'\1', p)
|
||||
name = re.sub(
|
||||
r'Power Scheme GUID:\s+[0-9a-f\-]+\s+\(([^\)]+)\).*', r'\1', p)
|
||||
out = r'{BackupDir}\Power Plans\{name}.pow'.format(
|
||||
name=name, **global_vars)
|
||||
if not os.path.exists(out):
|
||||
cmd = ['powercfg', '-export', out, guid]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
def backup_registry():
|
||||
"""Backup registry including user hives."""
|
||||
extract_item('erunt', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['ERUNT'],
|
||||
r'{BackupDir}\Registry'.format(**global_vars),
|
||||
'sysreg',
|
||||
'curuser',
|
||||
'otherusers',
|
||||
'/noprogresswindow']
|
||||
run_program(cmd)
|
||||
|
||||
def get_folder_size(path):
|
||||
"""Get (human-readable) size of folder passed, returns str."""
|
||||
size = 'Unknown'
|
||||
cmd = [global_vars['Tools']['Du'], '-nobanner', '-q', path]
|
||||
try:
|
||||
out = run_program(cmd)
|
||||
except FileNotFoundError:
|
||||
# Failed to find folder
|
||||
pass
|
||||
except subprocess.CalledProcessError:
|
||||
# Failed to get folder size
|
||||
pass
|
||||
else:
|
||||
size = out.stdout.decode().splitlines()[4]
|
||||
size = re.sub(r'Size:\s+([\d,]+)\sbytes$', r'\1', size)
|
||||
size = size.replace(',', '')
|
||||
size = human_readable_size(size)
|
||||
return size
|
||||
|
||||
def get_installed_office():
|
||||
"""Get list of installed Office programs."""
|
||||
programs = []
|
||||
log_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
|
||||
**global_vars)
|
||||
with open (log_file, 'r') as f:
|
||||
for line in sorted(f.readlines()):
|
||||
if REGEX_OFFICE.search(line):
|
||||
programs.append(line[4:82].strip())
|
||||
|
||||
if len(programs) == 0:
|
||||
programs = ['No programs found']
|
||||
return programs
|
||||
|
||||
def get_shell_path(folder, user='current'):
|
||||
"""Get shell path using SHGetKnownFolderPath via knownpaths, returns str.
|
||||
|
||||
NOTE: Only works for the current user.
|
||||
Code based on https://gist.github.com/mkropat/7550097
|
||||
"""
|
||||
path = None
|
||||
folderid = None
|
||||
if user.lower() == 'public':
|
||||
user = 'common'
|
||||
try:
|
||||
folderid = getattr(knownpaths.FOLDERID, folder)
|
||||
except AttributeError:
|
||||
# Unknown folder ID, ignore and return None
|
||||
pass
|
||||
|
||||
if folderid:
|
||||
try:
|
||||
path = knownpaths.get_path(folderid, getattr(knownpaths.UserHandle, user))
|
||||
except PathNotFoundError:
|
||||
# Folder not found, ignore and return None
|
||||
pass
|
||||
|
||||
return path
|
||||
|
||||
def get_user_data_paths(user):
|
||||
"""Get user data paths for provided user, returns dict."""
|
||||
hive_path = user['SID']
|
||||
paths = {
|
||||
'Profile': {
|
||||
'Path': None,
|
||||
},
|
||||
'Shell Folders': {},
|
||||
'Extra Folders': {},
|
||||
}
|
||||
unload_hive = False
|
||||
|
||||
if user['Name'] == global_vars['Env']['USERNAME']:
|
||||
# We can use SHGetKnownFolderPath for the current user
|
||||
paths['Profile']['Path'] = get_shell_path('Profile')
|
||||
paths['Shell Folders'] = {f: {'Path': get_shell_path(f)}
|
||||
for f in SHELL_FOLDERS.keys()}
|
||||
else:
|
||||
# We have to use the NTUSER.dat hives which isn't recommended by MS
|
||||
try:
|
||||
key_path = r'{}\{}'.format(REG_PROFILE_LIST, user['SID'])
|
||||
with winreg.OpenKey(HKLM, key_path) as key:
|
||||
paths['Profile']['Path'] = winreg.QueryValueEx(
|
||||
key, 'ProfileImagePath')[0]
|
||||
except Exception:
|
||||
# Profile path not found, leaving as None.
|
||||
pass
|
||||
|
||||
# Shell folders (Prep)
|
||||
if not reg_path_exists(HKU, hive_path) and paths['Profile']['Path']:
|
||||
# User not logged-in, loading hive
|
||||
# Also setting unload_hive so it will be unloaded later.
|
||||
hive_path = TMP_HIVE_PATH
|
||||
cmd = ['reg', 'load', r'HKU\{}'.format(TMP_HIVE_PATH),
|
||||
r'{}\NTUSER.DAT'.format(paths['Profile']['Path'])]
|
||||
unload_hive = True
|
||||
try:
|
||||
run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
# Failed to load user hive
|
||||
pass
|
||||
|
||||
# Shell folders
|
||||
shell_folders = r'{}\{}'.format(hive_path, REG_SHELL_FOLDERS)
|
||||
if (reg_path_exists(HKU, hive_path)
|
||||
and reg_path_exists(HKU, shell_folders)):
|
||||
with winreg.OpenKey(HKU, shell_folders) as key:
|
||||
for folder, values in SHELL_FOLDERS.items():
|
||||
for value in values:
|
||||
try:
|
||||
path = winreg.QueryValueEx(key, value)[0]
|
||||
except FileNotFoundError:
|
||||
# Skip missing values
|
||||
pass
|
||||
else:
|
||||
paths['Shell Folders'][folder] = {'Path': path}
|
||||
# Stop checking values for this folder
|
||||
break
|
||||
|
||||
# Shell folder (extra check)
|
||||
if paths['Profile']['Path']:
|
||||
for folder in SHELL_FOLDERS.keys():
|
||||
folder_path = r'{Path}\{folder}'.format(
|
||||
folder=folder, **paths['Profile'])
|
||||
if (folder not in paths['Shell Folders']
|
||||
and os.path.exists(folder_path)):
|
||||
paths['Shell Folders'][folder] = {'Path': folder_path}
|
||||
|
||||
# Extra folders
|
||||
if paths['Profile']['Path']:
|
||||
for folder in EXTRA_FOLDERS:
|
||||
folder_path = r'{Path}\{folder}'.format(
|
||||
folder=folder, **paths['Profile'])
|
||||
if os.path.exists(folder_path):
|
||||
paths['Extra Folders'][folder] = {'Path': folder_path}
|
||||
|
||||
# Shell folders (cleanup)
|
||||
if unload_hive:
|
||||
cmd = ['reg', 'unload', r'HKU\{}'.format(TMP_HIVE_PATH)]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Done
|
||||
return paths
|
||||
|
||||
def get_user_folder_sizes(users):
|
||||
"""Update list(users) to include folder paths and sizes."""
|
||||
extract_item('du', filter='du*', silent=True)
|
||||
# Configure Du
|
||||
winreg.CreateKey(HKCU, r'Software\Sysinternals\Du')
|
||||
with winreg.OpenKey(HKCU,
|
||||
r'Software\Sysinternals\Du', access=winreg.KEY_WRITE) as key:
|
||||
winreg.SetValueEx(key, 'EulaAccepted', 0, winreg.REG_DWORD, 1)
|
||||
|
||||
for u in users:
|
||||
u.update(get_user_data_paths(u))
|
||||
if u['Profile']['Path']:
|
||||
u['Profile']['Size'] = get_folder_size(u['Profile']['Path'])
|
||||
for folder in u['Shell Folders'].keys():
|
||||
u['Shell Folders'][folder]['Size'] = get_folder_size(
|
||||
u['Shell Folders'][folder]['Path'])
|
||||
for folder in u['Extra Folders'].keys():
|
||||
u['Extra Folders'][folder]['Size'] = get_folder_size(
|
||||
u['Extra Folders'][folder]['Path'])
|
||||
|
||||
def get_user_list():
|
||||
"""Get user list via WMIC, returns list of dicts."""
|
||||
users = []
|
||||
|
||||
# Get user info from WMI
|
||||
cmd = ['wmic', 'useraccount', 'get', '/format:csv']
|
||||
try:
|
||||
out = run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
# Meh, return empty list to avoid a full crash
|
||||
return users
|
||||
|
||||
entries = out.stdout.decode().splitlines()
|
||||
entries = [e.strip().split(',') for e in entries if e.strip()]
|
||||
|
||||
# Add user(s) to dict
|
||||
keys = entries[0]
|
||||
for e in entries[1:]:
|
||||
# Create dict using 1st line (keys)
|
||||
e = dict(zip(keys, e))
|
||||
# Set Active status via 'Disabled' TRUE/FALSE str
|
||||
e['Active'] = bool(e['Disabled'].upper() == 'FALSE')
|
||||
# Assume SIDs ending with 1000+ are "Standard" and others are "System"
|
||||
e['Type'] = 'Standard' if re.search(r'-1\d+$', e['SID']) else 'System'
|
||||
users.append(e)
|
||||
|
||||
# Sort list
|
||||
users.sort(key=itemgetter('Name'))
|
||||
|
||||
# Done
|
||||
return users
|
||||
|
||||
def reg_path_exists(hive, path):
|
||||
"""Test if specified path exists, returns bool."""
|
||||
try:
|
||||
winreg.QueryValue(hive, path)
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def run_aida64():
|
||||
"""Run AIDA64 to save system reports."""
|
||||
extract_item('AIDA64', silent=True)
|
||||
# All system info
|
||||
config = r'{BinDir}\AIDA64\full.rpf'.format(**global_vars)
|
||||
report_file = r'{LogDir}\System Information (AIDA64).html'.format(
|
||||
**global_vars)
|
||||
if not os.path.exists(report_file):
|
||||
cmd = [
|
||||
global_vars['Tools']['AIDA64'],
|
||||
'/R', report_file,
|
||||
'/CUSTOM', config,
|
||||
'/HTML', '/SILENT', '/SAFEST']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Installed Programs
|
||||
config = r'{BinDir}\AIDA64\installed_programs.rpf'.format(**global_vars)
|
||||
report_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
|
||||
**global_vars)
|
||||
if not os.path.exists(report_file):
|
||||
cmd = [
|
||||
global_vars['Tools']['AIDA64'],
|
||||
'/R', report_file,
|
||||
'/CUSTOM', config,
|
||||
'/TEXT', '/SILENT', '/SAFEST']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Product Keys
|
||||
config = r'{BinDir}\AIDA64\licenses.rpf'.format(**global_vars)
|
||||
report_file = r'{LogDir}\Product Keys (AIDA64).txt'.format(**global_vars)
|
||||
if not os.path.exists(report_file):
|
||||
cmd = [
|
||||
global_vars['Tools']['AIDA64'],
|
||||
'/R', report_file,
|
||||
'/CUSTOM', config,
|
||||
'/TEXT', '/SILENT', '/SAFEST']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
def run_bleachbit():
|
||||
"""Run BleachBit preview and save log.
|
||||
|
||||
This is a preview so no files should be deleted."""
|
||||
if not os.path.exists(global_vars['LogDir']+r'\BleachBit.log'):
|
||||
extract_item('BleachBit', silent=True)
|
||||
cmd = [global_vars['Tools']['BleachBit'], '--preview', '--preset']
|
||||
out = run_program(cmd, check=False)
|
||||
# Save stderr
|
||||
if out.stderr.decode().splitlines():
|
||||
with open(global_vars['LogDir']+r'\BleachBit.err', 'a') as f:
|
||||
for line in out.stderr.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
# Save stdout
|
||||
with open(global_vars['LogDir']+r'\BleachBit.log', 'a') as f:
|
||||
for line in out.stdout.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
|
||||
def show_disk_usage(disk):
|
||||
"""Show free and used space for a specified disk."""
|
||||
print_standard('{:5}'.format(disk.device.replace('/', ' ')),
|
||||
end='', flush=True, timestamp=False)
|
||||
try:
|
||||
usage = psutil.disk_usage(disk.device)
|
||||
display_string = '{percent:>5.2f}% Free ({free} / {total})'.format(
|
||||
percent = 100 - usage.percent,
|
||||
free = human_readable_size(usage.free, 2),
|
||||
total = human_readable_size(usage.total, 2))
|
||||
if usage.percent > 85:
|
||||
print_error(display_string, timestamp=False)
|
||||
elif usage.percent > 75:
|
||||
print_warning(display_string, timestamp=False)
|
||||
else:
|
||||
print_standard(display_string, timestamp=False)
|
||||
except Exception:
|
||||
print_warning('Unknown', timestamp=False)
|
||||
|
||||
def show_free_space(indent=8, width=32):
|
||||
"""Show free space info for all fixed disks."""
|
||||
message = 'Free Space:'
|
||||
for disk in psutil.disk_partitions():
|
||||
try:
|
||||
if 'fixed' in disk.opts:
|
||||
try_and_print(message=message, function=show_disk_usage,
|
||||
ns='Unknown', silent_function=False,
|
||||
indent=indent, width=width, disk=disk)
|
||||
message = ''
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def show_installed_ram():
|
||||
"""Show installed RAM."""
|
||||
mem = psutil.virtual_memory()
|
||||
if mem.total > 5905580032:
|
||||
# > 5.5 Gb so 6Gb or greater
|
||||
print_standard(human_readable_size(mem.total).strip(), timestamp=False)
|
||||
elif mem.total > 3758096384:
|
||||
# > 3.5 Gb so 4Gb or greater
|
||||
print_warning(human_readable_size(mem.total).strip(), timestamp=False)
|
||||
else:
|
||||
print_error(human_readable_size(mem.total).strip(), timestamp=False)
|
||||
|
||||
def show_os_activation():
|
||||
"""Show OS activation info."""
|
||||
act_str = get_activation_string()
|
||||
if windows_is_activated():
|
||||
print_standard(act_str, timestamp=False)
|
||||
elif re.search(r'unavailable', act_str, re.IGNORECASE):
|
||||
print_warning(act_str, timestamp=False)
|
||||
else:
|
||||
print_error(act_str, timestamp=False)
|
||||
|
||||
def show_os_name():
|
||||
"""Show extended OS name (including warnings)."""
|
||||
os_name = global_vars['OS']['DisplayName']
|
||||
if global_vars['OS']['Arch'] == 32:
|
||||
# Show all 32-bit installs as an error message
|
||||
print_error(os_name, timestamp=False)
|
||||
else:
|
||||
if re.search(r'(unrecognized|very outdated)', os_name, re.IGNORECASE):
|
||||
print_error(os_name, timestamp=False)
|
||||
elif re.search(r'outdated', os_name, re.IGNORECASE):
|
||||
print_warning(os_name, timestamp=False)
|
||||
else:
|
||||
print_standard(os_name, timestamp=False)
|
||||
|
||||
def show_temp_files_size():
|
||||
"""Show total size of temp files identified by BleachBit."""
|
||||
size = None
|
||||
with open(r'{LogDir}\BleachBit.log'.format(**global_vars), 'r') as f:
|
||||
for line in f.readlines():
|
||||
if re.search(r'^disk space to be recovered:', line, re.IGNORECASE):
|
||||
size = re.sub(r'.*: ', '', line.strip())
|
||||
size = re.sub(r'(\w)iB$', r' \1b', size)
|
||||
if size is None:
|
||||
print_warning(size, timestamp=False)
|
||||
else:
|
||||
print_standard(size, timestamp=False)
|
||||
|
||||
def show_user_data_summary(indent=8, width=32):
|
||||
"""Print user data folder sizes for all users."""
|
||||
users = get_user_list()
|
||||
users = [u for u in users if u['Active']]
|
||||
get_user_folder_sizes(users)
|
||||
for user in users:
|
||||
print_success('{indent}User: {user}'.format(
|
||||
indent = ' '*int(indent/2),
|
||||
user = user['Name']))
|
||||
for section in ['Profile', None, 'Shell Folders', 'Extra Folders']:
|
||||
folders = []
|
||||
if section is None:
|
||||
# Divider
|
||||
print_standard('{}{}'.format(' '*indent, '-'*(width+6)))
|
||||
elif section == 'Profile':
|
||||
folders = {'Profile': user['Profile']}
|
||||
else:
|
||||
folders = user[section]
|
||||
for folder in folders:
|
||||
print_standard(
|
||||
'{indent}{folder:<{width}}{size:>6} ({path})'.format(
|
||||
indent = ' ' * indent,
|
||||
width = width,
|
||||
folder = folder,
|
||||
size = folders[folder]['Size'],
|
||||
path = folders[folder]['Path']))
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
326
.bin/Scripts/functions/partition_uids.py
Normal file
326
.bin/Scripts/functions/partition_uids.py
Normal file
|
|
@ -0,0 +1,326 @@
|
|||
# Wizard Kit: Functions - PARTITION UIDs
|
||||
# sources: https://en.wikipedia.org/wiki/GUID_Partition_Table
|
||||
# https://en.wikipedia.org/wiki/Partition_type
|
||||
# NOTE: Info has been trimmed for brevity. As such, there may be some inaccuracy.
|
||||
|
||||
PARTITION_UIDS = {
|
||||
'00': {'OS': 'All','Description': 'Empty partition entry'},
|
||||
'01': {'OS': 'DOS','Description': 'FAT12 as primary partition'},
|
||||
'02': {'OS': 'XENIX','Description': 'XENIX root'},
|
||||
'03': {'OS': 'XENIX','Description': 'XENIX usr'},
|
||||
'04': {'OS': 'DOS','Description': 'FAT16 with less than 32 MB'},
|
||||
'05': {'OS': 'DOS / SpeedStor','Description': 'Extended partition'},
|
||||
'06': {'OS': 'DOS1+','Description': 'FAT16B [over 65K sectors]'},
|
||||
'07': {'OS': 'Windows / OS/2 / QNX 2','Description': 'NTFS/exFAT/HPFS/IFS/QNX'},
|
||||
'08': {'OS': 'CBM / DOS / OS/2 / AIX /QNX','Description': 'FAT12-16/AIX/QNY/SplitDrive'},
|
||||
'09': {'OS': 'AIX / QNX / Coherent / OS-9','Description': 'AIX/QNZ/Coherent/RBF'},
|
||||
'0A': {'OS': 'OS/2 / Coherent','Description': 'Boot Manager / Swap'},
|
||||
'0B': {'OS': 'DOS','Description': 'FAT32 with CHS addressing'},
|
||||
'0C': {'OS': 'DOS','Description': 'FAT32 with LBA'},
|
||||
'0D': {'OS': 'Silicon Safe','Description': 'Reserved'},
|
||||
'0E': {'OS': 'DOS','Description': 'FAT16B with LBA'},
|
||||
'0F': {'OS': 'DOS','Description': 'Extended partition with LBA'},
|
||||
'10': {'OS': 'OPUS','Description': 'Unknown'},
|
||||
'11': {'OS': 'Leading Edge MS-DOS / OS/2','Description': 'FAT12/FAT16'},
|
||||
'12': {'OS': 'Compaq Contura','Description': 'conf/diag/hiber/rescue/serv'},
|
||||
'14': {'OS': 'AST DOS / OS/2 / MaverickOS','Description': 'FAT12/FAT16/Omega'},
|
||||
'15': {'OS': 'OS/2 / Maverick OS','Description': 'Hidden extended / Swap'},
|
||||
'16': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16B'},
|
||||
'17': {'OS': 'OS/2 Boot Manager','Description': 'Hidden IFS/HPFS/NTFS/exFAT'},
|
||||
'18': {'OS': 'AST Windows','Description': '0-Volt Suspend/SmartSleep'},
|
||||
'19': {'OS': 'Willowtech Photon coS','Description': 'Willowtech Photon coS'},
|
||||
'1B': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32'},
|
||||
'1C': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32 with LBA'},
|
||||
'1E': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16 with LBA'},
|
||||
'1F': {'OS': 'OS/2 Boot Manager','Description': 'Hidden extended with LBA'},
|
||||
'20': {'OS': 'Windows Mobile','Description': 'update XIP/Willowsoft OFS1'},
|
||||
'21': {'OS': 'Oxygen','Description': 'SpeedStor / FSo2'},
|
||||
'22': {'OS': 'Oxygen','Description': 'Oxygen Extended Partition'},
|
||||
'23': {'OS': 'Windows Mobile','Description': 'Reserved / boot XIP'},
|
||||
'24': {'OS': 'NEC MS-DOS0','Description': 'Logical FAT12 or FAT16'},
|
||||
'25': {'OS': 'Windows Mobile','Description': 'IMGFS[citation needed]'},
|
||||
'26': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'27': {'OS': 'Win/PQserv/MirOS/RooterBOOT','Description': 'WinRE/Rescue/MirOS/RooterBOOT'},
|
||||
'2A': {'OS': 'AtheOS','Description': 'AthFS/AFS/Reserved'},
|
||||
'2B': {'OS': 'SyllableOS','Description': 'SyllableSecure (SylStor)'},
|
||||
'31': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'32': {'OS': 'NOS','Description': 'Unknown'},
|
||||
'33': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'34': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'35': {'OS': 'OS/2 Server /eComStation','Description': 'JFS'},
|
||||
'36': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'38': {'OS': 'THEOS','Description': 'THEOS version 3.2, 2 GB'},
|
||||
'39': {'OS': 'Plan 9 / THEOS','Description': 'Plan 9 edition 3 / THEOS v4'},
|
||||
'3A': {'OS': 'THEOS','Description': 'THEOS v4, 4 GB'},
|
||||
'3B': {'OS': 'THEOS','Description': 'THEOS v4 extended'},
|
||||
'3C': {'OS': 'PartitionMagic','Description': 'PqRP (image in progress)'},
|
||||
'3D': {'OS': 'PartitionMagic','Description': 'Hidden NetWare'},
|
||||
'3F': {'OS': 'OS/32','Description': 'Unknown'},
|
||||
'40': {'OS': 'PICK / Venix','Description': 'PICK R83 / Venix 80286'},
|
||||
'41': {'OS': 'RISC / Linux / PowerPC','Description': 'Boot / Old Linux/Minix'},
|
||||
'42': {'OS': 'SFS / Linux / Win2K/XP/etc','Description': 'SFS / Old Linux Swap'},
|
||||
'43': {'OS': 'Linux','Description': 'Old Linux native'},
|
||||
'44': {'OS': 'GoBack','Description': 'Norton/WildFire/Adaptec/Roxio'},
|
||||
'45': {'OS': 'Boot-US / EUMEL/ELAN','Description': 'Priam/Boot/EUMEL/ELAN (L2)'},
|
||||
'46': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||
'47': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||
'48': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2), ERGOS L3'},
|
||||
'4A': {'OS': 'AdaOS / ALFS/THIN','Description': 'Aquila / ALFS/THIN'},
|
||||
'4C': {'OS': 'ETH Oberon','Description': 'Aos (A2) file system (76)'},
|
||||
'4D': {'OS': 'QNX Neutrino','Description': 'Primary QNX POSIX volume'},
|
||||
'4E': {'OS': 'QNX Neutrino','Description': 'Secondary QNX POSIX volume'},
|
||||
'4F': {'OS': 'QNX Neutrino / ETH Oberon','Description': '3rd QNX POSIX/Boot/Native'},
|
||||
'50': {'OS': 'DiskMan4/ETH/LynxOS/Novell','Description': 'Alt FS/Read-only/Lynx RTOS'},
|
||||
'51': {'OS': 'Disk Manager 4-6','Description': 'R/W partition (Aux 1)'},
|
||||
'52': {'OS': 'CP/M-80/ System V/AT, V/386','Description': 'CP/M-80'},
|
||||
'53': {'OS': 'Disk Manager 6','Description': 'Auxiliary 3 (WO)'},
|
||||
'54': {'OS': 'Disk Manager 6','Description': 'Dynamic Drive Overlay (DDO)'},
|
||||
'55': {'OS': 'EZ-Drive','Description': 'Maxtor/MaxBlast/DriveGuide'},
|
||||
'56': {'OS': 'AT&T DOS/EZ-Drive/VFeature','Description': 'FAT12~16/EZ-BIOS/VFeature'},
|
||||
'57': {'OS': 'DrivePro','Description': 'VNDI partition'},
|
||||
'5C': {'OS': 'EDISK','Description': 'Priam EDisk Volume'},
|
||||
'61': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'63': {'OS': 'Unix','Description': 'Unix,ISC,SysV,ix,BSD,HURD'},
|
||||
'64': {'OS': 'SpeedStor / NetWare','Description': 'NetWare FS 286/2,PC-ARMOUR'},
|
||||
'65': {'OS': 'NetWare','Description': 'NetWare File System 386'},
|
||||
'66': {'OS': 'NetWare / NetWare','Description': 'NetWare FS 386 / SMS'},
|
||||
'67': {'OS': 'NetWare','Description': 'Wolf Mountain'},
|
||||
'68': {'OS': 'NetWare','Description': 'Unknown'},
|
||||
'69': {'OS': 'NetWare 5 / NetWare','Description': 'Novell Storage Services'},
|
||||
'6E': {'Description': 'Unknown'},
|
||||
'70': {'OS': 'DiskSecure','Description': 'DiskSecure multiboot'},
|
||||
'71': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'72': {'OS': 'APTI systems / Unix V7/x86','Description': 'APTI altFAT12 / V7 / x86'},
|
||||
'73': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'74': {'OS': 'Microsoft, IBM','Description': 'Reserved / Scramdisk'},
|
||||
'75': {'OS': 'PC/IX','Description': 'Unknown'},
|
||||
'76': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'77': {'OS': 'Novell','Description': 'VNDI, M2FS, M2CS'},
|
||||
'78': {'OS': 'Geurt Vos','Description': 'XOSL bootloader file system'},
|
||||
'79': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (CHS, SFN)'},
|
||||
'7A': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (LBA, SFN)'},
|
||||
'7B': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16B (CHS, SFN)'},
|
||||
'7C': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (LBA, SFN)'},
|
||||
'7D': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (CHS, SFN)'},
|
||||
'7E': {'OS': 'F.I.X. (claim) / PrimoCache','Description': 'Level 2 cache'},
|
||||
'7F': {'OS': 'Varies','Description': 'AltOS DevPartition Standard'},
|
||||
'80': {'OS': 'Minix 1.1-1.4a','Description': 'Minix file system (old)'},
|
||||
'81': {'OS': 'Minix 1.4b+ / Linux','Description': 'MINIX FS/Mitac AdvDiskManager'},
|
||||
'82': {'OS': 'Linux / Sun Microsystems','Description': 'Swap / Solaris x86 / Prime'},
|
||||
'83': {'OS': 'GNU/Linux','Description': 'Any native Linux FS'},
|
||||
'84': {'OS': 'OS/2 / Windows 7','Description': 'Hibernat/HiddenC/RapidStart'},
|
||||
'85': {'OS': 'GNU/Linux','Description': 'Linux extended'},
|
||||
'86': {'OS': 'Windows NT 4 Server / Linux','Description': 'FAT16B mirror/LinuxRAID-old'},
|
||||
'87': {'OS': 'Windows NT 4 Server','Description': 'HPFS/NTFS mirrored volume'},
|
||||
'88': {'OS': 'GNU/Linux','Description': 'Plaintext partition table'},
|
||||
'8A': {'OS': 'AiR-BOOT','Description': 'Linux kernel image'},
|
||||
'8B': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||
'8C': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||
'8D': {'OS': 'Free FDISK','Description': 'Hidden FAT12'},
|
||||
'8E': {'OS': 'Linux','Description': 'Linux LVM'},
|
||||
'90': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||
'91': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||
'92': {'OS': 'Free FDISK','Description': 'Hidden FAT16B'},
|
||||
'93': {'OS': 'Amoeba / Linux','Description': 'Amoeba native/Hidden Linux'},
|
||||
'94': {'OS': 'Amoeba','Description': 'Amoeba bad block table'},
|
||||
'95': {'OS': 'EXOPC','Description': 'EXOPC native'},
|
||||
'96': {'OS': 'CHRP','Description': 'ISO-9660 file system'},
|
||||
'97': {'OS': 'Free FDISK','Description': 'Hidden FAT32'},
|
||||
'98': {'OS': 'Free FDISK / ROM-DOS','Description': 'Hidden FAT32 / service part'},
|
||||
'99': {'OS': 'early Unix','Description': 'Unknown'},
|
||||
'9A': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||
'9B': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||
'9E': {'OS': 'VSTA / ForthOS','Description': 'ForthOS (eForth port)'},
|
||||
'9F': {'OS': 'BSD/OS 3.0+, BSDI','Description': 'Unknown'},
|
||||
'A0': {'OS': 'HP/Phoenix/IBM/Toshiba/Sony','Description': 'Diagnostic for HP/Hibernate'},
|
||||
'A1': {'OS': 'HP / Phoenix, NEC','Description': 'HP Vol Expansion/Hibernate'},
|
||||
'A2': {'OS': 'Cyclone V','Description': 'Hard Processor System (HPS)'},
|
||||
'A3': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'A4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'A5': {'OS': 'BSD','Description': 'BSD slice'},
|
||||
'A6': {'OS': 'OpenBSD','Description': 'HP Vol Expansion/BSD slice'},
|
||||
'A7': {'OS': 'NeXT','Description': 'NeXTSTEP'},
|
||||
'A8': {'OS': 'Darwin, Mac OS X','Description': 'Apple Darwin, Mac OS X UFS'},
|
||||
'A9': {'OS': 'NetBSD','Description': 'NetBSD slice'},
|
||||
'AA': {'OS': 'MS-DOS','Description': 'Olivetti DOS FAT12(1.44 MB)'},
|
||||
'AB': {'OS': 'Darwin, Mac OS X / GO! OS','Description': 'Apple Darwin/OS X boot/GO!'},
|
||||
'AD': {'OS': 'RISC OS','Description': 'ADFS / FileCore format'},
|
||||
'AE': {'OS': 'ShagOS','Description': 'ShagOS file system'},
|
||||
'AF': {'OS': 'ShagOS','Description': 'OS X HFS & HFS+/ShagOS Swap'},
|
||||
'B0': {'OS': 'Boot-Star','Description': 'Boot-Star dummy partition'},
|
||||
'B1': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||
'B2': {'OS': 'QNX 6.x','Description': 'QNX Neutrino power-safe FS'},
|
||||
'B3': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||
'B4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'B6': {'OS': 'Windows NT 4 Server','Description': 'HPVolExpansion/FAT16Bmirror'},
|
||||
'B7': {'OS': 'BSDI / Windows NT 4 Server','Description': 'BSDI,Swap,HPFS/NTFS mirror'},
|
||||
'B8': {'OS': 'BSDI (before 3.0)','Description': 'BSDI Swap / native FS'},
|
||||
'BB': {'OS': 'Acronis/BootWizard/WinNT 4','Description': 'BootWizard/OEM/FAT32 mirror'},
|
||||
'BC': {'OS': 'Acronis/WinNT/BackupCapsule','Description': 'FAT32RAID/SecureZone/Backup'},
|
||||
'BD': {'OS': 'BonnyDOS/286','Description': 'Unknown'},
|
||||
'BE': {'OS': 'Solaris 8','Description': 'Solaris 8 boot'},
|
||||
'BF': {'OS': 'Solaris','Description': 'Solaris x86'},
|
||||
'C0': {'OS': 'DR-DOS,MultiuserDOS,REAL/32','Description': 'Secured FAT (under 32 MB)'},
|
||||
'C1': {'OS': 'DR DOS','Description': 'Secured FAT12'},
|
||||
'C2': {'OS': 'Power Boot','Description': 'Hidden Linux native FS'},
|
||||
'C3': {'OS': 'Power Boot','Description': 'Hidden Linux Swap'},
|
||||
'C4': {'OS': 'DR DOS','Description': 'Secured FAT16'},
|
||||
'C5': {'OS': 'DR DOS','Description': 'Secured extended partition'},
|
||||
'C6': {'OS': 'DR DOS / WinNT 4 Server','Description': 'Secured FAT16B/FAT16Bmirror'},
|
||||
'C7': {'OS': 'Syrinx / WinNT 4 Server','Description': 'Syrinx boot/HPFS/NTFSmirror'},
|
||||
'C8': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'C9': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'CA': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'CB': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||
'CC': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||
'CD': {'OS': 'CTOS','Description': 'Memory dump'},
|
||||
'CE': {'OS': 'DR-DOSx','Description': 'Secured FAT16B'},
|
||||
'CF': {'OS': 'DR-DOSx','Description': 'Secured extended partition'},
|
||||
'D0': {'OS': 'Multiuser DOS, REAL/32','Description': 'Secured FAT (over 32 MB)'},
|
||||
'D1': {'OS': 'Multiuser DOS','Description': 'Secured FAT12'},
|
||||
'D4': {'OS': 'Multiuser DOS','Description': 'Secured FAT16'},
|
||||
'D5': {'OS': 'Multiuser DOS','Description': 'Secured extended partition'},
|
||||
'D6': {'OS': 'Multiuser DOS','Description': 'Secured FAT16B'},
|
||||
'D8': {'OS': 'Digital Research','Description': 'CP/M-86 [citation needed]'},
|
||||
'DA': {'OS': 'Powercopy Backup','Description': 'Non-FS data / Shielded disk'},
|
||||
'DB': {'OS': 'CP/M-86/CDOS/CTOS/D800/DRMK','Description': 'CP/M-86/ConcDOS/Boot/FAT32'},
|
||||
'DD': {'OS': 'CTOS','Description': 'Hidden memory dump'},
|
||||
'DE': {'OS': 'Dell','Description': 'FAT16 utility/diagnostic'},
|
||||
'DF': {'OS': 'DG/UX / BootIt / Aviion','Description': 'DG/UX Virt DiskMan / EMBRM'},
|
||||
'E0': {'OS': 'STMicroelectronics','Description': 'ST AVFS'},
|
||||
'E1': {'OS': 'SpeedStor','Description': 'ExtendedFAT12 >1023cylinder'},
|
||||
'E2': {'Description': 'DOS read-only (XFDISK)'},
|
||||
'E3': {'OS': 'SpeedStor','Description': 'DOS read-only'},
|
||||
'E4': {'OS': 'SpeedStor','Description': 'ExtendedFAT16 <1024cylinder'},
|
||||
'E5': {'OS': 'Tandy MS-DOS','Description': 'Logical FAT12 or FAT16'},
|
||||
'E6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'E8': {'OS': 'LUKS','Description': 'Linux Unified Key Setup'},
|
||||
'EB': {'OS': 'BeOS, Haiku','Description': 'BFS'},
|
||||
'EC': {'OS': 'SkyOS','Description': 'SkyFS'},
|
||||
'ED': {'OS': 'Sprytix / EDD 4','Description': 'EDC loader / GPT hybrid MBR'},
|
||||
'EE': {'OS': 'EFI','Description': 'GPT protective MBR'},
|
||||
'EF': {'OS': 'EFI','Description': 'EFI system partition'},
|
||||
'F0': {'OS': 'Linux / OS/32','Description': 'PA-RISC Linux boot loader.'},
|
||||
'F1': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F2': {'OS': 'SperryIT DOS/Unisys DOS','Description': 'Logical FAT12/FAT16'},
|
||||
'F3': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F4': {'OS': 'SpeedStor / Prologue','Description': '"large"DOS part/NGF/TwinFS'},
|
||||
'F5': {'OS': 'Prologue','Description': 'MD0-MD9 part for NGF/TwinFS'},
|
||||
'F6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F7': {'OS': 'O.S.G. / X1','Description': 'EFAT / Solid State FS'},
|
||||
'F9': {'OS': 'Linux','Description': 'pCache ext2/ext3 cache'},
|
||||
'FA': {'OS': 'Bochs','Description': 'x86 emulator'},
|
||||
'FB': {'OS': 'VMware','Description': 'VMware VMFS partition'},
|
||||
'FC': {'OS': 'VMware','Description': 'Swap / VMKCORE kernel dump'},
|
||||
'FD': {'OS': 'Linux / FreeDOS','Description': 'LinuxRAID/Reserved4FreeDOS'},
|
||||
'FE': {'OS': 'SpeedStor/LANstep/NT/Linux','Description': 'PS/2/DiskAdmin/old LinuxLVM'},
|
||||
'FF': {'OS': 'XENIX','Description': 'XENIX bad block table'},
|
||||
'00000000-0000-0000-0000-000000000000': {'Description': 'Unused entry'},
|
||||
'024DEE41-33E7-11D3-9D69-0008C781F39F': {'Description': 'MBR partition scheme'},
|
||||
'C12A7328-F81F-11D2-BA4B-00A0C93EC93B': {'Description': 'EFI System partition'},
|
||||
'21686148-6449-6E6F-744E-656564454649': {'Description': 'BIOS Boot partition'},
|
||||
'D3BFE2DE-3DAF-11DF-BA40-E3A556D89593': {'Description': 'Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)'},
|
||||
'F4019732-066E-4E12-8273-346C5641494F': {'Description': 'Sony boot partition'},
|
||||
'BFBFAFE7-A34F-448A-9A5B-6213EB736C22': {'Description': 'Lenovo boot partition'},
|
||||
'E3C9E316-0B5C-4DB8-817D-F92DF00215AE': {'OS': 'Windows', 'Description': 'Microsoft Reserved Partition (MSR)'},
|
||||
'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7': {'OS': 'Windows', 'Description': 'Basic data partition'},
|
||||
'5808C8AA-7E8F-42E0-85D2-E1E90434CFB3': {'OS': 'Windows', 'Description': 'Logical Disk Manager (LDM) metadata partition'},
|
||||
'AF9B60A0-1431-4F62-BC68-3311714A69AD': {'OS': 'Windows', 'Description': 'Logical Disk Manager data partition'},
|
||||
'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC': {'OS': 'Windows', 'Description': 'Windows Recovery Environment'},
|
||||
'37AFFC90-EF7D-4E96-91C3-2D7AE055B174': {'OS': 'Windows', 'Description': 'IBM General Parallel File System (GPFS) partition'},
|
||||
'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D': {'OS': 'Windows', 'Description': 'Storage Spaces partition'},
|
||||
'75894C1E-3AEB-11D3-B7C1-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Data partition'},
|
||||
'E2A1E728-32E3-11D6-A682-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Service Partition'},
|
||||
'0FC63DAF-8483-4772-8E79-3D69D8477DE4': {'OS': 'Linux', 'Description': 'Linux filesystem data'},
|
||||
'A19D880F-05FC-4D3B-A006-743F0F84911E': {'OS': 'Linux', 'Description': 'RAID partition'},
|
||||
'44479540-F297-41B2-9AF7-D131D5F0458A': {'OS': 'Linux', 'Description': 'Root partition (x86)'},
|
||||
'4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709': {'OS': 'Linux', 'Description': 'Root partition (x86-64)'},
|
||||
'69DAD710-2CE4-4E3C-B16C-21A1D49ABED3': {'OS': 'Linux', 'Description': 'Root partition (32-bit ARM)'},
|
||||
'B921B045-1DF0-41C3-AF44-4C6F280D3FAE': {'OS': 'Linux', 'Description': 'Root partition (64-bit ARM)/AArch64)'},
|
||||
'0657FD6D-A4AB-43C4-84E5-0933C84B4F4F': {'OS': 'Linux', 'Description': 'Swap partition'},
|
||||
'E6D6D379-F507-44C2-A23C-238F2A3DF928': {'OS': 'Linux', 'Description': 'Logical Volume Manager (LVM) partition'},
|
||||
'933AC7E1-2EB4-4F13-B844-0E14E2AEF915': {'OS': 'Linux', 'Description': '/home partition'},
|
||||
'3B8F8425-20E0-4F3B-907F-1A25A76F98E8': {'OS': 'Linux', 'Description': '/srv (server data) partition'},
|
||||
'7FFEC5C9-2D00-49B7-8941-3EA10A5586B7': {'OS': 'Linux', 'Description': 'Plain dm-crypt partition'},
|
||||
'CA7D7CCB-63ED-4C53-861C-1742536059CC': {'OS': 'Linux', 'Description': 'LUKS partition'},
|
||||
'8DA63339-0007-60C0-C436-083AC8230908': {'OS': 'Linux', 'Description': 'Reserved'},
|
||||
'83BD6B9D-7F41-11DC-BE0B-001560B84F0F': {'OS': 'FreeBSD', 'Description': 'Boot partition'},
|
||||
'516E7CB4-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Data partition'},
|
||||
'516E7CB5-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Swap partition'},
|
||||
'516E7CB6-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Unix File System (UFS) partition'},
|
||||
'516E7CB8-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Vinum volume manager partition'},
|
||||
'516E7CBA-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'ZFS partition'},
|
||||
'48465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Hierarchical File System Plus (HFS+) partition'},
|
||||
'55465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple UFS'},
|
||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'OS X Darwin', 'Description': 'ZFS'},
|
||||
'52414944-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition'},
|
||||
'52414944-5F4F-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition, offline'},
|
||||
'426F6F74-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Boot partition (Recovery HD)'},
|
||||
'4C616265-6C00-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Label'},
|
||||
'5265636F-7665-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple TV Recovery partition'},
|
||||
'53746F72-6167-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Core Storage (i.e. Lion FileVault) partition'},
|
||||
'6A82CB45-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Boot partition'},
|
||||
'6A85CF4D-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Root partition'},
|
||||
'6A87C46F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Swap partition'},
|
||||
'6A8B642B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Backup partition'},
|
||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/usr partition'},
|
||||
'6A8EF2E9-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/var partition'},
|
||||
'6A90BA39-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/home partition'},
|
||||
'6A9283A5-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Alternate sector'},
|
||||
'6A945A3B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Reserved partition'},
|
||||
'6A9630D1-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A980767-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A96237F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A8D2AC7-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'49F48D32-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Swap partition'},
|
||||
'49F48D5A-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'FFS partition'},
|
||||
'49F48D82-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'LFS partition'},
|
||||
'49F48DAA-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'RAID partition'},
|
||||
'2DB519C4-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Concatenated partition'},
|
||||
'2DB519EC-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Encrypted partition'},
|
||||
'FE3A2A5D-4F32-41A7-B725-ACCC3285A309': {'OS': 'ChromeOS', 'Description': 'ChromeOS kernel'},
|
||||
'3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC': {'OS': 'ChromeOS', 'Description': 'ChromeOS rootfs'},
|
||||
'2E0A753D-9E48-43B0-8337-B15192CB1B5E': {'OS': 'ChromeOS', 'Description': 'ChromeOS future use'},
|
||||
'42465331-3BA3-10F1-802A-4861696B7521': {'OS': 'Haiku', 'Description': 'Haiku BFS'},
|
||||
'85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Boot partition'},
|
||||
'85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Data partition'},
|
||||
'85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Swap partition'},
|
||||
'0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Unix File System (UFS) partition'},
|
||||
'85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Vinum volume manager partition'},
|
||||
'85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'ZFS partition'},
|
||||
'45B0969E-9B03-4F30-B4C6-B4B80CEFF106': {'OS': 'Ceph', 'Description': 'Ceph Journal'},
|
||||
'45B0969E-9B03-4F30-B4C6-5EC00CEFF106': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt Encrypted Journal'},
|
||||
'4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph OSD'},
|
||||
'4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt OSD'},
|
||||
'89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph disk in creation'},
|
||||
'89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt disk in creation'},
|
||||
'824CC7A0-36A8-11E3-890A-952519AD3F61': {'OS': 'OpenBSD', 'Description': 'Data partition'},
|
||||
'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1': {'OS': 'QNX', 'Description': 'Power-safe (QNX6) file system'},
|
||||
'C91818F9-8025-47AF-89D2-F030D7000C2C': {'OS': 'Plan 9', 'Description': 'Plan 9 partition'},
|
||||
'9D275380-40AD-11DB-BF97-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'vmkcore (coredump partition)'},
|
||||
'AA31E02A-400F-11DB-9590-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMFS filesystem partition'},
|
||||
'9198EFFC-31C0-11DB-8F78-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMware Reserved'},
|
||||
'2568845D-2332-4675-BC39-8FA5A4748D15': {'OS': 'Android-IA', 'Description': 'Bootloader'},
|
||||
'114EAFFE-1552-4022-B26E-9B053604CF84': {'OS': 'Android-IA', 'Description': 'Bootloader2'},
|
||||
'49A4D17F-93A3-45C1-A0DE-F50B2EBE2599': {'OS': 'Android-IA', 'Description': 'Boot'},
|
||||
'4177C722-9E92-4AAB-8644-43502BFD5506': {'OS': 'Android-IA', 'Description': 'Recovery'},
|
||||
'EF32A33B-A409-486C-9141-9FFB711F6266': {'OS': 'Android-IA', 'Description': 'Misc'},
|
||||
'20AC26BE-20B7-11E3-84C5-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Metadata'},
|
||||
'38F428E6-D326-425D-9140-6E0EA133647C': {'OS': 'Android-IA', 'Description': 'System'},
|
||||
'A893EF21-E428-470A-9E55-0668FD91A2D9': {'OS': 'Android-IA', 'Description': 'Cache'},
|
||||
'DC76DDA9-5AC1-491C-AF42-A82591580C0D': {'OS': 'Android-IA', 'Description': 'Data'},
|
||||
'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1': {'OS': 'Android-IA', 'Description': 'Persistent'},
|
||||
'8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80': {'OS': 'Android-IA', 'Description': 'Factory'},
|
||||
'767941D0-2085-11E3-AD3B-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Fastboot / Tertiary'},
|
||||
'AC6D7924-EB71-4DF8-B48D-E267B27148FF': {'OS': 'Android-IA', 'Description': 'OEM'},
|
||||
'7412F7D5-A156-4B13-81DC-867174929325': {'OS': 'ONIE', 'Description': 'Boot'},
|
||||
'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149': {'OS': 'ONIE', 'Description': 'Config'},
|
||||
'9E1A2D38-C612-4316-AA26-8B49521E5A8B': {'OS': 'PowerPC', 'Description': 'PReP boot'},
|
||||
'BC13C2FF-59E6-4262-A352-B275FD6F7172': {'OS': 'Freedesktop', 'Description': 'Extended Boot Partition ($BOOT)'},
|
||||
}
|
||||
|
||||
def lookup_guid(guid):
|
||||
return PARTITION_UIDS.get(guid.upper(), {})
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
111
.bin/Scripts/functions/product_keys.py
Normal file
111
.bin/Scripts/functions/product_keys.py
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
# Wizard Kit: Functions - Product Keys
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# Regex
|
||||
REGEX_REGISTRY_DIRS = re.compile(
|
||||
r'^(config$|RegBack$|System32$|Transfer|Win)',
|
||||
re.IGNORECASE)
|
||||
REGEX_SOFTWARE_HIVE = re.compile(r'^Software$', re.IGNORECASE)
|
||||
|
||||
def extract_keys():
|
||||
"""Extract keys from provided hives and return a dict."""
|
||||
keys = {}
|
||||
|
||||
# Extract keys
|
||||
extract_item('ProduKey', silent=True)
|
||||
for hive in find_software_hives():
|
||||
cmd = [
|
||||
global_vars['Tools']['ProduKey'],
|
||||
'/IEKeys', '0',
|
||||
'/WindowsKeys', '1',
|
||||
'/OfficeKeys', '1',
|
||||
'/ExtractEdition', '1',
|
||||
'/nosavereg',
|
||||
'/regfile', hive,
|
||||
'/scomma', '']
|
||||
try:
|
||||
out = run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
# Ignore and return empty dict
|
||||
pass
|
||||
else:
|
||||
for line in out.stdout.decode().splitlines():
|
||||
# Add key to keys under product only if unique
|
||||
tmp = line.split(',')
|
||||
product = tmp[0]
|
||||
key = tmp[2]
|
||||
if product not in keys:
|
||||
keys[product] = []
|
||||
if key not in keys[product]:
|
||||
keys[product].append(key)
|
||||
|
||||
# Done
|
||||
return keys
|
||||
|
||||
def list_clientdir_keys():
|
||||
"""List product keys found in hives inside the ClientDir."""
|
||||
keys = extract_keys()
|
||||
key_list = []
|
||||
if keys:
|
||||
for product in sorted(keys):
|
||||
key_list.append(product)
|
||||
for key in sorted(keys[product]):
|
||||
key_list.append(' {key}'.format(key=key))
|
||||
else:
|
||||
key_list.append('No keys found.')
|
||||
|
||||
return key_list
|
||||
|
||||
def find_software_hives():
|
||||
"""Search for transferred SW hives and return a list."""
|
||||
hives = []
|
||||
search_paths = [global_vars['ClientDir']]
|
||||
|
||||
while len(search_paths) > 0:
|
||||
for item in os.scandir(search_paths.pop(0)):
|
||||
if item.is_dir() and REGEX_REGISTRY_DIRS.search(item.name):
|
||||
search_paths.append(item.path)
|
||||
if item.is_file() and REGEX_SOFTWARE_HIVE.search(item.name):
|
||||
hives.append(item.path)
|
||||
|
||||
return hives
|
||||
|
||||
def get_product_keys():
|
||||
"""List product keys from saved report."""
|
||||
keys = []
|
||||
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
|
||||
with open (log_file, 'r') as f:
|
||||
for line in f.readlines():
|
||||
if re.search(r'^Product Name', line):
|
||||
line = re.sub(r'^Product Name\s+:\s+(.*)', r'\1', line.strip())
|
||||
keys.append(line)
|
||||
|
||||
if keys:
|
||||
return keys
|
||||
else:
|
||||
return ['No product keys found']
|
||||
|
||||
def run_produkey():
|
||||
"""Run ProduKey and save report in the ClientDir."""
|
||||
extract_item('ProduKey', silent=True)
|
||||
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
|
||||
if not os.path.exists(log_file):
|
||||
# Clear current configuration
|
||||
for config in ['ProduKey.cfg', 'ProduKey64.cfg']:
|
||||
config = r'{BinDir}\ProduKey\{config}'.format(
|
||||
config=config, **global_vars)
|
||||
try:
|
||||
if os.path.exists(config):
|
||||
os.remove(config)
|
||||
except Exception:
|
||||
pass
|
||||
cmd = [
|
||||
global_vars['Tools']['ProduKey'],
|
||||
'/nosavereg',
|
||||
'/stext',
|
||||
log_file]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
126
.bin/Scripts/functions/repairs.py
Normal file
126
.bin/Scripts/functions/repairs.py
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
# Wizard Kit: Functions - Repairs
|
||||
|
||||
from functions.common import *
|
||||
|
||||
def run_chkdsk(repair=False):
|
||||
"""Run CHKDSK scan or schedule offline repairs."""
|
||||
if repair:
|
||||
run_chkdsk_offline()
|
||||
else:
|
||||
run_chkdsk_scan()
|
||||
|
||||
def run_chkdsk_scan():
|
||||
"""Run CHKDSK in a "split window" and report errors."""
|
||||
if global_vars['OS']['Version'] in ['8', '10']:
|
||||
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE'], '/scan', '/perf']
|
||||
else:
|
||||
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE']]
|
||||
out = run_program(cmd, check=False)
|
||||
# retcode == 0: no issues
|
||||
# retcode == 1: fixed issues (also happens when chkdsk.exe is killed?)
|
||||
# retcode == 2: issues
|
||||
if int(out.returncode) > 0:
|
||||
# print_error(' ERROR: CHKDSK encountered errors')
|
||||
raise GenericError
|
||||
|
||||
# Save stderr
|
||||
with open(r'{LogDir}\CHKDSK.err'.format(**global_vars), 'a') as f:
|
||||
for line in out.stderr.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
# Save stdout
|
||||
with open(r'{LogDir}\CHKDSK.log'.format(**global_vars), 'a') as f:
|
||||
for line in out.stdout.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
|
||||
def run_chkdsk_offline():
|
||||
"""Set filesystem 'dirty bit' to force a chkdsk during next boot."""
|
||||
cmd = [
|
||||
'fsutil', 'dirty',
|
||||
'set',
|
||||
global_vars['Env']['SYSTEMDRIVE']]
|
||||
out = run_program(cmd, check=False)
|
||||
if int(out.returncode) > 0:
|
||||
raise GenericError
|
||||
|
||||
def run_dism(repair=False):
|
||||
"""Run DISM /RestoreHealth, then /CheckHealth, and then report errors."""
|
||||
if global_vars['OS']['Version'] in ['8', '10']:
|
||||
if repair:
|
||||
# Restore Health
|
||||
cmd = [
|
||||
'DISM', '/Online',
|
||||
'/Cleanup-Image', '/RestoreHealth',
|
||||
r'/LogPath:"{LogDir}\DISM_RestoreHealth.log"'.format(
|
||||
**global_vars),
|
||||
'-new_console:n', '-new_console:s33V']
|
||||
else:
|
||||
# Scan Health
|
||||
cmd = [
|
||||
'DISM', '/Online',
|
||||
'/Cleanup-Image', '/ScanHealth',
|
||||
r'/LogPath:"{LogDir}\DISM_ScanHealth.log"'.format(
|
||||
**global_vars),
|
||||
'-new_console:n', '-new_console:s33V']
|
||||
run_program(cmd, pipe=False, check=False, shell=True)
|
||||
wait_for_process('dism')
|
||||
# Now check health
|
||||
cmd = [
|
||||
'DISM', '/Online',
|
||||
'/Cleanup-Image', '/CheckHealth',
|
||||
r'/LogPath:"{LogDir}\DISM_CheckHealth.log"'.format(**global_vars)]
|
||||
result = run_program(cmd, shell=True).stdout.decode()
|
||||
# Check result
|
||||
if 'no component store corruption detected' not in result.lower():
|
||||
raise GenericError
|
||||
else:
|
||||
raise UnsupportedOSError
|
||||
|
||||
def run_kvrt():
|
||||
"""Run KVRT."""
|
||||
extract_item('KVRT', silent=True)
|
||||
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['KVRT'],
|
||||
'-accepteula', '-dontcryptsupportinfo', '-fixednames',
|
||||
'-d', global_vars['QuarantineDir'],
|
||||
'-processlevel', '3']
|
||||
popen_program(cmd, pipe=False)
|
||||
|
||||
def run_sfc_scan():
|
||||
"""Run SFC in a "split window" and report errors."""
|
||||
cmd = [
|
||||
r'{SYSTEMROOT}\System32\sfc.exe'.format(**global_vars['Env']),
|
||||
'/scannow']
|
||||
out = run_program(cmd, check=False)
|
||||
# Save stderr
|
||||
with open(r'{LogDir}\SFC.err'.format(**global_vars), 'a') as f:
|
||||
for line in out.stderr.decode('utf-8', 'ignore').splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
# Save stdout
|
||||
with open(r'{LogDir}\SFC.log'.format(**global_vars), 'a') as f:
|
||||
for line in out.stdout.decode('utf-8', 'ignore').splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
# Check result
|
||||
log_text = out.stdout.decode('utf-8', 'ignore').replace('\0', '')
|
||||
if re.findall(r'did\s+not\s+find\s+any\s+integrity\s+violations', log_text):
|
||||
pass
|
||||
elif re.findall(r'successfully\s+repaired\s+them', log_text):
|
||||
raise GenericRepair
|
||||
else:
|
||||
raise GenericError
|
||||
|
||||
def run_tdsskiller():
|
||||
"""Run TDSSKiller."""
|
||||
extract_item('TDSSKiller', silent=True)
|
||||
os.makedirs(r'{QuarantineDir}\TDSSKiller'.format(
|
||||
**global_vars), exist_ok=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['TDSSKiller'],
|
||||
'-l', r'{LogDir}\TDSSKiller.log'.format(**global_vars),
|
||||
'-qpath', r'{QuarantineDir}\TDSSKiller'.format(**global_vars),
|
||||
'-accepteula', '-accepteulaksn',
|
||||
'-dcexact', '-tdlfs']
|
||||
run_program(cmd, pipe=False)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
272
.bin/Scripts/functions/setup.py
Normal file
272
.bin/Scripts/functions/setup.py
Normal file
|
|
@ -0,0 +1,272 @@
|
|||
# Wizard Kit: Functions - Setup
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
HKCU = winreg.HKEY_CURRENT_USER
|
||||
HKLM = winreg.HKEY_LOCAL_MACHINE
|
||||
SETTINGS_CLASSIC_START = {
|
||||
r'Software\IvoSoft\ClassicShell\Settings': {},
|
||||
r'Software\IvoSoft\ClassicStartMenu': {
|
||||
'DWORD Items': {'ShowedStyle2': 1},
|
||||
},
|
||||
r'Software\IvoSoft\ClassicStartMenu\MRU': {},
|
||||
r'Software\IvoSoft\ClassicStartMenu\Settings': {
|
||||
'DWORD Items': {'SkipMetro': 1},
|
||||
'SZ Items': {
|
||||
'MenuStyle': 'Win7',
|
||||
'RecentPrograms': 'Recent',
|
||||
},
|
||||
},
|
||||
}
|
||||
SETTINGS_EXPLORER_SYSTEM = {
|
||||
# Disable Telemetry
|
||||
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
||||
'DWORD Items': {'AllowTelemetry': 0},
|
||||
},
|
||||
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
||||
'DWORD Items': {'AllowTelemetry': 0},
|
||||
'WOW64_32': True,
|
||||
},
|
||||
r'SOFTWARE\Policies\Microsoft\Windows\DataCollection': {
|
||||
'DWORD Items': {'AllowTelemetry': 0},
|
||||
},
|
||||
# Disable Wi-Fi Sense
|
||||
r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': {
|
||||
'DWORD Items': {'Value': 0},
|
||||
},
|
||||
r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': {
|
||||
'DWORD Items': {'Value': 0},
|
||||
},
|
||||
# Disable Location Tracking
|
||||
r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': {
|
||||
'DWORD Items': {'SensorPermissionState': 0},
|
||||
},
|
||||
r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': {
|
||||
'Status': {'Value': 0},
|
||||
},
|
||||
}
|
||||
SETTINGS_EXPLORER_USER = {
|
||||
# Disable Cortana
|
||||
r'Software\Microsoft\Personalization\Settings': {
|
||||
'DWORD Items': {'AcceptedPrivacyPolicy': 0},
|
||||
},
|
||||
r'Software\Microsoft\InputPersonalization': {
|
||||
'DWORD Items': {
|
||||
'RestrictImplicitTextCollection': 1,
|
||||
'RestrictImplicitInkCollection': 1
|
||||
},
|
||||
},
|
||||
r'Software\Microsoft\InputPersonalization\TrainedDataStore': {
|
||||
'DWORD Items': {'HarvestContacts': 1},
|
||||
},
|
||||
# Hide Search button / box
|
||||
r'Software\Microsoft\Windows\CurrentVersion\Search': {
|
||||
'DWORD Items': {'SearchboxTaskbarMode': 0},
|
||||
},
|
||||
# Change default Explorer view to "Computer"
|
||||
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': {
|
||||
'DWORD Items': {'LaunchTo': 1},
|
||||
},
|
||||
}
|
||||
SETTINGS_GOOGLE_CHROME = {
|
||||
r'Software\Google\Chrome\Extensions': {
|
||||
'WOW64_32': True,
|
||||
},
|
||||
r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': {
|
||||
'SZ Items': {
|
||||
'update_url': 'https://clients2.google.com/service/update2/crx'},
|
||||
'WOW64_32': True,
|
||||
},
|
||||
r'Software\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco': {
|
||||
'SZ Items': {
|
||||
'update_url': 'https://clients2.google.com/service/update2/crx'},
|
||||
'WOW64_32': True,
|
||||
},
|
||||
}
|
||||
VCR_REDISTS = [
|
||||
{'Name': 'Visual C++ 2008 SP1 x32...',
|
||||
'Cmd': [r'2008sp1\x32\vcredist.exe', '/qb! /norestart']},
|
||||
{'Name': 'Visual C++ 2008 SP1 x64...',
|
||||
'Cmd': [r'2008sp1\x64\vcredist.exe', '/qb! /norestart']},
|
||||
{'Name': 'Visual C++ 2010 x32...',
|
||||
'Cmd': [r'2010sp1\x32\vcredist.exe', '/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2010 x64...',
|
||||
'Cmd': [r'2010sp1\x64\vcredist.exe', '/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2012 Update 4 x32...',
|
||||
'Cmd': [r'2012u4\x32\vcredist.exe', '/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2012 Update 4 x64...',
|
||||
'Cmd': [r'2012u4\x64\vcredist.exe', '/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2013 x32...',
|
||||
'Cmd': [r'2013\x32\vcredist.exe', '/install',
|
||||
'/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2013 x64...',
|
||||
'Cmd': [r'2013\x64\vcredist.exe', '/install',
|
||||
'/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2017 x32...',
|
||||
'Cmd': [r'2017\x32\vcredist.exe', '/install',
|
||||
'/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2017 x64...',
|
||||
'Cmd': [r'2017\x64\vcredist.exe', '/install',
|
||||
'/passive', '/norestart']},
|
||||
]
|
||||
|
||||
def config_classicstart():
|
||||
"""Configure ClassicStart."""
|
||||
# User level, not system level
|
||||
cs_exe = r'{PROGRAMFILES}\Classic Shell\ClassicStartMenu.exe'.format(
|
||||
**global_vars['Env'])
|
||||
skin = r'{PROGRAMFILES}\Classic Shell\Skins\Metro-Win10-Black.skin7'.format(
|
||||
**global_vars['Env'])
|
||||
extract_item('ClassicStartSkin', silent=True)
|
||||
|
||||
# Stop Classic Start
|
||||
run_program([cs_exe, '-exit'], check=False)
|
||||
sleep(1)
|
||||
kill_process('ClassicStartMenu.exe')
|
||||
|
||||
# Configure
|
||||
write_registry_settings(SETTINGS_CLASSIC_START, all_users=False)
|
||||
if global_vars['OS']['Version'] == '10' and os.path.exists(skin):
|
||||
# Enable Win10 theme if on Win10
|
||||
key_path = r'Software\IvoSoft\ClassicStartMenu\Settings'
|
||||
with winreg.OpenKey(HKCU, key_path, access=winreg.KEY_WRITE) as key:
|
||||
winreg.SetValueEx(
|
||||
key, 'SkinW7', 0, winreg.REG_SZ, 'Metro-Win10-Black')
|
||||
winreg.SetValueEx(key, 'SkinVariationW7', 0, winreg.REG_SZ, '')
|
||||
|
||||
# Pin Browser to Start Menu (Classic)
|
||||
firefox = r'{PROGRAMDATA}\Start Menu\Programs\Mozilla Firefox.lnk'.format(
|
||||
**global_vars['Env'])
|
||||
chrome = r'{PROGRAMDATA}\Start Menu\Programs\Google Chrome.lnk'.format(
|
||||
**global_vars['Env'])
|
||||
dest_path = r'{APPDATA}\ClassicShell\Pinned'.format(**global_vars['Env'])
|
||||
source = None
|
||||
dest = None
|
||||
if os.path.exists(firefox):
|
||||
source = firefox
|
||||
dest = r'{}\Mozilla Firefox.lnk'.format(dest_path)
|
||||
elif os.path.exists(chrome):
|
||||
source = chrome
|
||||
dest = r'{}\Google Chrome.lnk'.format(dest_path)
|
||||
if source:
|
||||
try:
|
||||
os.makedirs(dest_path, exist_ok=True)
|
||||
shutil.copy(source, dest)
|
||||
except Exception:
|
||||
pass # Meh, it's fine without
|
||||
|
||||
# (Re)start Classic Start
|
||||
run_program([cs_exe, '-exit'], check=False)
|
||||
sleep(1)
|
||||
kill_process('ClassicStartMenu.exe')
|
||||
sleep(1)
|
||||
popen_program(cs_exe)
|
||||
|
||||
def write_registry_settings(settings, all_users=False):
|
||||
"""Write registry values from custom dict of dicts."""
|
||||
hive = HKCU
|
||||
if all_users:
|
||||
hive = HKLM
|
||||
for k, v in settings.items():
|
||||
# CreateKey
|
||||
access = winreg.KEY_WRITE
|
||||
if 'WOW64_32' in v:
|
||||
access = access | winreg.KEY_WOW64_32KEY
|
||||
winreg.CreateKeyEx(hive, k, 0, access)
|
||||
|
||||
# Create values
|
||||
with winreg.OpenKeyEx(hive, k, 0, access) as key:
|
||||
for name, value in v.get('DWORD Items', {}).items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
||||
for name, value in v.get('SZ Items', {}).items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value)
|
||||
|
||||
def config_explorer_system():
|
||||
"""Configure Windows Explorer for all users via Registry settings."""
|
||||
write_registry_settings(SETTINGS_EXPLORER_SYSTEM, all_users=True)
|
||||
|
||||
def config_explorer_user():
|
||||
"""Configure Windows Explorer for current user via Registry settings."""
|
||||
write_registry_settings(SETTINGS_EXPLORER_USER, all_users=False)
|
||||
|
||||
def update_clock():
|
||||
"""Set Timezone and sync clock."""
|
||||
run_program(['tzutil' ,'/s', TIME_ZONE], check=False)
|
||||
run_program(['net', 'stop', 'w32ime'], check=False)
|
||||
run_program(
|
||||
['w32tm', '/config', '/syncfromflags:manual',
|
||||
'/manualpeerlist:"us.pool.ntp.org time.nist.gov time.windows.com"',
|
||||
],
|
||||
check=False)
|
||||
run_program(['net', 'start', 'w32ime'], check=False)
|
||||
run_program(['w32tm', '/resync', '/nowait'], check=False)
|
||||
|
||||
# Installations
|
||||
def install_adobe_reader():
|
||||
"""Install Adobe Reader."""
|
||||
cmd = [
|
||||
r'{BaseDir}\Installers\Extras\Office\Adobe Reader DC.exe'.format(
|
||||
**global_vars),
|
||||
'/sAll',
|
||||
'/msi', '/norestart', '/quiet',
|
||||
'ALLUSERS=1',
|
||||
'EULA_ACCEPT=YES']
|
||||
try_and_print(message='Adobe Reader DC...', function=run_program, cmd=cmd)
|
||||
|
||||
def install_chrome_extensions():
|
||||
"""Update registry to 'install' Google Chrome extensions for all users."""
|
||||
write_registry_settings(SETTINGS_GOOGLE_CHROME, all_users=True)
|
||||
|
||||
def install_classicstart_skin():
|
||||
"""Extract ClassicStart skin to installation folder."""
|
||||
if global_vars['OS']['Version'] not in ['8', '10']:
|
||||
raise UnsupportedOSError
|
||||
extract_item('ClassicStartSkin', silent=True)
|
||||
source = r'{BinDir}\ClassicStartSkin\Metro-Win10-Black.skin7'.format(
|
||||
**global_vars)
|
||||
dest_path = r'{PROGRAMFILES}\Classic Shell\Skins'.format(
|
||||
**global_vars['Env'])
|
||||
dest = r'{}\Metro-Win10-Black.skin7'.format(dest_path)
|
||||
os.makedirs(dest_path, exist_ok=True)
|
||||
shutil.copy(source, dest)
|
||||
|
||||
def install_firefox_extensions():
|
||||
"""Extract Firefox extensions to installation folder."""
|
||||
dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format(
|
||||
**global_vars['Env'])
|
||||
# Extract extension(s) to distribution folder
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0',
|
||||
'-p{ArchivePassword}'.format(**global_vars),
|
||||
'-o{dist_path}'.format(dist_path=dist_path),
|
||||
r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars)]
|
||||
run_program(cmd)
|
||||
|
||||
def install_ninite_bundle(mse=False):
|
||||
"""Run Ninite file(s) based on OS version."""
|
||||
if global_vars['OS']['Version'] in ['8', '10']:
|
||||
# Modern selection
|
||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Modern.exe'.format(
|
||||
**global_vars))
|
||||
else:
|
||||
# Legacy selection
|
||||
if mse:
|
||||
cmd = r'{BaseDir}\Installers\Extras\Security'.format(**global_vars)
|
||||
cmd += r'\Microsoft Security Essentials.exe'
|
||||
popen_program(cmd)
|
||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Legacy.exe'.format(
|
||||
**global_vars))
|
||||
|
||||
def install_vcredists():
|
||||
"""Install all supported Visual C++ runtimes."""
|
||||
extract_item('_vcredists', silent=True)
|
||||
prev_dir = os.getcwd()
|
||||
os.chdir(r'{BinDir}\_vcredists'.format(**global_vars))
|
||||
for vcr in VCR_REDISTS:
|
||||
try_and_print(message=vcr['Name'], function=run_program, cmd=vcr['Cmd'])
|
||||
|
||||
os.chdir(prev_dir)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
891
.bin/Scripts/functions/update.py
Normal file
891
.bin/Scripts/functions/update.py
Normal file
|
|
@ -0,0 +1,891 @@
|
|||
# Wizard Kit: Functions - Build / Update
|
||||
|
||||
import requests
|
||||
|
||||
from functions.common import *
|
||||
from functions.data import *
|
||||
from settings.launchers import *
|
||||
from settings.music import *
|
||||
from settings.sources import *
|
||||
|
||||
def compress_and_remove_item(item):
|
||||
try:
|
||||
compress_item(item)
|
||||
except:
|
||||
raise GenericError
|
||||
else:
|
||||
remove_item(item.path)
|
||||
|
||||
def compress_item(item):
|
||||
# Prep
|
||||
prev_dir = os.getcwd()
|
||||
dest = '{}.7z'.format(item.path)
|
||||
wd = item.path
|
||||
include_str = '*'
|
||||
if os.path.isfile(wd):
|
||||
wd = os.path.abspath(r'{}\{}'.format(wd, os.path.pardir))
|
||||
include_str = item.name
|
||||
os.chdir(wd)
|
||||
|
||||
# Compress
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', dest,
|
||||
'-t7z', '-mx=7', '-myx=7', '-ms=on', '-mhe', '-bso0', '-bse0',
|
||||
'-p{}'.format(ARCHIVE_PASSWORD),
|
||||
include_str,
|
||||
]
|
||||
run_program(cmd)
|
||||
|
||||
# Done
|
||||
os.chdir(prev_dir)
|
||||
|
||||
def download_generic(out_dir, out_name, source_url):
|
||||
"""Downloads a file using requests."""
|
||||
## Code based on this Q&A: https://stackoverflow.com/q/16694907
|
||||
### Asked by: https://stackoverflow.com/users/427457/roman-podlinov
|
||||
### Edited by: https://stackoverflow.com/users/657427/christophe-roussy
|
||||
### Using answer: https://stackoverflow.com/a/39217788
|
||||
### Answer from: https://stackoverflow.com/users/4323/john-zwinck
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
out_path = '{}/{}'.format(out_dir, out_name)
|
||||
try:
|
||||
r = requests.get(source_url, stream=True)
|
||||
with open(out_path, 'wb') as f:
|
||||
shutil.copyfileobj(r.raw, f)
|
||||
r.close()
|
||||
except:
|
||||
raise GenericError('Failed to download file.')
|
||||
|
||||
def download_to_temp(out_name, source_url):
|
||||
download_generic(global_vars['TmpDir'], out_name, source_url)
|
||||
|
||||
def extract_generic(source, dest, mode='x', sz_args=[]):
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
mode, source, r'-o{}'.format(dest),
|
||||
'-aoa', '-bso0', '-bse0',
|
||||
]
|
||||
cmd.extend(sz_args)
|
||||
run_program(cmd)
|
||||
|
||||
def extract_temp_to_bin(source, item, mode='x', sz_args=[]):
|
||||
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
||||
dest = r'{}\{}'.format(global_vars['BinDir'], item)
|
||||
extract_generic(source, dest, mode, sz_args)
|
||||
|
||||
def extract_temp_to_cbin(source, item, mode='x', sz_args=[]):
|
||||
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
||||
dest = r'{}\{}'.format(global_vars['CBinDir'], item)
|
||||
include_path = r'{}\_include\{}'.format(global_vars['CBinDir'], item)
|
||||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
extract_generic(source, dest, mode, sz_args)
|
||||
|
||||
def generate_launcher(section, name, options):
|
||||
# Prep
|
||||
dest = r'{}\{}'.format(global_vars['BaseDir'], section)
|
||||
if section == '(Root)':
|
||||
dest = global_vars['BaseDir']
|
||||
full_path = r'{}\{}.cmd'.format(dest, name)
|
||||
template = r'{}\Scripts\Launcher_Template.cmd'.format(global_vars['BinDir'])
|
||||
|
||||
# Format options
|
||||
f_options = {}
|
||||
for opt in options.keys():
|
||||
# Values need to be a list to support the multi-line extra code sections
|
||||
if opt == 'Extra Code':
|
||||
f_options['rem EXTRA_CODE'] = options['Extra Code']
|
||||
elif re.search(r'^L_\w+', opt, re.IGNORECASE):
|
||||
new_opt = 'set {}='.format(opt)
|
||||
f_options[new_opt] = ['set {}={}'.format(opt, options[opt])]
|
||||
|
||||
# Read template and update using f_options
|
||||
out_text = []
|
||||
with open(template, 'r') as f:
|
||||
for line in f.readlines():
|
||||
# Strip all lines to let Python handle/correct the CRLF endings
|
||||
line = line.strip()
|
||||
if line in f_options:
|
||||
# Extend instead of append to support extra code sections
|
||||
out_text.extend(f_options[line])
|
||||
else:
|
||||
out_text.append(line)
|
||||
|
||||
# Write file
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
with open(full_path, 'w') as f:
|
||||
# f.writelines(out_text)
|
||||
f.write('\n'.join(out_text))
|
||||
|
||||
def remove_item(item_path):
|
||||
if os.path.exists(item_path):
|
||||
if os.path.isdir(item_path):
|
||||
shutil.rmtree(item_path, ignore_errors=True)
|
||||
else:
|
||||
os.remove(item_path)
|
||||
|
||||
def remove_from_kit(item):
|
||||
item_locations = []
|
||||
for p in [global_vars['BinDir'], global_vars['CBinDir']]:
|
||||
item_locations.append(r'{}\{}'.format(p, item))
|
||||
item_locations.append(r'{}\_Drivers\{}'.format(p, item))
|
||||
for item_path in item_locations:
|
||||
remove_item(item_path)
|
||||
|
||||
def remove_from_temp(item):
|
||||
item_path = r'{}\{}'.format(global_vars['TmpDir'], item)
|
||||
remove_item(item_path)
|
||||
|
||||
def resolve_dynamic_url(source_url, regex):
|
||||
"""Scan source_url for a url using the regex provided; returns str."""
|
||||
# Load the download page
|
||||
try:
|
||||
download_page = requests.get(source_url)
|
||||
except Exception:
|
||||
# "Fail silently as the download_to_temp() function will catch it
|
||||
return None
|
||||
|
||||
# Scan for the url using the regex provided
|
||||
url = None
|
||||
for line in download_page.content.decode().splitlines():
|
||||
if re.search(regex, line):
|
||||
url = line.strip()
|
||||
url = re.sub(r'.*(a |)href="([^"]+)".*', r'\2', url)
|
||||
url = re.sub(r".*(a |)href='([^']+)'.*", r'\2', url)
|
||||
break
|
||||
|
||||
# Return
|
||||
return url
|
||||
|
||||
def scan_for_net_installers(server, family_name, min_year):
|
||||
if not server['Mounted']:
|
||||
mount_network_share(server)
|
||||
|
||||
if server['Mounted']:
|
||||
for year in os.scandir(r'\\{IP}\{Share}'.format(**server)):
|
||||
if int(year.name) < min_year:
|
||||
# Don't support outdated installers
|
||||
continue
|
||||
for version in os.scandir(year.path):
|
||||
section = r'Installers\Extras\{}\{}'.format(
|
||||
family_name, year.name)
|
||||
if section not in LAUNCHERS:
|
||||
LAUNCHERS[section] = {}
|
||||
name = version.name
|
||||
if re.search(r'(exe|msi)$', name, re.IGNORECASE):
|
||||
name = name[:-4]
|
||||
if name not in LAUNCHERS[section]:
|
||||
LAUNCHERS[section][name] = {
|
||||
'L_TYPE': family_name,
|
||||
'L_PATH': year.name,
|
||||
'L_ITEM': version.name,
|
||||
}
|
||||
umount_network_share(server)
|
||||
|
||||
## Data Recovery ##
|
||||
def update_testdisk():
|
||||
# Stop running processes
|
||||
for exe in ['fidentify_win.exe', 'photorec_win.exe',
|
||||
'qphotorec_win.exe', 'testdisk_win.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('TestDisk')
|
||||
|
||||
# Download
|
||||
download_to_temp('testdisk_wip.zip', SOURCE_URLS['TestDisk'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('testdisk_wip.zip', 'TestDisk')
|
||||
dest = r'{}\TestDisk'.format(global_vars['CBinDir'])
|
||||
for item in os.scandir(r'{}\testdisk-7.1-WIP'.format(dest)):
|
||||
dest_item = '{}\{}'.format(dest, item.name)
|
||||
if not os.path.exists(dest_item):
|
||||
shutil.move(item.path, dest_item)
|
||||
shutil.rmtree(
|
||||
r'{}\TestDisk\testdisk-7.1-WIP'.format(global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('testdisk_wip.zip')
|
||||
|
||||
## Data Transfers ##
|
||||
def update_fastcopy():
|
||||
## NOTE: Lives in .bin uncompressed
|
||||
# Stop running processes
|
||||
for process in ['FastCopy.exe', 'FastCopy64.exe']:
|
||||
kill_process(process)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('FastCopy')
|
||||
|
||||
# Download
|
||||
download_to_temp('FastCopy32.zip', SOURCE_URLS['FastCopy32'])
|
||||
download_to_temp('FastCopy64.zip', SOURCE_URLS['FastCopy64'])
|
||||
|
||||
# Extract
|
||||
extract_temp_to_bin('FastCopy64.zip', 'FastCopy', sz_args=['FastCopy.exe'])
|
||||
shutil.move(
|
||||
r'{}\FastCopy\FastCopy.exe'.format(global_vars['BinDir']),
|
||||
r'{}\FastCopy\FastCopy64.exe'.format(global_vars['BinDir']))
|
||||
extract_temp_to_bin('FastCopy32.zip', 'FastCopy', sz_args=[r'-x!setup.exe', r'-x!*.dll'])
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('FastCopy32.zip')
|
||||
remove_from_temp('FastCopy64.zip')
|
||||
|
||||
def update_wimlib():
|
||||
# Stop running processes
|
||||
kill_process('wimlib-imagex.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('wimlib')
|
||||
|
||||
# Download
|
||||
download_to_temp('wimlib32.zip', SOURCE_URLS['wimlib32'])
|
||||
download_to_temp('wimlib64.zip', SOURCE_URLS['wimlib64'])
|
||||
|
||||
# Extract
|
||||
extract_generic(
|
||||
r'{}\wimlib32.zip'.format(global_vars['TmpDir']),
|
||||
r'{}\wimlib\x32'.format(global_vars['CBinDir']))
|
||||
extract_generic(
|
||||
r'{}\wimlib64.zip'.format(global_vars['TmpDir']),
|
||||
r'{}\wimlib\x64'.format(global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('wimlib32.zip')
|
||||
remove_from_temp('wimlib64.zip')
|
||||
|
||||
def update_xyplorer():
|
||||
# Stop running processes
|
||||
kill_process('XYplorerFree.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('XYplorerFree')
|
||||
|
||||
# Download
|
||||
download_to_temp('xyplorer_free.zip', SOURCE_URLS['XYplorerFree'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('xyplorer_free.zip', 'XYplorerFree')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('xyplorer_free.zip')
|
||||
|
||||
## Diagnostics ##
|
||||
def update_aida64():
|
||||
# Stop running processes
|
||||
kill_process('notepadplusplus.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('AIDA64')
|
||||
|
||||
# Download
|
||||
download_to_temp('aida64.zip', SOURCE_URLS['AIDA64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('aida64.zip', 'AIDA64')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('aida64.zip')
|
||||
|
||||
def update_autoruns():
|
||||
# Stop running processes
|
||||
kill_process('Autoruns.exe')
|
||||
kill_process('Autoruns64.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('Autoruns')
|
||||
|
||||
# Download
|
||||
download_to_temp('Autoruns.zip', SOURCE_URLS['Autoruns'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('Autoruns.zip', 'Autoruns')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('Autoruns.zip')
|
||||
|
||||
def update_bleachbit():
|
||||
# Stop running processes
|
||||
kill_process('bleachbit.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('BleachBit')
|
||||
|
||||
# Download
|
||||
download_to_temp('bleachbit.zip', SOURCE_URLS['BleachBit'])
|
||||
download_to_temp('Winapp2.zip', SOURCE_URLS['Winapp2'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('bleachbit.zip', 'BleachBit')
|
||||
extract_generic(
|
||||
r'{}\Winapp2.zip'.format(global_vars['TmpDir']),
|
||||
r'{}\BleachBit\cleaners'.format(global_vars['CBinDir']),
|
||||
mode='e', sz_args=[r'Winapp2-master\Non-CCleaner\Winapp2.ini'])
|
||||
|
||||
# Move files into place
|
||||
dest = r'{}\BleachBit'.format(global_vars['CBinDir'])
|
||||
for item in os.scandir(r'{}\BleachBit-Portable'.format(dest)):
|
||||
dest_item = '{}\{}'.format(dest, item.name)
|
||||
if not os.path.exists(dest_item):
|
||||
shutil.move(item.path, dest_item)
|
||||
shutil.rmtree(
|
||||
r'{}\BleachBit\BleachBit-Portable'.format(global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('bleachbit.zip')
|
||||
remove_from_temp('Winapp2.zip')
|
||||
|
||||
def update_bluescreenview():
|
||||
# Stop running processes
|
||||
for exe in ['BlueScreenView.exe', 'BlueScreenView64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('BlueScreenView')
|
||||
|
||||
# Download
|
||||
download_to_temp('bluescreenview32.zip', SOURCE_URLS['BlueScreenView32'])
|
||||
download_to_temp('bluescreenview64.zip', SOURCE_URLS['BlueScreenView64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('bluescreenview64.zip', 'BlueScreenView', sz_args=['BlueScreenView.exe'])
|
||||
shutil.move(
|
||||
r'{}\BlueScreenView\BlueScreenView.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\BlueScreenView\BlueScreenView64.exe'.format(global_vars['CBinDir']))
|
||||
extract_temp_to_cbin('bluescreenview32.zip', 'BlueScreenView')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('bluescreenview32.zip')
|
||||
remove_from_temp('bluescreenview64.zip')
|
||||
|
||||
def update_erunt():
|
||||
# Stop running processes
|
||||
kill_process('ERUNT.EXE')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('ERUNT')
|
||||
|
||||
# Download
|
||||
download_to_temp('erunt.zip', SOURCE_URLS['ERUNT'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('erunt.zip', 'ERUNT')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('erunt.zip')
|
||||
|
||||
def update_hitmanpro():
|
||||
# Stop running processes
|
||||
for exe in ['HitmanPro.exe', 'HitmanPro64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('HitmanPro')
|
||||
|
||||
# Download
|
||||
dest = r'{}\HitmanPro'.format(global_vars['CBinDir'])
|
||||
download_generic(dest, 'HitmanPro.exe', SOURCE_URLS['HitmanPro32'])
|
||||
download_generic(dest, 'HitmanPro64.exe', SOURCE_URLS['HitmanPro64'])
|
||||
|
||||
def update_hwinfo():
|
||||
## NOTE: Lives in .bin uncompressed
|
||||
# Stop running processes
|
||||
for exe in ['HWiNFO32.exe', 'HWiNFO64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Download
|
||||
download_to_temp('HWiNFO32.zip', SOURCE_URLS['HWiNFO32'])
|
||||
download_to_temp('HWiNFO64.zip', SOURCE_URLS['HWiNFO64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_bin('HWiNFO32.zip', 'HWiNFO')
|
||||
extract_temp_to_bin('HWiNFO64.zip', 'HWiNFO')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('HWiNFO32.zip')
|
||||
remove_from_temp('HWiNFO64.zip')
|
||||
|
||||
def update_produkey():
|
||||
# Stop running processes
|
||||
for exe in ['ProduKey.exe', 'ProduKey64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('ProduKey')
|
||||
|
||||
# Download
|
||||
download_to_temp('produkey32.zip', SOURCE_URLS['ProduKey32'])
|
||||
download_to_temp('produkey64.zip', SOURCE_URLS['ProduKey64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('produkey64.zip', 'ProduKey', sz_args=['ProduKey.exe'])
|
||||
shutil.move(
|
||||
r'{}\ProduKey\ProduKey.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\ProduKey\ProduKey64.exe'.format(global_vars['CBinDir']))
|
||||
extract_temp_to_cbin('produkey32.zip', 'ProduKey')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('produkey32.zip')
|
||||
remove_from_temp('produkey64.zip')
|
||||
|
||||
## Drivers ##
|
||||
def update_intel_rst():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Intel RST')
|
||||
|
||||
# Prep
|
||||
dest = r'{}\_Drivers\Intel RST'.format(global_vars['CBinDir'])
|
||||
include_path = r'{}\_include\_Drivers\Intel RST'.format(
|
||||
global_vars['CBinDir'])
|
||||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
|
||||
# Download
|
||||
for name, url in RST_SOURCES.items():
|
||||
download_generic(dest, name, url)
|
||||
|
||||
def update_intel_ssd_toolbox():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Intel SSD Toolbox.exe')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\_Drivers\Intel SSD Toolbox'.format(global_vars['CBinDir']),
|
||||
'Intel SSD Toolbox.exe',
|
||||
SOURCE_URLS['Intel SSD Toolbox'])
|
||||
|
||||
def update_samsung_magician():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Samsung Magician.exe')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\_Drivers\Samsung Magician'.format(global_vars['CBinDir']),
|
||||
'Samsung Magician.exe',
|
||||
SOURCE_URLS['Samsung Magician'])
|
||||
|
||||
def update_sdi_origin():
|
||||
# Download aria2
|
||||
download_to_temp('aria2.zip', SOURCE_URLS['aria2'])
|
||||
aria_source = r'{}\aria2.zip'.format(global_vars['TmpDir'])
|
||||
aria_dest = r'{}\aria2'.format(global_vars['TmpDir'])
|
||||
aria = r'{}\aria2c.exe'.format(aria_dest)
|
||||
extract_generic(aria_source, aria_dest, mode='e')
|
||||
|
||||
# Prep for torrent download
|
||||
download_to_temp('sdio.torrent', SOURCE_URLS['SDIO Torrent'])
|
||||
sdio_torrent = r'{}\sdio.torrent'.format(global_vars['TmpDir'])
|
||||
out = run_program([aria, sdio_torrent, '-S'])
|
||||
indexes = []
|
||||
for line in out.stdout.decode().splitlines():
|
||||
r = re.search(r'^\s*(\d+)\|(.*)', line)
|
||||
if r and not re.search(r'(\.(bat|inf)|Video|Server|Printer|XP)', line, re.IGNORECASE):
|
||||
indexes.append(int(r.group(1)))
|
||||
indexes = [str(i) for i in sorted(indexes)]
|
||||
|
||||
# Download SDI Origin
|
||||
cmd = [
|
||||
aria,
|
||||
'--select-file={}'.format(','.join(indexes)),
|
||||
'-d', aria_dest,
|
||||
'--seed-time=0',
|
||||
sdio_torrent,
|
||||
'-new_console:n', '-new_console:s33V',
|
||||
]
|
||||
run_program(cmd, pipe=False, check=False, shell=True)
|
||||
sleep(1)
|
||||
wait_for_process('aria2c')
|
||||
|
||||
# Download SDI Origin extra themes
|
||||
download_to_temp('sdio_themes.zip', SOURCE_URLS['SDIO Themes'])
|
||||
theme_source = r'{}\sdio_themes.zip'.format(global_vars['TmpDir'])
|
||||
theme_dest = r'{}\SDIO_Update\tools\SDI\themes'.format(aria_dest)
|
||||
extract_generic(theme_source, theme_dest)
|
||||
|
||||
# Move files into place
|
||||
for item in os.scandir(r'{}\SDIO_Update'.format(aria_dest)):
|
||||
dest_item = '{}\_Drivers\SDIO\{}'.format(
|
||||
global_vars['BinDir'], item.name)
|
||||
r = re.search(r'^SDIO_x?(64|)_?R.*exe$', item.name, re.IGNORECASE)
|
||||
if r:
|
||||
dest_item = dest_item.replace(item.name, 'SDIO{}.exe'.format(
|
||||
r.group(1)))
|
||||
if (not os.path.exists(dest_item)
|
||||
and not re.search(r'\.(inf|bat)$', item.name, re.IGNORECASE)):
|
||||
shutil.move(item.path, dest_item)
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('aria2')
|
||||
remove_from_temp('aria2.zip')
|
||||
remove_from_temp('sdio.torrent')
|
||||
remove_from_temp('sdio_themes.zip')
|
||||
|
||||
## Installers ##
|
||||
def update_adobe_reader_dc():
|
||||
# Prep
|
||||
dest = r'{}\Installers\Extras\Office'.format(
|
||||
global_vars['BaseDir'])
|
||||
|
||||
# Remove existing installer
|
||||
try:
|
||||
os.remove(r'{}\Adobe Reader DC.exe'.format(dest))
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
dest, 'Adobe Reader DC.exe', SOURCE_URLS['Adobe Reader DC'])
|
||||
|
||||
def update_office():
|
||||
# Remove existing folders
|
||||
remove_from_kit('_Office')
|
||||
|
||||
# Prep
|
||||
dest = r'{}\_Office'.format(global_vars['CBinDir'])
|
||||
include_path = r'{}\_include\_Office'.format(global_vars['CBinDir'])
|
||||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
|
||||
# Download and extract
|
||||
for year in ['2013', '2016']:
|
||||
name = 'odt{}.exe'.format(year)
|
||||
url = 'Office Deployment Tool {}'.format(year)
|
||||
download_to_temp(name, SOURCE_URLS[url])
|
||||
cmd = [
|
||||
r'{}\odt{}.exe'.format(global_vars['TmpDir'], year),
|
||||
r'/extract:{}\{}'.format(global_vars['TmpDir'], year),
|
||||
'/quiet',
|
||||
]
|
||||
run_program(cmd)
|
||||
shutil.move(
|
||||
r'{}\{}'.format(global_vars['TmpDir'], year),
|
||||
r'{}\_Office\{}'.format(global_vars['CBinDir'], year))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('odt2013.exe')
|
||||
remove_from_temp('odt2016.exe')
|
||||
|
||||
def update_classic_start_skin():
|
||||
# Remove existing folders
|
||||
remove_from_kit('ClassicStartSkin')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\ClassicStartSkin'.format(global_vars['CBinDir']),
|
||||
'Metro-Win10-Black.skin7',
|
||||
SOURCE_URLS['ClassicStartSkin'])
|
||||
|
||||
def update_vcredists():
|
||||
# Remove existing folders
|
||||
remove_from_kit('_vcredists')
|
||||
|
||||
# Prep
|
||||
dest = r'{}\_vcredists'.format(global_vars['CBinDir'])
|
||||
include_path = r'{}\_include\_vcredists'.format(global_vars['CBinDir'])
|
||||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
|
||||
# Download
|
||||
for year in VCREDIST_SOURCES.keys():
|
||||
for bit in ['32', '64']:
|
||||
dest = r'{}\_vcredists\{}\x{}'.format(
|
||||
global_vars['CBinDir'], year, bit)
|
||||
download_generic(
|
||||
dest,
|
||||
'vcredist.exe',
|
||||
VCREDIST_SOURCES[year][bit])
|
||||
|
||||
def update_one_ninite(section, dest, name, url, indent=8, width=40):
|
||||
# Prep
|
||||
url = 'https://ninite.com/{}/ninite.exe'.format(url)
|
||||
|
||||
# Download
|
||||
download_generic(out_dir=dest, out_name=name, source_url=url)
|
||||
|
||||
# Copy to Installers folder
|
||||
installer_parent = r'{}\Installers\Extras\{}'.format(
|
||||
global_vars['BaseDir'], section)
|
||||
installer_dest = r'{}\{}'.format(installer_parent, name)
|
||||
os.makedirs(installer_parent, exist_ok=True)
|
||||
if os.path.exists(installer_dest):
|
||||
remove_item(installer_dest)
|
||||
shutil.copy(r'{}\{}'.format(dest, name), installer_dest)
|
||||
|
||||
def update_all_ninite(indent=8, width=40, other_results={}):
|
||||
print_info('{}Ninite'.format(' '*int(indent/2)))
|
||||
for section in sorted(NINITE_SOURCES.keys()):
|
||||
print_success('{}{}'.format(' '*int(indent/4*3), section))
|
||||
dest = r'{}\_Ninite\{}'.format(global_vars['CBinDir'], section)
|
||||
for name, url in sorted(NINITE_SOURCES[section].items()):
|
||||
try_and_print(message=name, function=update_one_ninite,
|
||||
other_results=other_results, indent=indent, width=width,
|
||||
section=section, dest=dest, name=name, url=url)
|
||||
|
||||
## Misc ##
|
||||
def update_caffeine():
|
||||
# Stop running processes
|
||||
kill_process('caffeine.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('Caffeine')
|
||||
|
||||
# Download
|
||||
download_to_temp('caffeine.zip', SOURCE_URLS['Caffeine'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('caffeine.zip', 'Caffeine')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('caffeine.zip')
|
||||
|
||||
def update_du():
|
||||
# Stop running processes
|
||||
kill_process('du.exe')
|
||||
kill_process('du64.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('Du')
|
||||
|
||||
# Download
|
||||
download_to_temp('du.zip', SOURCE_URLS['Du'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('du.zip', 'Du')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('du.zip')
|
||||
|
||||
def update_everything():
|
||||
# Stop running processes
|
||||
for exe in ['Everything.exe', 'Everything64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('Everything')
|
||||
|
||||
# Download
|
||||
download_to_temp('everything32.zip', SOURCE_URLS['Everything32'])
|
||||
download_to_temp('everything64.zip', SOURCE_URLS['Everything64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('everything64.zip', 'Everything', sz_args=['Everything.exe'])
|
||||
shutil.move(
|
||||
r'{}\Everything\Everything.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\Everything\Everything64.exe'.format(global_vars['CBinDir']))
|
||||
extract_temp_to_cbin('everything32.zip', 'Everything')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('everything32.zip')
|
||||
remove_from_temp('everything64.zip')
|
||||
|
||||
def update_firefox_ublock_origin():
|
||||
# Remove existing folders
|
||||
remove_from_kit('FirefoxExtensions')
|
||||
|
||||
# Download
|
||||
download_to_temp('ff-uBO.xpi', SOURCE_URLS['Firefox uBO'])
|
||||
|
||||
# Extract files
|
||||
extract_generic(
|
||||
r'{}\ff-uBO.xpi'.format(global_vars['TmpDir']),
|
||||
r'{}\FirefoxExtensions\uBlock0@raymondhill.net'.format(
|
||||
global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('ff-uBO.xpi')
|
||||
|
||||
def update_notepadplusplus():
|
||||
# Stop running processes
|
||||
kill_process('notepadplusplus.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('NotepadPlusPlus')
|
||||
|
||||
# Download
|
||||
download_to_temp('npp.7z', SOURCE_URLS['NotepadPlusPlus'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('npp.7z', 'NotepadPlusPlus')
|
||||
shutil.move(
|
||||
r'{}\NotepadPlusPlus\notepad++.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\NotepadPlusPlus\notepadplusplus.exe'.format(global_vars['CBinDir'])
|
||||
)
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('npp.7z')
|
||||
|
||||
def update_putty():
|
||||
# Stop running processes
|
||||
kill_process('PUTTY.EXE')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('PuTTY')
|
||||
|
||||
# Download
|
||||
download_to_temp('putty.zip', SOURCE_URLS['PuTTY'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('putty.zip', 'PuTTY')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('putty.zip')
|
||||
|
||||
def update_treesizefree():
|
||||
# Stop running processes
|
||||
kill_process('TreeSizeFree.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('TreeSizeFree')
|
||||
|
||||
# Download
|
||||
download_to_temp(
|
||||
'treesizefree.zip.gz', SOURCE_URLS['TreeSizeFree'])
|
||||
|
||||
# Extract files
|
||||
## NOTE: When downloaded using requests it is a .zip.gz?
|
||||
source = r'{}\treesizefree.zip.gz'.format(global_vars['TmpDir'])
|
||||
extract_generic(source, global_vars['TmpDir'])
|
||||
extract_temp_to_cbin('treesizefree.zip', 'TreeSizeFree')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('treesizefree.zip')
|
||||
remove_from_temp('treesizefree.zip.gz')
|
||||
|
||||
def update_xmplay():
|
||||
# Stop running processes
|
||||
kill_process('xmplay.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('XMPlay')
|
||||
|
||||
# Download
|
||||
download_to_temp('xmplay.zip', SOURCE_URLS['XMPlay'])
|
||||
download_to_temp('xmp-7z.zip', SOURCE_URLS['XMPlay 7z'])
|
||||
download_to_temp('xmp-gme.zip', SOURCE_URLS['XMPlay Game'])
|
||||
download_to_temp('xmp-rar.zip', SOURCE_URLS['XMPlay RAR'])
|
||||
download_to_temp('WAModern.zip', SOURCE_URLS['XMPlay WAModern'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('xmplay.zip', 'XMPlay',
|
||||
mode='e', sz_args=['xmplay.exe', 'xmplay.txt'])
|
||||
for item in ['xmp-7z', 'xmp-gme', 'xmp-rar', 'WAModern']:
|
||||
filter = []
|
||||
if item == 'WAModern':
|
||||
filter.append('WAModern NightVision.xmpskin')
|
||||
extract_generic(
|
||||
r'{}\{}.zip'.format(global_vars['TmpDir'], item),
|
||||
r'{}\XMPlay\plugins'.format(global_vars['CBinDir']),
|
||||
mode='e', sz_args=filter)
|
||||
|
||||
# Download Music
|
||||
dest = r'{}\XMPlay\music_tmp\MOD'.format(global_vars['CBinDir'])
|
||||
for mod in MUSIC_MOD:
|
||||
name = mod.split('#')[-1]
|
||||
url = 'https://api.modarchive.org/downloads.php?moduleid={}'.format(mod)
|
||||
download_generic(dest, name, url)
|
||||
dest = r'{}\XMPlay\music_tmp\SNES'.format(global_vars['CBinDir'])
|
||||
for game in MUSIC_SNES:
|
||||
name = '{}.rsn'.format(game)
|
||||
url = 'http://snesmusic.org/v2/download.php?spcNow={}'.format(game)
|
||||
download_generic(dest, name, url)
|
||||
|
||||
# Compress Music
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', r'{}\XMPlay\music.7z'.format(global_vars['CBinDir']),
|
||||
'-t7z', '-mx=9', '-bso0', '-bse0',
|
||||
r'{}\XMPlay\music_tmp\*'.format(global_vars['CBinDir']),
|
||||
]
|
||||
run_program(cmd)
|
||||
|
||||
# Cleanup
|
||||
remove_item(r'{}\XMPlay\music_tmp'.format(global_vars['CBinDir']))
|
||||
remove_from_temp('xmplay.zip')
|
||||
remove_from_temp('xmp-7z.zip')
|
||||
remove_from_temp('xmp-gme.zip')
|
||||
remove_from_temp('xmp-rar.zip')
|
||||
remove_from_temp('WAModern.zip')
|
||||
|
||||
## Repairs ##
|
||||
def update_adwcleaner():
|
||||
# Stop running processes
|
||||
kill_process('AdwCleaner.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('AdwCleaner')
|
||||
|
||||
# Download
|
||||
url = resolve_dynamic_url(
|
||||
SOURCE_URLS['AdwCleaner'],
|
||||
'id="downloadLink"')
|
||||
download_generic(
|
||||
r'{}\AdwCleaner'.format(global_vars['CBinDir']), 'AdwCleaner.exe', url)
|
||||
|
||||
def update_kvrt():
|
||||
# Stop running processes
|
||||
kill_process('KVRT.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('KVRT')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\KVRT'.format(global_vars['CBinDir']),
|
||||
'KVRT.exe',
|
||||
SOURCE_URLS['KVRT'])
|
||||
|
||||
def update_rkill():
|
||||
# Stop running processes
|
||||
kill_process('RKill.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('RKill')
|
||||
|
||||
# Download
|
||||
url = resolve_dynamic_url(
|
||||
SOURCE_URLS['RKill'],
|
||||
'href.*rkill\.exe')
|
||||
download_generic(
|
||||
r'{}\RKill'.format(global_vars['CBinDir']), 'RKill.exe', url)
|
||||
|
||||
def update_tdsskiller():
|
||||
# Stop running processes
|
||||
kill_process('TDSSKiller.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('TDSSKiller')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\TDSSKiller'.format(global_vars['CBinDir']),
|
||||
'TDSSKiller.exe',
|
||||
SOURCE_URLS['TDSSKiller'])
|
||||
|
||||
## Uninstallers ##
|
||||
def update_iobit_uninstaller():
|
||||
# Stop running processes
|
||||
kill_process('IObitUninstallerPortable.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('IObitUninstallerPortable')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
global_vars['CBinDir'],
|
||||
'IObitUninstallerPortable.exe',
|
||||
SOURCE_URLS['IOBit_Uninstaller'])
|
||||
|
||||
# "Install"
|
||||
cmd = r'{}\IObitUninstallerPortable.exe'.format(global_vars['CBinDir'])
|
||||
popen_program(cmd)
|
||||
sleep(1)
|
||||
wait_for_process('IObitUninstallerPortable')
|
||||
|
||||
# Cleanup
|
||||
remove_from_kit('IObitUninstallerPortable.exe')
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
228
.bin/Scripts/functions/windows_setup.py
Normal file
228
.bin/Scripts/functions/windows_setup.py
Normal file
|
|
@ -0,0 +1,228 @@
|
|||
# Wizard Kit: Functions - Windows Setup
|
||||
|
||||
from functions.data import *
|
||||
from functions.disk import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
WINDOWS_VERSIONS = [
|
||||
{'Name': 'Windows 7 Home Basic',
|
||||
'Image File': 'Win7',
|
||||
'Image Name': 'Windows 7 HOMEBASIC'},
|
||||
{'Name': 'Windows 7 Home Premium',
|
||||
'Image File': 'Win7',
|
||||
'Image Name': 'Windows 7 HOMEPREMIUM'},
|
||||
{'Name': 'Windows 7 Professional',
|
||||
'Image File': 'Win7',
|
||||
'Image Name': 'Windows 7 PROFESSIONAL'},
|
||||
{'Name': 'Windows 7 Ultimate',
|
||||
'Image File': 'Win7',
|
||||
'Image Name': 'Windows 7 ULTIMATE'},
|
||||
|
||||
{'Name': 'Windows 8.1',
|
||||
'Image File': 'Win8',
|
||||
'Image Name': 'Windows 8.1',
|
||||
'CRLF': True},
|
||||
{'Name': 'Windows 8.1 Pro',
|
||||
'Image File': 'Win8',
|
||||
'Image Name': 'Windows 8.1 Pro'},
|
||||
|
||||
{'Name': 'Windows 10 Home',
|
||||
'Image File': 'Win10',
|
||||
'Image Name': 'Windows 10 Home',
|
||||
'CRLF': True},
|
||||
{'Name': 'Windows 10 Pro',
|
||||
'Image File': 'Win10',
|
||||
'Image Name': 'Windows 10 Pro'},
|
||||
]
|
||||
|
||||
def find_windows_image(windows_version):
|
||||
"""Search for a Windows source image file, returns dict.
|
||||
|
||||
Searches on local disks and then the WINDOWS_SERVER share."""
|
||||
image = {}
|
||||
imagefile = windows_version['Image File']
|
||||
imagename = windows_version['Image Name']
|
||||
|
||||
# Search local source
|
||||
set_thread_error_mode(silent=True) # Prevents "No disk" popups
|
||||
for d in psutil.disk_partitions():
|
||||
for ext in ['esd', 'wim', 'swm']:
|
||||
path = '{}images\{}.{}'.format(d.mountpoint, imagefile, ext)
|
||||
if os.path.isfile(path) and wim_contains_image(path, imagename):
|
||||
image['Path'] = path
|
||||
image['Source'] = letter
|
||||
if ext == 'swm':
|
||||
image['Glob'] = '--ref="{}*.swm"'.format(image['Path'][:-4])
|
||||
break
|
||||
set_thread_error_mode(silent=False) # Return to normal
|
||||
|
||||
# Check for network source
|
||||
if not image:
|
||||
mount_windows_share()
|
||||
if WINDOWS_SERVER['Mounted']:
|
||||
for ext in ['esd', 'wim', 'swm']:
|
||||
path = r'\\{}\{}\images\{}.{}'.format(
|
||||
WINDOWS_SERVER['IP'],
|
||||
WINDOWS_SERVER['Share'],
|
||||
imagefile,
|
||||
ext)
|
||||
if os.path.isfile(path) and wim_contains_image(path, imagename):
|
||||
image['Path'] = path
|
||||
image['Source'] = None
|
||||
if ext == 'swm':
|
||||
image['Glob'] = '--ref="{}*.swm"'.format(
|
||||
image['Path'][:-4])
|
||||
break
|
||||
|
||||
# Display image to be used (if any) and return
|
||||
if image:
|
||||
print_info('Using image: {}'.format(image['Path']))
|
||||
return image
|
||||
else:
|
||||
print_error('Failed to find Windows source image for {}'.format(
|
||||
windows_version['Name']))
|
||||
raise GenericAbort
|
||||
|
||||
def format_disk(disk, use_gpt):
|
||||
"""Format disk for use as a Windows OS disk."""
|
||||
if use_gpt:
|
||||
format_gpt(disk)
|
||||
else:
|
||||
format_mbr(disk)
|
||||
|
||||
def format_gpt(disk):
|
||||
"""Format disk for use as a Windows OS disk using the GPT layout."""
|
||||
script = [
|
||||
# Partition table
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'clean',
|
||||
'convert gpt',
|
||||
|
||||
# System partition
|
||||
# NOTE: ESP needs to be >= 260 for Advanced Format 4K disks
|
||||
'create partition efi size=500',
|
||||
'format quick fs=fat32 label="System"',
|
||||
'assign letter="S"',
|
||||
|
||||
# Microsoft Reserved (MSR) partition
|
||||
'create partition msr size=128',
|
||||
|
||||
# Windows partition
|
||||
'create partition primary',
|
||||
'format quick fs=ntfs label="Windows"',
|
||||
'assign letter="W"',
|
||||
|
||||
# Recovery Tools partition
|
||||
'shrink minimum=500',
|
||||
'create partition primary',
|
||||
'format quick fs=ntfs label="Recovery Tools"',
|
||||
'assign letter="T"',
|
||||
'set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"',
|
||||
'gpt attributes=0x8000000000000001',
|
||||
]
|
||||
|
||||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
def format_mbr(disk):
|
||||
"""Format disk for use as a Windows OS disk using the MBR layout."""
|
||||
script = [
|
||||
# Partition table
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'clean',
|
||||
|
||||
# System partition
|
||||
'create partition primary size=100',
|
||||
'format fs=ntfs quick label="System Reserved"',
|
||||
'active',
|
||||
'assign letter="S"',
|
||||
|
||||
# Windows partition
|
||||
'create partition primary',
|
||||
'format fs=ntfs quick label="Windows"',
|
||||
'assign letter="W"',
|
||||
|
||||
# Recovery Tools partition
|
||||
'shrink minimum=500',
|
||||
'create partition primary',
|
||||
'format quick fs=ntfs label="Recovery"',
|
||||
'assign letter="T"',
|
||||
'set id=27',
|
||||
]
|
||||
|
||||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
def mount_windows_share():
|
||||
"""Mount the Windows images share unless labeled as already mounted."""
|
||||
if not WINDOWS_SERVER['Mounted']:
|
||||
mount_network_share(WINDOWS_SERVER)
|
||||
|
||||
def select_windows_version():
|
||||
actions = [
|
||||
{'Name': 'Main Menu', 'Letter': 'M'},
|
||||
]
|
||||
|
||||
# Menu loop
|
||||
selection = menu_select(
|
||||
title = 'Which version of Windows are we installing?',
|
||||
main_entries = WINDOWS_VERSIONS,
|
||||
action_entries = actions)
|
||||
|
||||
if selection.isnumeric():
|
||||
return WINDOWS_VERSIONS[int(selection)-1]
|
||||
elif selection == 'M':
|
||||
raise GenericAbort
|
||||
|
||||
def setup_windows(windows_image, windows_version):
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'apply',
|
||||
windows_image['Path'],
|
||||
windows_version['Image Name'],
|
||||
'W:\\']
|
||||
if 'Glob' in windows_image:
|
||||
cmd.extend(windows_image['Glob'])
|
||||
run_program(cmd)
|
||||
|
||||
def setup_windows_re(windows_version, windows_letter='W', tools_letter='T'):
|
||||
win = r'{}:\Windows'.format(windows_letter)
|
||||
winre = r'{}\System32\Recovery\WinRE.wim'.format(win)
|
||||
dest = r'{}:\Recovery\WindowsRE'.format(tools_letter)
|
||||
|
||||
# Copy WinRE.wim
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
shutil.copy(winre, r'{}\WinRE.wim'.format(dest))
|
||||
|
||||
# Set location
|
||||
cmd = [
|
||||
r'{}\System32\ReAgentc.exe'.format(win),
|
||||
'/setreimage',
|
||||
'/path', dest,
|
||||
'/target', win]
|
||||
run_program(cmd)
|
||||
|
||||
def update_boot_partition(system_letter='S', windows_letter='W', mode='ALL'):
|
||||
cmd = [
|
||||
r'{}\Windows\System32\bcdboot.exe'.format(
|
||||
global_vars['Env']['SYSTEMDRIVE']),
|
||||
r'{}:\Windows'.format(windows_letter),
|
||||
'/s', '{}:'.format(system_letter),
|
||||
'/f', mode]
|
||||
run_program(cmd)
|
||||
|
||||
def wim_contains_image(filename, imagename):
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'info',
|
||||
filename,
|
||||
imagename]
|
||||
try:
|
||||
run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
440
.bin/Scripts/functions/winpe_menus.py
Normal file
440
.bin/Scripts/functions/winpe_menus.py
Normal file
|
|
@ -0,0 +1,440 @@
|
|||
# Wizard Kit: WinPE Menus
|
||||
|
||||
from functions.backup import *
|
||||
from functions.disk import *
|
||||
from functions.windows_setup import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
FAST_COPY_PE_ARGS = [
|
||||
'/cmd=noexist_only',
|
||||
'/utf8',
|
||||
'/skip_empty_dir',
|
||||
'/linkdest',
|
||||
'/no_ui',
|
||||
'/auto_close',
|
||||
'/exclude={}'.format(';'.join(FAST_COPY_EXCLUDES)),
|
||||
]
|
||||
PE_TOOLS = {
|
||||
'BlueScreenView': {
|
||||
'Path': r'BlueScreenView\BlueScreenView.exe',
|
||||
},
|
||||
'FastCopy': {
|
||||
'Path': r'FastCopy\FastCopy.exe',
|
||||
'Args': FAST_COPY_PE_ARGS,
|
||||
},
|
||||
'HWiNFO': {
|
||||
'Path': r'HWiNFO\HWiNFO.exe',
|
||||
},
|
||||
'NT Password Editor': {
|
||||
'Path': r'NT Password Editor\ntpwedit.exe',
|
||||
},
|
||||
'Notepad++': {
|
||||
'Path': r'NotepadPlusPlus\NotepadPlusPlus.exe',
|
||||
},
|
||||
'PhotoRec': {
|
||||
'Path': r'TestDisk\photorec_win.exe',
|
||||
'Args': ['-new_console:n'],
|
||||
},
|
||||
'Prime95': {
|
||||
'Path': r'Prime95\prime95.exe',
|
||||
},
|
||||
'ProduKey': {
|
||||
'Path': r'ProduKey\ProduKey.exe',
|
||||
},
|
||||
'Q-Dir': {
|
||||
'Path': r'Q-Dir\Q-Dir.exe',
|
||||
},
|
||||
'TestDisk': {
|
||||
'Path': r'TestDisk\testdisk_win.exe',
|
||||
'Args': ['-new_console:n'],
|
||||
},
|
||||
}
|
||||
|
||||
def check_pe_tools():
|
||||
for k in PE_TOOLS.keys():
|
||||
PE_TOOLS[k]['Path'] = r'{}\{}'.format(
|
||||
global_vars['BinDir'], PE_TOOLS[k]['Path'])
|
||||
global_vars['Tools']['wimlib-imagex'] = re.sub(
|
||||
r'\\x(32|64)',
|
||||
r'',
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
re.IGNORECASE)
|
||||
|
||||
def menu_backup():
|
||||
"""Take backup images of partition(s) in the WIM format."""
|
||||
errors = False
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'PathNotFoundError': 'Missing',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericAbort': 'Skipped',
|
||||
'GenericRepair': 'Repaired',
|
||||
}}
|
||||
set_title('{}: Backup Menu'.format(KIT_NAME_FULL))
|
||||
|
||||
# Set ticket Number
|
||||
clear_screen()
|
||||
print_standard('{}\n'.format(global_vars['Title']))
|
||||
ticket_number = get_ticket_number()
|
||||
|
||||
# Mount backup shares
|
||||
mount_backup_shares()
|
||||
|
||||
# Select destination
|
||||
destination = select_backup_destination(auto_select=False)
|
||||
|
||||
# Scan disks
|
||||
try_and_print(
|
||||
message = 'Assigning letters...',
|
||||
function = assign_volume_letters,
|
||||
other_results = other_results)
|
||||
result = try_and_print(
|
||||
message = 'Getting disk info...',
|
||||
function = scan_disks,
|
||||
other_results = other_results)
|
||||
if result['CS']:
|
||||
disks = result['Out']
|
||||
else:
|
||||
print_error('ERROR: No disks found.')
|
||||
raise GenericAbort
|
||||
|
||||
# Select disk to backup
|
||||
disk = select_disk('For which disk are we creating backups?', disks)
|
||||
if not disk:
|
||||
raise GenericAbort
|
||||
|
||||
# "Prep" disk
|
||||
prep_disk_for_backup(destination, disk, ticket_number)
|
||||
|
||||
# Display details for backup task
|
||||
clear_screen()
|
||||
print_info('Create Backup - Details:\n')
|
||||
show_data(message='Ticket:', data=ticket_number)
|
||||
show_data(
|
||||
message = 'Source:',
|
||||
data = '[{}] ({}) {} {}'.format(
|
||||
disk.get('Table', ''),
|
||||
disk.get('Type', ''),
|
||||
disk.get('Name', 'Unknown'),
|
||||
disk.get('Size', ''),
|
||||
),
|
||||
)
|
||||
show_data(
|
||||
message = 'Destination:',
|
||||
data = destination.get('Display Name', destination['Name']),
|
||||
)
|
||||
for par in disk['Partitions']:
|
||||
message = 'Partition {}:'.format(par['Number'])
|
||||
data = par['Display String']
|
||||
if par['Number'] in disk['Bad Partitions']:
|
||||
show_data(message=message, data=data, width=30, warning=True)
|
||||
if 'Error' in par:
|
||||
show_data(message='', data=par['Error'], error=True)
|
||||
elif par['Image Exists']:
|
||||
show_data(message=message, data=data, width=30, info=True)
|
||||
else:
|
||||
show_data(message=message, data=data, width=30)
|
||||
print_standard(disk['Backup Warnings'])
|
||||
|
||||
# Ask to proceed
|
||||
if (not ask('Proceed with backup?')):
|
||||
raise GenericAbort
|
||||
|
||||
# Backup partition(s)
|
||||
print_info('\n\nStarting task.\n')
|
||||
for par in disk['Partitions']:
|
||||
result = try_and_print(
|
||||
message = 'Partition {} Backup...'.format(par['Number']),
|
||||
function = backup_partition,
|
||||
other_results = other_results,
|
||||
disk = disk,
|
||||
par = par)
|
||||
if not result['CS'] and not isinstance(result['Error'], GenericAbort):
|
||||
errors = True
|
||||
par['Error'] = result['Error']
|
||||
|
||||
# Verify backup(s)
|
||||
if disk['Valid Partitions']:
|
||||
print_info('\n\nVerifying backup images(s)\n')
|
||||
for par in disk['Partitions']:
|
||||
if par['Number'] in disk['Bad Partitions']:
|
||||
continue # Skip verification
|
||||
result = try_and_print(
|
||||
message = 'Partition {} Image...'.format(par['Number']),
|
||||
function = verify_wim_backup,
|
||||
other_results = other_results,
|
||||
partition = par)
|
||||
if not result['CS']:
|
||||
errors = True
|
||||
par['Error'] = result['Error']
|
||||
|
||||
# Print summary
|
||||
if errors:
|
||||
print_warning('\nErrors were encountered and are detailed below.')
|
||||
for par in [p for p in disk['Partitions'] if 'Error' in p]:
|
||||
print_standard(' Partition {} Error:'.format(par['Number']))
|
||||
if hasattr(par['Error'], 'stderr'):
|
||||
try:
|
||||
par['Error'] = par['Error'].stderr.decode()
|
||||
except:
|
||||
# Deal with badly formatted error message
|
||||
pass
|
||||
try:
|
||||
par['Error'] = par['Error'].splitlines()
|
||||
par['Error'] = [line.strip() for line in par['Error']]
|
||||
par['Error'] = [line for line in par['Error'] if line]
|
||||
for line in par['Error']:
|
||||
print_error('\t{}'.format(line))
|
||||
except:
|
||||
print_error('\t{}'.format(par['Error']))
|
||||
else:
|
||||
print_success('\nNo errors were encountered during imaging.')
|
||||
if 'LogFile' in global_vars and ask('\nReview log?'):
|
||||
cmd = [
|
||||
global_vars['Tools']['NotepadPlusPlus'],
|
||||
global_vars['LogFile']]
|
||||
try:
|
||||
popen_program(cmd)
|
||||
except Exception:
|
||||
print_error('ERROR: Failed to open log.')
|
||||
sleep(30)
|
||||
pause('\nPress Enter to return to main menu... ')
|
||||
|
||||
def menu_root():
|
||||
check_pe_tools()
|
||||
menus = [
|
||||
{'Name': 'Create Backups', 'Menu': menu_backup},
|
||||
{'Name': 'Setup Windows', 'Menu': menu_setup},
|
||||
{'Name': 'Misc Tools', 'Menu': menu_tools},
|
||||
]
|
||||
actions = [
|
||||
{'Name': 'Command Prompt', 'Letter': 'C'},
|
||||
{'Name': 'Reboot', 'Letter': 'R'},
|
||||
{'Name': 'Shutdown', 'Letter': 'S'},
|
||||
]
|
||||
|
||||
# Main loop
|
||||
while True:
|
||||
set_title(KIT_NAME_FULL)
|
||||
selection = menu_select(
|
||||
title = 'Main Menu',
|
||||
main_entries = menus,
|
||||
action_entries = actions,
|
||||
secret_exit = True)
|
||||
|
||||
if (selection.isnumeric()):
|
||||
try:
|
||||
menus[int(selection)-1]['Menu']()
|
||||
except GenericAbort:
|
||||
print_warning('\nAborted\n')
|
||||
pause('Press Enter to return to main menu... ')
|
||||
elif (selection == 'C'):
|
||||
run_program(['cmd', '-new_console:n'], check=False)
|
||||
elif (selection == 'R'):
|
||||
run_program(['wpeutil', 'reboot'])
|
||||
elif (selection == 'S'):
|
||||
run_program(['wpeutil', 'shutdown'])
|
||||
else:
|
||||
sys.exit()
|
||||
|
||||
def menu_setup():
|
||||
"""Format a disk (MBR/GPT), apply a Windows image, and setup boot files."""
|
||||
errors = False
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'PathNotFoundError': 'Missing',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericAbort': 'Skipped',
|
||||
'GenericRepair': 'Repaired',
|
||||
}}
|
||||
set_title('{}: Setup Menu'.format(KIT_NAME_FULL))
|
||||
|
||||
# Set ticket ID
|
||||
clear_screen()
|
||||
print_standard('{}\n'.format(global_vars['Title']))
|
||||
ticket_number = get_ticket_number()
|
||||
|
||||
# Select the version of Windows to apply
|
||||
windows_version = select_windows_version()
|
||||
|
||||
# Find Windows image
|
||||
windows_image = find_windows_image(windows_version)
|
||||
|
||||
# Scan disks
|
||||
try_and_print(
|
||||
message = 'Assigning letters...',
|
||||
function = assign_volume_letters,
|
||||
other_results = other_results)
|
||||
result = try_and_print(
|
||||
message = 'Getting disk info...',
|
||||
function = scan_disks,
|
||||
other_results = other_results)
|
||||
if result['CS']:
|
||||
disks = result['Out']
|
||||
else:
|
||||
print_error('ERROR: No disks found.')
|
||||
raise GenericAbort
|
||||
|
||||
# Select disk to use as the OS disk
|
||||
dest_disk = select_disk('To which disk are we installing Windows?', disks)
|
||||
if not dest_disk:
|
||||
raise GenericAbort
|
||||
|
||||
# "Prep" disk
|
||||
prep_disk_for_formatting(dest_disk)
|
||||
|
||||
# Display details for setup task
|
||||
clear_screen()
|
||||
print_info('Setup Windows - Details:\n')
|
||||
show_data(message='Ticket:', data=ticket_number)
|
||||
show_data(message='Installing:', data=windows_version['Name'])
|
||||
show_data(
|
||||
message = 'Boot Method:',
|
||||
data = 'UEFI (GPT)' if dest_disk['Use GPT'] else 'Legacy (MBR)')
|
||||
show_data(message='Using Image:', data=windows_image['Path'])
|
||||
show_data(
|
||||
message = 'ERASING:',
|
||||
data = '[{}] ({}) {} {}\n'.format(
|
||||
dest_disk.get('Table', ''),
|
||||
dest_disk.get('Type', ''),
|
||||
dest_disk.get('Name', 'Unknown'),
|
||||
dest_disk.get('Size', ''),
|
||||
),
|
||||
warning = True)
|
||||
for par in dest_disk['Partitions']:
|
||||
show_data(
|
||||
message = 'Partition {}:'.format(par['Number']),
|
||||
data = par['Display String'],
|
||||
warning = True)
|
||||
print_warning(dest_disk['Format Warnings'])
|
||||
|
||||
if (not ask('Is this correct?')):
|
||||
raise GenericAbort
|
||||
|
||||
# Safety check
|
||||
print_standard('\nSAFETY CHECK')
|
||||
print_warning('All data will be DELETED from the '
|
||||
'disk and partition(s) listed above.')
|
||||
print_warning('This is irreversible and will lead '
|
||||
'to {CLEAR}{RED}DATA LOSS.'.format(**COLORS))
|
||||
if (not ask('Asking again to confirm, is this correct?')):
|
||||
raise GenericAbort
|
||||
|
||||
# Remove volume letters so S, T, & W can be used below
|
||||
remove_volume_letters(keep=windows_image['Source'])
|
||||
new_letter = reassign_volume_letter(letter=windows_image['Source'])
|
||||
if new_letter:
|
||||
windows_image['Source'] = new_letter
|
||||
|
||||
# Format and partition disk
|
||||
result = try_and_print(
|
||||
message = 'Formatting disk...',
|
||||
function = format_disk,
|
||||
other_results = other_results,
|
||||
disk = dest_disk,
|
||||
use_gpt = dest_disk['Use GPT'])
|
||||
if not result['CS']:
|
||||
# We need to crash as the disk is in an unknown state
|
||||
print_error('ERROR: Failed to format disk.')
|
||||
raise GenericAbort
|
||||
|
||||
# Apply Image
|
||||
result = try_and_print(
|
||||
message = 'Applying image...',
|
||||
function = setup_windows,
|
||||
other_results = other_results,
|
||||
windows_image = windows_image,
|
||||
windows_version = windows_version)
|
||||
if not result['CS']:
|
||||
# We need to crash as the disk is in an unknown state
|
||||
print_error('ERROR: Failed to apply image.')
|
||||
raise GenericAbort
|
||||
|
||||
# Create Boot files
|
||||
try_and_print(
|
||||
message = 'Updating boot files...',
|
||||
function = update_boot_partition,
|
||||
other_results = other_results)
|
||||
|
||||
# Setup WinRE
|
||||
try_and_print(
|
||||
message = 'Updating recovery tools...',
|
||||
function = setup_windows_re,
|
||||
other_results = other_results,
|
||||
windows_version = windows_version)
|
||||
|
||||
# Print summary
|
||||
print_standard('\nDone.')
|
||||
if 'LogFile' in global_vars and ask('\nReview log?'):
|
||||
cmd = [
|
||||
global_vars['Tools']['NotepadPlusPlus'],
|
||||
global_vars['LogFile']]
|
||||
try:
|
||||
popen_program(cmd)
|
||||
except Exception:
|
||||
print_error('ERROR: Failed to open log.')
|
||||
sleep(30)
|
||||
pause('\nPress Enter to return to main menu... ')
|
||||
|
||||
def menu_tools():
|
||||
tools = [{'Name': k} for k in sorted(PE_TOOLS.keys())]
|
||||
actions = [{'Name': 'Main Menu', 'Letter': 'M'},]
|
||||
set_title(KIT_NAME_FULL)
|
||||
|
||||
# Menu loop
|
||||
while True:
|
||||
selection = menu_select(
|
||||
title = 'Tools Menu',
|
||||
main_entries = tools,
|
||||
action_entries = actions)
|
||||
if (selection.isnumeric()):
|
||||
name = tools[int(selection)-1]['Name']
|
||||
cmd = [PE_TOOLS[name]['Path']] + PE_TOOLS[name].get('Args', [])
|
||||
if name == 'Blue Screen View':
|
||||
# Select path to scan
|
||||
minidump_path = select_minidump_path()
|
||||
if minidump_path:
|
||||
cmd.extend(['/MiniDumpFolder', minidump_path])
|
||||
try:
|
||||
popen_program(cmd)
|
||||
except Exception:
|
||||
print_error('Failed to run {}'.format(name))
|
||||
sleep(2)
|
||||
pause()
|
||||
elif (selection == 'M'):
|
||||
break
|
||||
|
||||
def select_minidump_path():
|
||||
dumps = []
|
||||
|
||||
# Assign volume letters first
|
||||
assign_volume_letters()
|
||||
|
||||
# Search for minidumps
|
||||
set_thread_error_mode(silent=True) # Prevents "No disk" popups
|
||||
for d in psutil.disk_partitions():
|
||||
if global_vars['Env']['SYSTEMDRIVE'].upper() in d.mountpoint:
|
||||
# Skip RAMDisk
|
||||
continue
|
||||
if os.path.exists(r'{}Windows\MiniDump'.format(d.mountpoint)):
|
||||
dumps.append({'Name': r'{}Windows\MiniDump'.format(d.mountpoint)})
|
||||
set_thread_error_mode(silent=False) # Return to normal
|
||||
|
||||
# Check results before showing menu
|
||||
if len(dumps) == 0:
|
||||
print_error('ERROR: No BSoD / MiniDump paths found')
|
||||
sleep(2)
|
||||
return None
|
||||
|
||||
# Menu
|
||||
selection = menu_select(
|
||||
title = 'Which BSoD / MiniDump path are we scanning?',
|
||||
main_entries = dumps)
|
||||
return dumps[int(selection) - 1]['Name']
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
:: WizardKit: Create client_dir folder(s)
|
||||
:: Wizard Kit: Create client_dir folder(s)
|
||||
|
||||
@echo off
|
||||
if defined DEBUG (@echo on)
|
||||
|
|
@ -10,12 +10,12 @@ if not defined bin (goto Abort)
|
|||
:: Credit to SS64.com Code taken from http://ss64.com/nt/syntax-getdate.html
|
||||
:: Use WMIC to retrieve date and time in ISO 8601 format.
|
||||
for /f "skip=1 tokens=1-6" %%G in ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do (
|
||||
if "%%~L"=="" goto s_done
|
||||
set _yyyy=%%L
|
||||
set _mm=00%%J
|
||||
set _dd=00%%G
|
||||
set _hour=00%%H
|
||||
set _minute=00%%I
|
||||
if "%%~L"=="" goto s_done
|
||||
set _yyyy=%%L
|
||||
set _mm=00%%J
|
||||
set _dd=00%%G
|
||||
set _hour=00%%H
|
||||
set _minute=00%%I
|
||||
)
|
||||
:s_done
|
||||
:: Pad digits with leading zeros
|
||||
|
|
@ -26,14 +26,14 @@ set _minute=%_minute:~-2%
|
|||
set iso_date=%_yyyy%-%_mm%-%_dd%
|
||||
|
||||
:SetVars
|
||||
set "SETTINGS=%bin%\Scripts\wk\cfg\main.py"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_SHORT "%SETTINGS%"`) do (
|
||||
set "_v=%%f"
|
||||
set "_v=!_v:*'=!"
|
||||
set "KIT_NAME_SHORT=!_v:~0,-1!"
|
||||
set "SETTINGS=%bin%\Scripts\settings\main.py"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_SHORT %SETTINGS%`) do (
|
||||
set "_v=%%f"
|
||||
set "_v=!_v:*'=!"
|
||||
set "KIT_NAME_SHORT=!_v:~0,-1!"
|
||||
)
|
||||
set "client_dir=%systemdrive%\%KIT_NAME_SHORT%"
|
||||
set "log_dir=%client_dir%\Logs\%iso_date%"
|
||||
set "log_dir=%client_dir%\Info\%iso_date%"
|
||||
|
||||
:Flags
|
||||
set _backups=
|
||||
|
|
@ -43,20 +43,18 @@ set _quarantine=
|
|||
set _quickbooks=
|
||||
set _transfer=
|
||||
for %%f in (%*) do (
|
||||
if /i "%%f" == "/DEBUG" (@echo on)
|
||||
if /i "%%f" == "/Backups" set _backups=True
|
||||
if /i "%%f" == "/Logs" set _logs=True
|
||||
if /i "%%f" == "/Office" set _office=True
|
||||
if /i "%%f" == "/Quarantine" set _quarantine=True
|
||||
if /i "%%f" == "/QuickBooks" set _quickbooks=True
|
||||
if /i "%%f" == "/Transfer" set _transfer=True
|
||||
if /i "%%f" == "/DEBUG" (@echo on)
|
||||
if /i "%%f" == "/Backups" set _backups=True
|
||||
if /i "%%f" == "/Info" set _info=True
|
||||
if /i "%%f" == "/Office" set _office=True
|
||||
if /i "%%f" == "/Quarantine" set _quarantine=True
|
||||
if /i "%%f" == "/QuickBooks" set _quickbooks=True
|
||||
if /i "%%f" == "/Transfer" set _transfer=True
|
||||
)
|
||||
|
||||
:CreateDirs
|
||||
if defined _backups mkdir "%client_dir%\Backups">nul 2>&1
|
||||
if defined _logs (
|
||||
mkdir "%log_dir%\%KIT_NAME_FULL%">nul 2>&1
|
||||
mkdir "%log_dir%\Tools">nul 2>&1)
|
||||
if defined _info mkdir "%client_dir%\Info">nul 2>&1
|
||||
if defined _office mkdir "%client_dir%\Office">nul 2>&1
|
||||
if defined _quarantine mkdir "%client_dir%\Quarantine">nul 2>&1
|
||||
if defined _quickbooks mkdir "%client_dir%\QuickBooks">nul 2>&1
|
||||
60
.bin/Scripts/install_sw_bundle.py
Normal file
60
.bin/Scripts/install_sw_bundle.py
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
# Wizard Kit: Install the standard SW bundle based on the OS version
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SW Bundle Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\Install SW Bundle.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: SW Bundle Tool\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
answer_extensions = ask('Install Extensions?')
|
||||
answer_adobe_reader = ask('Install Adobe Reader?')
|
||||
answer_vcr = ask('Install Visual C++ Runtimes?')
|
||||
answer_ninite = ask('Install Ninite Bundle?')
|
||||
if answer_ninite and global_vars['OS']['Version'] in ['7']:
|
||||
# Vista is dead, not going to check for it
|
||||
answer_mse = ask('Install MSE?')
|
||||
else:
|
||||
answer_mse = False
|
||||
|
||||
print_info('Installing Programs')
|
||||
if answer_adobe_reader:
|
||||
install_adobe_reader()
|
||||
if answer_vcr:
|
||||
install_vcredists()
|
||||
if answer_ninite:
|
||||
try_and_print(message='Ninite bundle...',
|
||||
function=install_ninite_bundle, cs='Started', mse=answer_mse)
|
||||
if answer_extensions:
|
||||
wait_for_process('ninite.exe')
|
||||
print_info('Installing Extensions')
|
||||
try_and_print(message='Classic Shell skin...',
|
||||
function=install_classicstart_skin,
|
||||
other_results=other_results)
|
||||
try_and_print(message='Google Chrome extensions...',
|
||||
function=install_chrome_extensions)
|
||||
try_and_print(message='Mozilla Firefox extensions...',
|
||||
function=install_firefox_extensions)
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
34
.bin/Scripts/install_vcredists.py
Normal file
34
.bin/Scripts/install_vcredists.py
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# Wizard Kit: Install Visual C++ Runtimes
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Install Visual C++ Runtimes'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\Install Visual C++ Runtimes.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: Install Visual C++ Runtimes\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
}}
|
||||
|
||||
if ask('Install Visual C++ Runtimes?'):
|
||||
install_vcredists()
|
||||
else:
|
||||
abort()
|
||||
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
44
.bin/Scripts/safemode_enter.py
Normal file
44
.bin/Scripts/safemode_enter.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
# Wizard Kit: Enter SafeMode by editing the BCD
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# STATIC VARIABLES
|
||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.common import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
clear_screen()
|
||||
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
|
||||
if not ask('Enable booting to SafeMode (with Networking)?'):
|
||||
abort()
|
||||
|
||||
# Edit BCD to set safeboot as default
|
||||
cmd = ['bcdedit', '/set', '{default}', 'safeboot', 'network']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Enable MSI access under safemode
|
||||
cmd = ['reg', 'add', REG_MSISERVER, '/f']
|
||||
run_program(cmd, check=False)
|
||||
cmd = ['reg', 'add', REG_MSISERVER, '/ve',
|
||||
'/t', 'REG_SZ', '/d', 'Service', '/f']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
## Done ##
|
||||
pause('Press Enter to reboot...')
|
||||
cmd = ['shutdown', '-r', '-t', '3']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Done
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
42
.bin/Scripts/safemode_exit.py
Normal file
42
.bin/Scripts/safemode_exit.py
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
# Wizard Kit: Exit SafeMode by editing the BCD
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# STATIC VARIABLES
|
||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.common import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
clear_screen()
|
||||
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
|
||||
if not ask('Disable booting to SafeMode?'):
|
||||
abort()
|
||||
|
||||
# Edit BCD to remove safeboot value
|
||||
for boot in ['{current}', '{default}']:
|
||||
cmd = ['bcdedit', '/deletevalue', boot, 'safeboot']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Disable MSI access under safemode
|
||||
cmd = ['reg', 'delete', REG_MSISERVER, '/f']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
## Done ##
|
||||
pause('Press Enter to reboot...')
|
||||
cmd = ['shutdown', '-r', '-t', '3']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Done
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
586
.bin/Scripts/settings/launchers.py
Normal file
586
.bin/Scripts/settings/launchers.py
Normal file
|
|
@ -0,0 +1,586 @@
|
|||
# Wizard Kit: Settings - Launchers
|
||||
|
||||
LAUNCHERS = {
|
||||
r'(Root)': {
|
||||
'Activate Windows': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'activate.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'Enter SafeMode': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'safemode_enter.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'Exit SafeMode': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'safemode_exit.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'System Checklist': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'system_checklist.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'System Diagnostics': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'system_diagnostics.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'User Checklist': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'user_checklist.py',
|
||||
},
|
||||
},
|
||||
r'Data Recovery': {
|
||||
'PhotoRec (CLI)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TestDisk',
|
||||
'L_ITEM': 'photorec_win.exe',
|
||||
'L_ELEV': 'True',
|
||||
'L__CLI': 'True',
|
||||
},
|
||||
'PhotoRec': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TestDisk',
|
||||
'L_ITEM': 'qphotorec_win.exe',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'TestDisk': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TestDisk',
|
||||
'L_ITEM': 'testdisk_win.exe',
|
||||
'L_ELEV': 'True',
|
||||
'L__CLI': 'True',
|
||||
},
|
||||
},
|
||||
r'Data Transfers': {
|
||||
'FastCopy (as ADMIN)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'FastCopy',
|
||||
'L_ITEM': 'FastCopy.exe',
|
||||
'L_ARGS': (
|
||||
r' /logfile=%log_dir%\FastCopy.log'
|
||||
r' /cmd=noexist_only'
|
||||
r' /utf8'
|
||||
r' /skip_empty_dir'
|
||||
r' /linkdest'
|
||||
r' /exclude='
|
||||
r'$RECYCLE.BIN;'
|
||||
r'$Recycle.Bin;'
|
||||
r'.AppleDB;'
|
||||
r'.AppleDesktop;'
|
||||
r'.AppleDouble;'
|
||||
r'.com.apple.timemachine.supported;'
|
||||
r'.dbfseventsd;'
|
||||
r'.DocumentRevisions-V100*;'
|
||||
r'.DS_Store;'
|
||||
r'.fseventsd;'
|
||||
r'.PKInstallSandboxManager;'
|
||||
r'.Spotlight*;'
|
||||
r'.SymAV*;'
|
||||
r'.symSchedScanLockxz;'
|
||||
r'.TemporaryItems;'
|
||||
r'.Trash*;'
|
||||
r'.vol;'
|
||||
r'.VolumeIcon.icns;'
|
||||
r'desktop.ini;'
|
||||
r'Desktop?DB;'
|
||||
r'Desktop?DF;'
|
||||
r'hiberfil.sys;'
|
||||
r'lost+found;'
|
||||
r'Network?Trash?Folder;'
|
||||
r'pagefile.sys;'
|
||||
r'Recycled;'
|
||||
r'RECYCLER;'
|
||||
r'System?Volume?Information;'
|
||||
r'Temporary?Items;'
|
||||
r'Thumbs.db'
|
||||
r' /to=%client_dir%\Transfer_%iso_date%\ '
|
||||
),
|
||||
'L_ELEV': 'True',
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info /Transfer',
|
||||
],
|
||||
},
|
||||
'FastCopy': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'FastCopy',
|
||||
'L_ITEM': 'FastCopy.exe',
|
||||
'L_ARGS': (
|
||||
r' /logfile=%log_dir%\FastCopy.log'
|
||||
r' /cmd=noexist_only'
|
||||
r' /utf8'
|
||||
r' /skip_empty_dir'
|
||||
r' /linkdest'
|
||||
r' /exclude='
|
||||
r'$RECYCLE.BIN;'
|
||||
r'$Recycle.Bin;'
|
||||
r'.AppleDB;'
|
||||
r'.AppleDesktop;'
|
||||
r'.AppleDouble;'
|
||||
r'.com.apple.timemachine.supported;'
|
||||
r'.dbfseventsd;'
|
||||
r'.DocumentRevisions-V100*;'
|
||||
r'.DS_Store;'
|
||||
r'.fseventsd;'
|
||||
r'.PKInstallSandboxManager;'
|
||||
r'.Spotlight*;'
|
||||
r'.SymAV*;'
|
||||
r'.symSchedScanLockxz;'
|
||||
r'.TemporaryItems;'
|
||||
r'.Trash*;'
|
||||
r'.vol;'
|
||||
r'.VolumeIcon.icns;'
|
||||
r'desktop.ini;'
|
||||
r'Desktop?DB;'
|
||||
r'Desktop?DF;'
|
||||
r'hiberfil.sys;'
|
||||
r'lost+found;'
|
||||
r'Network?Trash?Folder;'
|
||||
r'pagefile.sys;'
|
||||
r'Recycled;'
|
||||
r'RECYCLER;'
|
||||
r'System?Volume?Information;'
|
||||
r'Temporary?Items;'
|
||||
r'Thumbs.db'
|
||||
r' /to=%client_dir%\Transfer_%iso_date%\ '
|
||||
),
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info /Transfer',
|
||||
],
|
||||
},
|
||||
'KVRT': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'KVRT',
|
||||
'L_ITEM': 'KVRT.exe',
|
||||
'L_ARGS': (
|
||||
r' -accepteula'
|
||||
r' -d %q_dir%'
|
||||
r' -processlevel 3'
|
||||
r' -dontcryptsupportinfo'
|
||||
r' -fixednames'
|
||||
),
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
|
||||
r'set "q_dir=%client_dir%\Quarantine\KVRT"',
|
||||
r'mkdir "%q_dir%">nul 2>&1',
|
||||
],
|
||||
},
|
||||
'Transferred Keys': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'transferred_keys.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'User Data Transfer': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'user_data_transfer.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'XYplorer (as ADMIN)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'XYplorerFree',
|
||||
'L_ITEM': 'XYplorerFree.exe',
|
||||
'L_ARGS': r'/exp /win=max %userprofile%',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'XYplorer': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'XYplorerFree',
|
||||
'L_ITEM': 'XYplorerFree.exe',
|
||||
'L_ARGS': r'/exp /win=max %userprofile%',
|
||||
},
|
||||
},
|
||||
r'Diagnostics': {
|
||||
'HWiNFO': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
],
|
||||
},
|
||||
'ProduKey': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'ProduKey',
|
||||
'L_ITEM': 'ProduKey.exe',
|
||||
'L_ELEV': 'True',
|
||||
'Extra Code': [
|
||||
r'if exist "%bin%\ProduKey" (',
|
||||
r' del "%bin%\ProduKey\ProduKey.cfg" 2>nul',
|
||||
r' del "%bin%\ProduKey\ProduKey64.cfg" 2>nul',
|
||||
r')',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Diagnostics\Extras': {
|
||||
'AIDA64': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'AIDA64',
|
||||
'L_ITEM': 'aida64.exe',
|
||||
},
|
||||
'Autoruns (with VirusTotal Scan)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'Autoruns',
|
||||
'L_ITEM': 'Autoruns.exe',
|
||||
'L_ARGS': '-e',
|
||||
'Extra Code': [
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
],
|
||||
},
|
||||
'BleachBit': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'BleachBit',
|
||||
'L_ITEM': 'bleachbit.exe',
|
||||
},
|
||||
'BlueScreenView': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'BlueScreenView',
|
||||
'L_ITEM': 'BlueScreenView.exe',
|
||||
},
|
||||
'ERUNT': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'erunt',
|
||||
'L_ITEM': 'ERUNT.EXE',
|
||||
'L_ARGS': '%client_dir%\Backups\%iso_date%\Registry sysreg curuser otherusers',
|
||||
'L_ELEV': 'True',
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
||||
],
|
||||
},
|
||||
'HitmanPro': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HitmanPro',
|
||||
'L_ITEM': 'HitmanPro.exe',
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
||||
],
|
||||
},
|
||||
'HWiNFO (Sensors)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=1)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Drivers': {
|
||||
'Intel RST (Current Release)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': '_Drivers\Intel RST',
|
||||
'L_ITEM': 'SetupRST_15.8.exe',
|
||||
'L_7ZIP': 'SetupRST_15.8.exe',
|
||||
},
|
||||
'Intel RST (Previous Releases)': {
|
||||
'L_TYPE': 'Folder',
|
||||
'L_PATH': '_Drivers\Intel RST',
|
||||
'L_ITEM': '.',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Intel SSD Toolbox': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': r'_Drivers\Intel SSD Toolbox',
|
||||
'L_ITEM': 'Intel SSD Toolbox.exe',
|
||||
},
|
||||
'Samsing Magician': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': r'_Drivers\Samsung Magician',
|
||||
'L_ITEM': 'Samsung Magician.exe',
|
||||
},
|
||||
'Snappy Driver Installer Origin': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': '_Drivers\SDIO',
|
||||
'L_ITEM': 'SDIO.exe',
|
||||
},
|
||||
},
|
||||
r'Drivers\Extras': {
|
||||
'Acer': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
r'start "" "http://us.acer.com/ac/en/US/content/drivers"',
|
||||
],
|
||||
},
|
||||
'Lenovo': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
r'start "" "https://pcsupport.lenovo.com/us/en/"',
|
||||
],
|
||||
},
|
||||
'Toshiba': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
r'start "" "http://support.toshiba.com/drivers"',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Installers': {
|
||||
'SW Bundle': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'install_sw_bundle.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
},
|
||||
r'Installers\Extras\Office\2013': {
|
||||
'Home and Business 2013 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2013',
|
||||
'L_ITEM': 'hb_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Business 2013 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2013',
|
||||
'L_ITEM': 'hb_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2013 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2013',
|
||||
'L_ITEM': 'hs_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2013 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2013',
|
||||
'L_ITEM': 'hs_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
},
|
||||
r'Installers\Extras\Office\2016': {
|
||||
'Home and Business 2016 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hb_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Business 2016 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hb_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2016 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hs_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2016 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hs_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Office 365 2016 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': '365_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Office 365 2016 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': '365_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
},
|
||||
r'Installers\Extras\Runtimes': {
|
||||
'Visual C++ Runtimes': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'install_vcredists.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
},
|
||||
r'Misc': {
|
||||
'ConEmu (as ADMIN)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'ConEmu',
|
||||
'L_ITEM': 'ConEmu.exe',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'ConEmu': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'ConEmu',
|
||||
'L_ITEM': 'ConEmu.exe',
|
||||
},
|
||||
'Everything': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'Everything',
|
||||
'L_ITEM': 'Everything.exe',
|
||||
'L_ARGS': '-nodb',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'Notepad++': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'notepadplusplus',
|
||||
'L_ITEM': 'notepadplusplus.exe',
|
||||
},
|
||||
'PuTTY': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'PuTTY',
|
||||
'L_ITEM': 'PUTTY.EXE',
|
||||
},
|
||||
'TreeSizeFree': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TreeSizeFree',
|
||||
'L_ITEM': 'TreeSizeFree.exe',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'Update Kit': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'update_kit.py',
|
||||
},
|
||||
'XMPlay': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'XMPlay',
|
||||
'L_ITEM': 'xmplay.exe',
|
||||
'L_ARGS': '"%bin%\XMPlay\music.7z"',
|
||||
},
|
||||
},
|
||||
r'Repairs': {
|
||||
'AdwCleaner': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'AdwCleaner',
|
||||
'L_ITEM': 'AdwCleaner.exe',
|
||||
},
|
||||
'Autoruns': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'Autoruns',
|
||||
'L_ITEM': 'Autoruns.exe',
|
||||
'L_ARGS': '-e',
|
||||
'Extra Code': [
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
],
|
||||
},
|
||||
'CHKDSK': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'check_disk.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'DISM': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'dism.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'KVRT': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'KVRT',
|
||||
'L_ITEM': 'KVRT.exe',
|
||||
'L_ARGS': (
|
||||
r' -accepteula'
|
||||
r' -d %q_dir%'
|
||||
r' -processlevel 3'
|
||||
r' -dontcryptsupportinfo'
|
||||
r' -fixednames'
|
||||
),
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
|
||||
r'set "q_dir=%client_dir%\Quarantine\KVRT"',
|
||||
r'mkdir "%q_dir%">nul 2>&1',
|
||||
],
|
||||
},
|
||||
'RKill': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'RKill',
|
||||
'L_ITEM': 'RKill.exe',
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
||||
],
|
||||
},
|
||||
'SFC Scan': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'sfc_scan.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'TDSSKiller': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TDSSKiller',
|
||||
'L_ITEM': 'TDSSKiller.exe',
|
||||
'L_ARGS': (
|
||||
r' -l %log_dir%\TDSSKiller.log'
|
||||
r' -qpath %q_dir%'
|
||||
r' -accepteula'
|
||||
r' -accepteulaksn'
|
||||
r' -dcexact'
|
||||
r' -tdlfs'
|
||||
),
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
|
||||
r'set "q_dir=%client_dir%\Quarantine\TDSSKiller"',
|
||||
r'mkdir "%q_dir%">nul 2>&1',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Uninstallers': {
|
||||
'IObit Uninstaller': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'IObitUninstallerPortable',
|
||||
'L_ITEM': 'IObitUninstallerPortable.exe',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
68
.bin/Scripts/settings/main.py
Normal file
68
.bin/Scripts/settings/main.py
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
# Wizard Kit: Settings - Main / Branding
|
||||
|
||||
# Features
|
||||
ENABLED_UPLOAD_DATA = False
|
||||
|
||||
# STATIC VARIABLES (also used by .cmd files)
|
||||
## Not using spaces aroung '=' for easier .cmd substrings
|
||||
ARCHIVE_PASSWORD='Abracadabra'
|
||||
KIT_NAME_FULL='Wizard Kit'
|
||||
KIT_NAME_SHORT='WK'
|
||||
OFFICE_SERVER_IP='10.0.0.10'
|
||||
QUICKBOOKS_SERVER_IP='10.0.0.10'
|
||||
SUPPORT_MESSAGE='Please let 2Shirt know by opening an issue on GitHub'
|
||||
TIME_ZONE='Pacific Standard Time' # Always use "Standard Time" (DST is applied correctly)
|
||||
|
||||
# SERVER VARIABLES
|
||||
## NOTE: Windows can only use one user per server. This means that if
|
||||
## one server serves multiple shares then you have to use the same
|
||||
## user/password for all of those shares.
|
||||
BACKUP_SERVERS = [
|
||||
{ 'IP': '10.0.0.10',
|
||||
'Name': 'ServerOne',
|
||||
'Mounted': False,
|
||||
'Share': 'Backups',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
},
|
||||
{ 'IP': '10.0.0.11',
|
||||
'Name': 'ServerTwo',
|
||||
'Mounted': False,
|
||||
'Share': 'Backups',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
},
|
||||
]
|
||||
CLIENT_INFO_SERVER = {
|
||||
'IP': '10.0.0.10',
|
||||
'RegEntry': r'0x10001,0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
|
||||
'Share': '/srv/ClientInfo',
|
||||
'User': 'upload',
|
||||
}
|
||||
OFFICE_SERVER = {
|
||||
'IP': OFFICE_SERVER_IP,
|
||||
'Name': 'ServerOne',
|
||||
'Mounted': False,
|
||||
'Share': 'Office',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
}
|
||||
QUICKBOOKS_SERVER = {
|
||||
'IP': QUICKBOOKS_SERVER_IP,
|
||||
'Name': 'ServerOne',
|
||||
'Mounted': False,
|
||||
'Share': 'QuickBooks',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
}
|
||||
WINDOWS_SERVER = {
|
||||
'IP': '10.0.0.10',
|
||||
'Name': 'ServerOne',
|
||||
'Mounted': False,
|
||||
'Share': 'Windows',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
70
.bin/Scripts/settings/music.py
Normal file
70
.bin/Scripts/settings/music.py
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
# Wizard Kit: Settings - Music
|
||||
|
||||
MUSIC_MOD = [
|
||||
'104208#banana_boat.mod',
|
||||
'114971#tilbury_fair.mod',
|
||||
'132563#ufo_tune.mod',
|
||||
'135906#magnetik_girl.xm',
|
||||
'140628#autumn_in_budapest.xm',
|
||||
'143198#summer_memories_3.xm',
|
||||
'144405#hillbilly_billyboy.xm',
|
||||
'154795#4mat_-_eternity.xm',
|
||||
'155845#bookworm.mo3',
|
||||
'155914#battleofsteel.xm',
|
||||
'158975#1_channel_moog.it',
|
||||
'165495#trans.s3m',
|
||||
'168513#necros_-_introspection.s3m',
|
||||
'169628#radix_-_feng_shui_schematics.xm',
|
||||
'175238#unknown48_-_twilight.mod',
|
||||
'33432#ambrozia.xm',
|
||||
'33460#amigatre.mod',
|
||||
'34594#CHARIOT.S3M',
|
||||
'34596#BUTTERFL.XM',
|
||||
'34654#CTGOBLIN.S3M',
|
||||
'35151#bananasplit.mod',
|
||||
'35280#DEADLOCK.XM',
|
||||
'38591#compo_liam.xm',
|
||||
'39987#crystald.s3m',
|
||||
'40475#ELYSIUM.MOD',
|
||||
'42146#enigma.mod',
|
||||
'42519#GHOST2.MOD',
|
||||
'42560#GSLINGER.MOD',
|
||||
'42872#existing.xm',
|
||||
'50427#nf-stven.xm',
|
||||
'51549#overture.mod',
|
||||
'54250#SATELL.S3M',
|
||||
'54313#realmk.s3m',
|
||||
'55789#scrambld.mod',
|
||||
'57934#spacedeb.mod',
|
||||
'59344#stardstm.mod',
|
||||
'60395#2ND_PM.S3M',
|
||||
'66187#external.xm',
|
||||
'66343#beek-substitutionology.it',
|
||||
'67561#radix-unreal_superhero.xm',
|
||||
'70829#inside_out.s3m',
|
||||
'83779#beyond_music.mod',
|
||||
]
|
||||
|
||||
MUSIC_SNES = [
|
||||
'actr',
|
||||
'crock',
|
||||
'ct',
|
||||
'dkc',
|
||||
'dkq',
|
||||
'ff6',
|
||||
'fz',
|
||||
'loz3',
|
||||
'mmx',
|
||||
'ptws',
|
||||
'scv4',
|
||||
'sf',
|
||||
'sf2',
|
||||
'sgng',
|
||||
'smk',
|
||||
'smw',
|
||||
'yi',
|
||||
'zamn'
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
203
.bin/Scripts/settings/sources.py
Normal file
203
.bin/Scripts/settings/sources.py
Normal file
|
|
@ -0,0 +1,203 @@
|
|||
# Wizard Kit: Settings - Sources
|
||||
|
||||
SOURCE_URLS = {
|
||||
'AIDA64': 'http://download.aida64.com/aida64engineer595.zip',
|
||||
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1800920044/AcroRdrDC1800920044_en_US.exe',
|
||||
'AdwCleaner': 'https://toolslib.net/downloads/finish/1-adwcleaner/',
|
||||
'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip',
|
||||
'BleachBit': 'https://download.bleachbit.org/beta/1.17/BleachBit-1.17-portable.zip',
|
||||
'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip',
|
||||
'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip',
|
||||
'Caffeine': 'http://www.zhornsoftware.co.uk/caffeine/caffeine.zip',
|
||||
'ClassicStartSkin': 'http://www.classicshell.net/forum/download/file.php?id=3001&sid=9a195960d98fd754867dcb63d9315335',
|
||||
'Du': 'https://download.sysinternals.com/files/DU.zip',
|
||||
'ERUNT': 'http://www.aumha.org/downloads/erunt.zip',
|
||||
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.877.x86.zip',
|
||||
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.877.x64.zip',
|
||||
'FastCopy32': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332.zip',
|
||||
'FastCopy64': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332_x64.zip',
|
||||
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/764482/ublock_origin-1.14.18-an+fx.xpi?src=dp-btn-primary',
|
||||
'HWiNFO32': 'http://app.oldfoss.com:81/download/HWiNFO/hw32_560.zip',
|
||||
'HWiNFO64': 'http://app.oldfoss.com:81/download/HWiNFO/hw64_560.zip',
|
||||
'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe',
|
||||
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
|
||||
'IOBit_Uninstaller': 'https://portableapps.com/redirect/?a=IObitUninstallerPortable&t=http%3A%2F%2Fdownloads.portableapps.com%2Fportableapps%2Fiobituninstallerportable%2FIObitUninstallerPortable_7.0.2.49.paf.exe',
|
||||
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/27330/eng/Intel%20SSD%20Toolbox%20-%20v3.4.9.exe',
|
||||
'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe',
|
||||
'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.7z',
|
||||
'Office Deployment Tool 2013': 'https://download.microsoft.com/download/6/2/3/6230F7A2-D8A9-478B-AC5C-57091B632FCF/officedeploymenttool_x86_4827-1000.exe',
|
||||
'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_8529.3600.exe',
|
||||
'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip',
|
||||
'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip',
|
||||
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
|
||||
'RKill': 'https://www.bleepingcomputer.com/download/rkill/dl/10/',
|
||||
'SDIO Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip',
|
||||
'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent',
|
||||
'Samsung Magician': 'http://downloadcenter.samsung.com/content/SW/201710/20171019164455812/Samsung_Magician_Installer.exe',
|
||||
'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe',
|
||||
'TestDisk': 'https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip',
|
||||
'TreeSizeFree': 'https://www.jam-software.com/treesize_free/TreeSizeFree-Portable.zip',
|
||||
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip',
|
||||
'wimlib64': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip',
|
||||
'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip',
|
||||
'XMPlay 7z': 'http://support.xmplay.com/files/16/xmp-7z.zip?v=800962',
|
||||
'XMPlay Game': 'http://support.xmplay.com/files/12/xmp-gme.zip?v=515637',
|
||||
'XMPlay RAR': 'http://support.xmplay.com/files/16/xmp-rar.zip?v=409646',
|
||||
'XMPlay WAModern': 'http://support.xmplay.com/files/10/WAModern.zip?v=207099',
|
||||
'XMPlay': 'http://support.xmplay.com/files/20/xmplay3823.zip?v=115916',
|
||||
'XYplorerFree': 'https://www.xyplorer.com/download/xyplorer_free_noinstall.zip',
|
||||
'aria2': 'https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1-win-32bit-build1.zip',
|
||||
}
|
||||
VCREDIST_SOURCES = {
|
||||
'2008sp1': {
|
||||
'32': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe',
|
||||
'64': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe',
|
||||
},
|
||||
'2010sp1': {
|
||||
'32': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe',
|
||||
'64': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe',
|
||||
},
|
||||
'2012u4': {
|
||||
'32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe',
|
||||
'64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe',
|
||||
},
|
||||
'2013': {
|
||||
'32': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe',
|
||||
'64': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe',
|
||||
},
|
||||
'2017': {
|
||||
'32': 'https://download.visualstudio.microsoft.com/download/pr/11100229/78c1e864d806e36f6035d80a0e80399e/VC_redist.x86.exe',
|
||||
'64': 'https://download.visualstudio.microsoft.com/download/pr/11100230/15ccb3f02745c7b206ad10373cbca89b/VC_redist.x64.exe',
|
||||
},
|
||||
}
|
||||
NINITE_SOURCES = {
|
||||
'Bundles': {
|
||||
'Runtimes.exe': '.net4.7-air-java8-silverlight',
|
||||
'Legacy.exe': '.net4.7-7zip-air-chrome-firefox-java8-silverlight-vlc',
|
||||
'Modern.exe': '.net4.7-7zip-air-chrome-classicstart-firefox-java8-silverlight-vlc',
|
||||
},
|
||||
'Audio-Video': {
|
||||
'AIMP.exe': 'aimp',
|
||||
'Audacity.exe': 'audacity',
|
||||
'CCCP.exe': 'cccp',
|
||||
'Foobar2000.exe': 'foobar',
|
||||
'GOM.exe': 'gom',
|
||||
'HandBrake.exe': 'handbrake',
|
||||
'iTunes.exe': 'itunes',
|
||||
'K-Lite Codecs.exe': 'klitecodecs',
|
||||
'MediaMonkey.exe': 'mediamonkey',
|
||||
'MusicBee.exe': 'musicbee',
|
||||
'Spotify.exe': 'spotify',
|
||||
'VLC.exe': 'vlc',
|
||||
'Winamp.exe': 'winamp',
|
||||
},
|
||||
'Cloud Storage': {
|
||||
'Dropbox.exe': 'dropbox',
|
||||
'Google Backup & Sync.exe': 'googlebackupandsync',
|
||||
'Mozy.exe': 'mozy',
|
||||
'OneDrive.exe': 'onedrive',
|
||||
'SugarSync.exe': 'sugarsync',
|
||||
},
|
||||
'Communication': {
|
||||
'Pidgin.exe': 'pidgin',
|
||||
'Skype.exe': 'skype',
|
||||
'Trillian.exe': 'trillian',
|
||||
},
|
||||
'Compression': {
|
||||
'7-Zip.exe': '7zip',
|
||||
'PeaZip.exe': 'peazip',
|
||||
'WinRAR.exe': 'winrar',
|
||||
},
|
||||
'Developer': {
|
||||
'Eclipse.exe': 'eclipse',
|
||||
'FileZilla.exe': 'filezilla',
|
||||
'JDK 8.exe': 'jdk8',
|
||||
'JDK 8 (x64).exe': 'jdkx8',
|
||||
'Notepad++.exe': 'notepadplusplus',
|
||||
'PuTTY.exe': 'putty',
|
||||
'Python 2.exe': 'python',
|
||||
'Visual Studio Code.exe': 'vscode',
|
||||
'WinMerge.exe': 'winmerge',
|
||||
'WinSCP.exe': 'winscp',
|
||||
},
|
||||
'File Sharing': {
|
||||
'qBittorrent.exe': 'qbittorrent',
|
||||
},
|
||||
'Image-Photo': {
|
||||
'Blender.exe': 'blender',
|
||||
'FastStone.exe': 'faststone',
|
||||
'GIMP.exe': 'gimp',
|
||||
'Greenshot.exe': 'greenshot',
|
||||
'Inkscape.exe': 'inkscape',
|
||||
'IrfanView.exe': 'irfanview',
|
||||
'Krita.exe': 'krita',
|
||||
'Paint.NET.exe': 'paint.net',
|
||||
'ShareX.exe': 'sharex',
|
||||
'XnView.exe': 'xnview',
|
||||
},
|
||||
'Misc': {
|
||||
'Evernote.exe': 'evernote',
|
||||
'Everything.exe': 'everything',
|
||||
'KeePass 2.exe': 'keepass2',
|
||||
'Google Earth.exe': 'googleearth',
|
||||
'NV Access.exe': 'nvda',
|
||||
'Steam.exe': 'steam',
|
||||
},
|
||||
'Office': {
|
||||
'CutePDF.exe': 'cutepdf',
|
||||
'Foxit Reader.exe': 'foxit',
|
||||
'LibreOffice.exe': 'libreoffice',
|
||||
'OpenOffice.exe': 'openoffice',
|
||||
'PDFCreator.exe': 'pdfcreator',
|
||||
'SumatraPDF.exe': 'sumatrapdf',
|
||||
'Thunderbird.exe': 'thunderbird',
|
||||
},
|
||||
'Runtimes': {
|
||||
'Adobe Air.exe': 'air',
|
||||
'dotNET.exe': '.net4.7',
|
||||
'Java 8.exe': 'java8',
|
||||
'Shockwave.exe': 'shockwave',
|
||||
'Silverlight.exe': 'silverlight',
|
||||
},
|
||||
'Security': {
|
||||
'Avast.exe': 'avast',
|
||||
'AVG.exe': 'avg',
|
||||
'Avira.exe': 'avira',
|
||||
'Microsoft Security Essentials.exe': 'essentials',
|
||||
'Malwarebytes Anti-Malware.exe': 'malwarebytes',
|
||||
'Spybot 2.exe': 'spybot2',
|
||||
'SUPERAntiSpyware.exe': 'super',
|
||||
},
|
||||
'Utilities': {
|
||||
'CDBurnerXP.exe': 'cdburnerxp',
|
||||
'Classic Start.exe': 'classicstart',
|
||||
'Glary Utilities.exe': 'glary',
|
||||
'ImgBurn.exe': 'imgburn',
|
||||
'InfraRecorder.exe': 'infrarecorder',
|
||||
'Launchy.exe': 'launchy',
|
||||
'RealVNC.exe': 'realvnc',
|
||||
'Revo Uninstaller.exe': 'revo',
|
||||
'TeamViewer 12.exe': 'teamviewer12',
|
||||
'TeraCopy.exe': 'teracopy',
|
||||
'WinDirStat.exe': 'windirstat',
|
||||
},
|
||||
'Web Browsers': {
|
||||
'Google Chrome.exe': 'chrome',
|
||||
'Mozilla Firefox.exe': 'firefox',
|
||||
'Opera Chromium.exe': 'operaChromium',
|
||||
},
|
||||
}
|
||||
RST_SOURCES = {
|
||||
#SetupRST_12.0.exe : Removed from download center?
|
||||
#SetupRST_12.5.exe : Removed from download center?
|
||||
#SetupRST_12.8.exe : Removed from download center?
|
||||
'SetupRST_12.9.exe': 'https://downloadmirror.intel.com/23496/eng/SetupRST.exe',
|
||||
#SetupRST_13.x.exe : Broken, doesn't support > .NET 4.5
|
||||
'SetupRST_14.0.exe': 'https://downloadmirror.intel.com/25091/eng/SetupRST.exe',
|
||||
'SetupRST_14.8.exe': 'https://downloadmirror.intel.com/26759/eng/setuprst.exe',
|
||||
'SetupRST_15.8.exe': 'https://downloadmirror.intel.com/27147/eng/SetupRST.exe',
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
55
.bin/Scripts/settings/tools.py
Normal file
55
.bin/Scripts/settings/tools.py
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
# Wizard Kit: Settings - Tools
|
||||
|
||||
TOOLS = {
|
||||
# NOTE: BinDir will be prepended to these paths at runtime
|
||||
'AIDA64': {
|
||||
'32': r'AIDA64\aida64.exe'},
|
||||
'AutoRuns': {
|
||||
'32': r'Autoruns\autoruns.exe',
|
||||
'64': r'Autoruns\autoruns64.exe'},
|
||||
'BleachBit': {
|
||||
'32': r'BleachBit\bleachbit_console.exe'},
|
||||
'Caffeine': {
|
||||
'32': r'Caffeine\caffeine.exe'},
|
||||
'Du': {
|
||||
'32': r'Du\du.exe',
|
||||
'64': r'Du\du64.exe'},
|
||||
'ERUNT': {
|
||||
'32': r'ERUNT\ERUNT.EXE'},
|
||||
'Everything': {
|
||||
'32': r'Everything\Everything.exe',
|
||||
'64': r'Everything\Everything64.exe'},
|
||||
'FastCopy': {
|
||||
'32': r'FastCopy\FastCopy.exe',
|
||||
'64': r'FastCopy\FastCopy64.exe'},
|
||||
'HitmanPro': {
|
||||
'32': r'HitmanPro\HitmanPro.exe',
|
||||
'64': r'HitmanPro\HitmanPro64.exe'},
|
||||
'HWiNFO': {
|
||||
'32': r'HWiNFO\HWiNFO.exe',
|
||||
'64': r'HWiNFO\HWiNFO64.exe'},
|
||||
'KVRT': {
|
||||
'32': r'KVRT\KVRT.exe'},
|
||||
'NotepadPlusPlus': {
|
||||
'32': r'NotepadPlusPlus\notepadplusplus.exe'},
|
||||
'ProduKey': {
|
||||
'32': r'ProduKey\ProduKey.exe',
|
||||
'64': r'ProduKey\ProduKey64.exe'},
|
||||
'PuTTY-PSFTP': {
|
||||
'32': r'PuTTY\PSFTP.EXE'},
|
||||
'RKill': {
|
||||
'32': r'RKill\RKill.exe'},
|
||||
'SevenZip': {
|
||||
'32': r'7-Zip\7za.exe',
|
||||
'64': r'7-Zip\7za64.exe'},
|
||||
'TDSSKiller': {
|
||||
'32': r'TDSSKiller\TDSSKiller.exe'},
|
||||
'wimlib-imagex': {
|
||||
'32': r'wimlib\x32\wimlib-imagex.exe',
|
||||
'64': r'wimlib\x64\wimlib-imagex.exe'},
|
||||
'XMPlay': {
|
||||
'32': r'XMPlay\xmplay.exe'},
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
39
.bin/Scripts/sfc_scan.py
Normal file
39
.bin/Scripts/sfc_scan.py
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
# Wizard Kit: Check, and possibly repair, system file health via SFC
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SFC Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\SFC Tool.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: SFC Tool\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
}}
|
||||
if ask('Run a SFC scan now?'):
|
||||
try_and_print(message='SFC scan...',
|
||||
function=run_sfc_scan, other_results=other_results)
|
||||
else:
|
||||
abort()
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter to exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
107
.bin/Scripts/system_checklist.py
Normal file
107
.bin/Scripts/system_checklist.py
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
# Wizard Kit: System Checklist
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.activation import *
|
||||
from functions.cleanup import *
|
||||
from functions.diags import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: System Checklist Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\System Checklist.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: System Checklist Tool\n'.format(KIT_NAME_FULL))
|
||||
ticket_number = get_ticket_number()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'BIOSKeyNotFoundError': 'BIOS key not found',
|
||||
},
|
||||
'Warning': {}}
|
||||
print_info('Starting System Checklist for Ticket #{}\n'.format(
|
||||
ticket_number))
|
||||
|
||||
# Configure
|
||||
print_info('Configure')
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
try_and_print(message='Explorer...',
|
||||
function=config_explorer_system, cs='Done')
|
||||
try_and_print(message='Updating Clock...',
|
||||
function=update_clock, cs='Done')
|
||||
|
||||
# Cleanup
|
||||
print_info('Cleanup')
|
||||
try_and_print(message='Desktop...',
|
||||
function=cleanup_desktop, cs='Done')
|
||||
try_and_print(message='AdwCleaner...',
|
||||
function=cleanup_adwcleaner, cs='Done')
|
||||
|
||||
# Export system info
|
||||
print_info('Backup System Information')
|
||||
try_and_print(message='AIDA64 reports...',
|
||||
function=run_aida64, cs='Done')
|
||||
try_and_print(message='File listing...',
|
||||
function=backup_file_list, cs='Done')
|
||||
try_and_print(message='Power plans...',
|
||||
function=backup_power_plans, cs='Done')
|
||||
try_and_print(message='Product Keys...',
|
||||
function=run_produkey, cs='Done')
|
||||
try_and_print(message='Registry...',
|
||||
function=backup_registry, cs='Done')
|
||||
|
||||
# User data
|
||||
print_info('User Data')
|
||||
show_user_data_summary()
|
||||
|
||||
# Summary
|
||||
print_info('Summary')
|
||||
try_and_print(message='Operating System:',
|
||||
function=show_os_name, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='Activation:',
|
||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
||||
if (not windows_is_activated()
|
||||
and global_vars['OS']['Version'] in ('8', '10')):
|
||||
try_and_print(message='BIOS Activation:',
|
||||
function=activate_with_bios,
|
||||
other_results=other_results)
|
||||
try_and_print(message='Installed Office:',
|
||||
function=get_installed_office, ns='Unknown', print_return=True)
|
||||
show_free_space()
|
||||
try_and_print(message='Installed RAM:',
|
||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
||||
|
||||
# Upload info
|
||||
if ENABLED_UPLOAD_DATA:
|
||||
print_info('Finalizing')
|
||||
try_and_print(message='Compressing Info...',
|
||||
function=compress_info, cs='Done')
|
||||
try_and_print(message='Uploading to NAS...',
|
||||
function=upload_info, cs='Done')
|
||||
|
||||
# Play audio, show devices, open Windows updates, and open Activation
|
||||
popen_program(['mmc', 'devmgmt.msc'])
|
||||
run_hwinfo_sensors()
|
||||
popen_program(['control', '/name', 'Microsoft.WindowsUpdate'])
|
||||
if not windows_is_activated():
|
||||
popen_program('slui')
|
||||
sleep(3)
|
||||
run_xmplay()
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
124
.bin/Scripts/system_diagnostics.py
Normal file
124
.bin/Scripts/system_diagnostics.py
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
# Wizard Kit: System Diagnostics
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.browsers import *
|
||||
from functions.diags import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: System Diagnostics Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\System Diagnostics.log'.format(
|
||||
**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: System Diagnostics Tool\n'.format(KIT_NAME_FULL))
|
||||
ticket_number = get_ticket_number()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
print_info('Starting System Diagnostics for Ticket #{}\n'.format(
|
||||
ticket_number))
|
||||
|
||||
# Sanitize Environment
|
||||
print_info('Sanitizing Environment')
|
||||
# try_and_print(message='Killing processes...',
|
||||
# function=run_process_killer, cs='Done')
|
||||
try_and_print(message='Running RKill...',
|
||||
function=run_rkill, cs='Done')
|
||||
try_and_print(message='Running TDSSKiller...',
|
||||
function=run_tdsskiller, cs='Done')
|
||||
|
||||
# Re-run if earlier process was stopped.
|
||||
stay_awake()
|
||||
|
||||
# Start diags
|
||||
print_info('Starting Background Scans')
|
||||
check_connection()
|
||||
try_and_print(message='Running HitmanPro...',
|
||||
function=run_hitmanpro, cs='Started')
|
||||
try_and_print(message='Running Autoruns...',
|
||||
function=run_autoruns, cs='Started')
|
||||
|
||||
# OS Health Checks
|
||||
print_info('OS Health Checks')
|
||||
try_and_print(
|
||||
message='CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env']),
|
||||
function=run_chkdsk, other_results=other_results)
|
||||
try_and_print(message='SFC scan...',
|
||||
function=run_sfc_scan, other_results=other_results)
|
||||
try_and_print(message='DISM CheckHealth...',
|
||||
function=run_dism, other_results=other_results, repair=False)
|
||||
|
||||
# Scan for supported browsers
|
||||
print_info('Scanning for browsers')
|
||||
scan_for_browsers()
|
||||
|
||||
# Export system info
|
||||
print_info('Backup System Information')
|
||||
try_and_print(message='AIDA64 reports...',
|
||||
function=run_aida64, cs='Done')
|
||||
try_and_print(message='BleachBit report...',
|
||||
function=run_bleachbit, cs='Done')
|
||||
backup_browsers()
|
||||
try_and_print(message='File listing...',
|
||||
function=backup_file_list, cs='Done')
|
||||
try_and_print(message='Power plans...',
|
||||
function=backup_power_plans, cs='Done')
|
||||
try_and_print(message='Product Keys...',
|
||||
function=run_produkey, cs='Done')
|
||||
try_and_print(message='Registry...',
|
||||
function=backup_registry, cs='Done')
|
||||
|
||||
# Summary
|
||||
print_info('Summary')
|
||||
try_and_print(message='Temp Size:',
|
||||
function=show_temp_files_size, silent_function=False)
|
||||
show_free_space()
|
||||
try_and_print(message='Installed RAM:',
|
||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='Installed Office:',
|
||||
function=get_installed_office, ns='Unknown', print_return=True)
|
||||
try_and_print(message='Product Keys:',
|
||||
function=get_product_keys, ns='Unknown', print_return=True)
|
||||
try_and_print(message='Operating System:',
|
||||
function=show_os_name, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='',
|
||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
||||
|
||||
# User data
|
||||
print_info('User Data')
|
||||
try:
|
||||
show_user_data_summary()
|
||||
except Exception:
|
||||
print_error(' Unknown error.')
|
||||
|
||||
# Upload info
|
||||
if ENABLED_UPLOAD_DATA:
|
||||
print_info('Finalizing')
|
||||
try_and_print(message='Compressing Info...',
|
||||
function=compress_info, cs='Done')
|
||||
try_and_print(message='Uploading to NAS...',
|
||||
function=upload_info, cs='Done')
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter to exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
28
.bin/Scripts/transferred_keys.py
Normal file
28
.bin/Scripts/transferred_keys.py
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# Wizard Kit: Search for product keys in the transfer folder
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.product_keys import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Transferred Key Finder'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\Transferred Keys.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: Transferred Key Finder\n'.format(KIT_NAME_FULL))
|
||||
try_and_print(message='Searching for keys...',
|
||||
function=list_clientdir_keys, print_return=True)
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
143
.bin/Scripts/update_kit.py
Normal file
143
.bin/Scripts/update_kit.py
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
# Wizard Kit: Download the latest versions of the programs in the kit
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.update import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Kit Update Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
clear_screen()
|
||||
print_info('{}: Kit Update Tool\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
}}
|
||||
|
||||
## Prep ##
|
||||
update_sdio = ask('Update SDI Origin?')
|
||||
|
||||
## Download ##
|
||||
print_success('Downloading tools')
|
||||
|
||||
# Data Recovery
|
||||
print_info(' Data Recovery')
|
||||
try_and_print(message='TestDisk / PhotoRec...', function=update_testdisk, other_results=other_results, width=40)
|
||||
|
||||
# Data Transfers
|
||||
print_info(' Data Transfers')
|
||||
try_and_print(message='FastCopy...', function=update_fastcopy, other_results=other_results, width=40)
|
||||
try_and_print(message='wimlib...', function=update_wimlib, other_results=other_results, width=40)
|
||||
try_and_print(message='XYplorer...', function=update_xyplorer, other_results=other_results, width=40)
|
||||
|
||||
# Diagnostics
|
||||
print_info(' Diagnostics')
|
||||
try_and_print(message='AIDA64...', function=update_aida64, other_results=other_results, width=40)
|
||||
try_and_print(message='Autoruns...', function=update_autoruns, other_results=other_results, width=40)
|
||||
try_and_print(message='BleachBit...', function=update_bleachbit, other_results=other_results, width=40)
|
||||
try_and_print(message='BlueScreenView...', function=update_bluescreenview, other_results=other_results, width=40)
|
||||
try_and_print(message='ERUNT...', function=update_erunt, other_results=other_results, width=40)
|
||||
try_and_print(message='HitmanPro...', function=update_hitmanpro, other_results=other_results, width=40)
|
||||
try_and_print(message='HWiNFO...', function=update_hwinfo, other_results=other_results, width=40)
|
||||
try_and_print(message='ProduKey...', function=update_produkey, other_results=other_results, width=40)
|
||||
|
||||
# Drivers
|
||||
print_info(' Drivers')
|
||||
try_and_print(message='Intel RST...', function=update_intel_rst, other_results=other_results, width=40)
|
||||
try_and_print(message='Intel SSD Toolbox...', function=update_intel_ssd_toolbox, other_results=other_results, width=40)
|
||||
try_and_print(message='Samsing Magician...', function=update_samsung_magician, other_results=other_results, width=40)
|
||||
if update_sdio:
|
||||
try_and_print(message='Snappy Driver Installer Origin...', function=update_sdi_origin, other_results=other_results, width=40)
|
||||
|
||||
# Installers
|
||||
print_info(' Installers')
|
||||
try_and_print(message='Adobe Reader DC...', function=update_adobe_reader_dc, other_results=other_results, width=40)
|
||||
try_and_print(message='MS Office...', function=update_office, other_results=other_results, width=40)
|
||||
try_and_print(message='Visual C++ Runtimes...', function=update_vcredists, other_results=other_results, width=40)
|
||||
update_all_ninite(other_results=other_results, width=40)
|
||||
|
||||
# Misc
|
||||
print_info(' Misc')
|
||||
try_and_print(message='Caffeine...', function=update_caffeine, other_results=other_results, width=40)
|
||||
try_and_print(message='Classic Start Skin...', function=update_classic_start_skin, other_results=other_results, width=40)
|
||||
try_and_print(message='Du...', function=update_du, other_results=other_results, width=40)
|
||||
try_and_print(message='Everything...', function=update_everything, other_results=other_results, width=40)
|
||||
try_and_print(message='FirefoxExtensions...', function=update_firefox_ublock_origin, other_results=other_results, width=40)
|
||||
try_and_print(message='PuTTY...', function=update_putty, other_results=other_results, width=40)
|
||||
try_and_print(message='Notepad++...', function=update_notepadplusplus, other_results=other_results, width=40)
|
||||
try_and_print(message='TreeSizeFree...', function=update_treesizefree, other_results=other_results, width=40)
|
||||
try_and_print(message='XMPlay...', function=update_xmplay, other_results=other_results, width=40)
|
||||
|
||||
# Repairs
|
||||
print_info(' Repairs')
|
||||
try_and_print(message='AdwCleaner...', function=update_adwcleaner, other_results=other_results, width=40)
|
||||
try_and_print(message='KVRT...', function=update_kvrt, other_results=other_results, width=40)
|
||||
try_and_print(message='RKill...', function=update_rkill, other_results=other_results, width=40)
|
||||
try_and_print(message='TDSSKiller...', function=update_tdsskiller, other_results=other_results, width=40)
|
||||
|
||||
# Uninstallers
|
||||
print_info(' Uninstallers')
|
||||
try_and_print(message='IObit Uninstaller...', function=update_iobit_uninstaller, other_results=other_results, width=40)
|
||||
|
||||
## Review ##
|
||||
print_standard('Please review the results and download/extract any missing items to .cbin')
|
||||
pause('Press Enter to compress the .cbin items')
|
||||
|
||||
## Compress ##
|
||||
print_success('Compressing tools')
|
||||
print_info(' _Drivers')
|
||||
for item in os.scandir(r'{}\_Drivers'.format(global_vars['CBinDir'])):
|
||||
if not re.search(r'^(_Drivers|.*7z)$', item.name, re.IGNORECASE):
|
||||
try_and_print(
|
||||
message='{}...'.format(item.name),
|
||||
function=compress_and_remove_item,
|
||||
other_results = other_results,
|
||||
width=40,
|
||||
item = item)
|
||||
print_info(' .cbin')
|
||||
for item in os.scandir(global_vars['CBinDir']):
|
||||
if not re.search(r'^(_Drivers|_include|.*7z)$', item.name, re.IGNORECASE):
|
||||
try_and_print(
|
||||
message='{}...'.format(item.name),
|
||||
function=compress_and_remove_item,
|
||||
other_results = other_results,
|
||||
width=40,
|
||||
item = item)
|
||||
|
||||
## Search for network Office/QuickBooks installers & add to LAUNCHERS
|
||||
print_success('Scanning for network installers')
|
||||
scan_for_net_installers(OFFICE_SERVER, 'Office', min_year=2010)
|
||||
scan_for_net_installers(QUICKBOOKS_SERVER, 'QuickBooks', min_year=2015)
|
||||
|
||||
## Generate Launchers
|
||||
print_success('Generating launchers')
|
||||
for section in sorted(LAUNCHERS.keys()):
|
||||
print_info(' {}'.format(section))
|
||||
for name, options in sorted(LAUNCHERS[section].items()):
|
||||
try_and_print(message=name, function=generate_launcher,
|
||||
section=section, name=name, options=options,
|
||||
other_results=other_results, width=40)
|
||||
|
||||
# Rename "Copy WizardKit.cmd" (if necessary)
|
||||
source = r'{}\Scripts\Copy WizardKit.cmd'.format(global_vars['BinDir'])
|
||||
dest = r'{}\Copy {}.cmd'.format(global_vars['BaseDir'], KIT_NAME_FULL)
|
||||
if os.path.exists(source):
|
||||
try:
|
||||
shutil.move(source, dest)
|
||||
except Exception:
|
||||
print_error(' Failed to rename "{}.cmd" to "{}.cmd"'.format(
|
||||
'Copy WizardKit', KIT_NAME_FULL))
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
83
.bin/Scripts/user_checklist.py
Normal file
83
.bin/Scripts/user_checklist.py
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
# Wizard Kit: User Checklist
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.browsers import *
|
||||
from functions.cleanup import *
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: User Checklist Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\User Checklist ({USERNAME}).log'.format(
|
||||
**global_vars, **global_vars['Env'])
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: User Checklist\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Warning': {
|
||||
'NotInstalledError': 'Not installed',
|
||||
'NoProfilesError': 'No profiles found',
|
||||
}}
|
||||
answer_config_browsers = ask('Install adblock?')
|
||||
if answer_config_browsers:
|
||||
answer_reset_browsers = ask(
|
||||
'Reset browsers to safe defaults first?')
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
answer_config_classicshell = ask('Configure ClassicShell?')
|
||||
answer_config_explorer_user = ask('Configure Explorer?')
|
||||
|
||||
# Cleanup
|
||||
print_info('Cleanup')
|
||||
try_and_print(message='Desktop...',
|
||||
function=cleanup_desktop, cs='Done')
|
||||
|
||||
# Scan for supported browsers
|
||||
print_info('Scanning for browsers')
|
||||
scan_for_browsers()
|
||||
|
||||
# Homepages
|
||||
print_info('Current homepages')
|
||||
list_homepages()
|
||||
|
||||
# Backup
|
||||
print_info('Backing up browsers')
|
||||
backup_browsers()
|
||||
|
||||
# Reset
|
||||
if answer_config_browsers and answer_reset_browsers:
|
||||
print_info('Resetting browsers')
|
||||
reset_browsers()
|
||||
|
||||
# Configure
|
||||
print_info('Configuring programs')
|
||||
if answer_config_browsers:
|
||||
install_adblock()
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
if answer_config_classicshell:
|
||||
try_and_print(message='ClassicStart...',
|
||||
function=config_classicstart, cs='Done')
|
||||
if answer_config_explorer_user:
|
||||
try_and_print(message='Explorer...',
|
||||
function=config_explorer_user, cs='Done')
|
||||
if (not answer_config_browsers
|
||||
and not answer_config_classicshell
|
||||
and not answer_config_explorer_user):
|
||||
print_warning(' Skipped')
|
||||
else:
|
||||
if not answer_config_browsers:
|
||||
print_warning(' Skipped')
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter to exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
53
.bin/Scripts/user_data_transfer.py
Normal file
53
.bin/Scripts/user_data_transfer.py
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
# Wizard Kit: Copy user data to the system from a local or network source
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.data import *
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: User Data Transfer Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\User Data Transfer.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
# Prep
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: User Data Transfer Tool\n'.format(KIT_NAME_FULL))
|
||||
ticket_number = get_ticket_number()
|
||||
folder_path = r'{}\Transfer'.format(KIT_NAME_SHORT)
|
||||
dest = select_destination(folder_path=folder_path,
|
||||
prompt='Which disk are we transferring to?')
|
||||
source = select_source(ticket_number)
|
||||
items = scan_source(source, dest)
|
||||
|
||||
# Transfer
|
||||
clear_screen()
|
||||
print_info('Transfer Details:\n')
|
||||
show_info('Ticket:', ticket_number)
|
||||
show_info('Source:', source.path)
|
||||
show_info('Destination:', dest)
|
||||
|
||||
if (not ask('Proceed with transfer?')):
|
||||
umount_backup_shares()
|
||||
abort()
|
||||
|
||||
print_info('Transferring Data')
|
||||
transfer_source(source, dest, items)
|
||||
try_and_print(message='Removing extra files...',
|
||||
function=cleanup_transfer, cs='Done', dest_path=dest)
|
||||
umount_backup_shares()
|
||||
|
||||
# Done
|
||||
run_kvrt()
|
||||
print_standard('\nDone.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
20
.bin/Scripts/winpe_root_menu.py
Normal file
20
.bin/Scripts/winpe_root_menu.py
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# Wizard Kit: WinPE Root Menu
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.winpe_menus import *
|
||||
init_global_vars()
|
||||
set_title('{}: Root Menu'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\WinPE.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
menu_root()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
"-finish_upd_cmd:"
|
||||
|
||||
"-lang:English"
|
||||
"-theme:Coax"
|
||||
"-theme:YetAnotherSDI"
|
||||
-hintdelay:250
|
||||
-license:1
|
||||
-scale:256
|
||||
|
|
@ -21,4 +21,4 @@
|
|||
-uplimit:1
|
||||
-connections:0
|
||||
|
||||
-expertmode -novirusalerts -onlyupdates -preservecfg -showdrpnames2
|
||||
-expertmode -norestorepnt -showdrpnames2 -onlyupdates -preservecfg
|
||||
99
.cbin/_include/AIDA64/full.rpf
Normal file
99
.cbin/_include/AIDA64/full.rpf
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
InfoPage="Computer;Summary"
|
||||
InfoPage="Computer;Computer Name"
|
||||
InfoPage="Computer;DMI"
|
||||
InfoPage="Computer;IPMI"
|
||||
InfoPage="Computer;Overclock"
|
||||
InfoPage="Computer;Power Management"
|
||||
InfoPage="Computer;Portable Computer"
|
||||
InfoPage="Motherboard;CPU"
|
||||
InfoPage="Motherboard;CPUID"
|
||||
InfoPage="Motherboard;Motherboard"
|
||||
InfoPage="Motherboard;Memory"
|
||||
InfoPage="Motherboard;SPD"
|
||||
InfoPage="Motherboard;Chipset"
|
||||
InfoPage="Motherboard;BIOS"
|
||||
InfoPage="Motherboard;ACPI"
|
||||
InfoPage="Operating System;Operating System"
|
||||
InfoPage="Operating System;Processes"
|
||||
InfoPage="Operating System;System Drivers"
|
||||
InfoPage="Operating System;Services"
|
||||
InfoPage="Operating System;AX Files"
|
||||
InfoPage="Operating System;DLL Files"
|
||||
InfoPage="Operating System;Certificates"
|
||||
InfoPage="Operating System;UpTime"
|
||||
InfoPage="Server;Share"
|
||||
InfoPage="Server;Opened Files"
|
||||
InfoPage="Server;Account Security"
|
||||
InfoPage="Server;Logon"
|
||||
InfoPage="Server;Users"
|
||||
InfoPage="Server;Local Groups"
|
||||
InfoPage="Server;Global Groups"
|
||||
InfoPage="Display;Windows Video"
|
||||
InfoPage="Display;PCI / AGP Video"
|
||||
InfoPage="Display;GPU"
|
||||
InfoPage="Display;Monitor"
|
||||
InfoPage="Display;Desktop"
|
||||
InfoPage="Display;Multi-Monitor"
|
||||
InfoPage="Display;Video Modes"
|
||||
InfoPage="Display;OpenGL"
|
||||
InfoPage="Display;GPGPU"
|
||||
InfoPage="Display;Mantle"
|
||||
InfoPage="Display;Vulkan"
|
||||
InfoPage="Display;Fonts"
|
||||
InfoPage="Multimedia;Windows Audio"
|
||||
InfoPage="Multimedia;PCI / PnP Audio"
|
||||
InfoPage="Multimedia;HD Audio"
|
||||
InfoPage="Multimedia;OpenAL"
|
||||
InfoPage="Multimedia;Audio Codecs"
|
||||
InfoPage="Multimedia;Video Codecs"
|
||||
InfoPage="Multimedia;MCI"
|
||||
InfoPage="Multimedia;SAPI"
|
||||
InfoPage="Storage;Windows Storage"
|
||||
InfoPage="Storage;Logical Drives"
|
||||
InfoPage="Storage;Physical Drives"
|
||||
InfoPage="Storage;Optical Drives"
|
||||
InfoPage="Storage;ASPI"
|
||||
InfoPage="Storage;ATA"
|
||||
InfoPage="Storage;SMART"
|
||||
InfoPage="Network;Windows Network"
|
||||
InfoPage="Network;PCI / PnP Network"
|
||||
InfoPage="Network;RAS"
|
||||
InfoPage="Network;Net Resources"
|
||||
InfoPage="Network;IAM"
|
||||
InfoPage="Network;Internet"
|
||||
InfoPage="Network;Routes"
|
||||
InfoPage="Network;IE Cookie"
|
||||
InfoPage="Network;Browser History"
|
||||
InfoPage="DirectX;DirectX Files"
|
||||
InfoPage="DirectX;DirectX Video"
|
||||
InfoPage="DirectX;DirectX Sound"
|
||||
InfoPage="Devices;Windows Devices"
|
||||
InfoPage="Devices;Physical Devices"
|
||||
InfoPage="Devices;PCI Devices"
|
||||
InfoPage="Devices;USB Devices"
|
||||
InfoPage="Devices;Device Resources"
|
||||
InfoPage="Devices;Input"
|
||||
InfoPage="Devices;Printers"
|
||||
InfoPage="Software;Auto Start"
|
||||
InfoPage="Software;Scheduled"
|
||||
InfoPage="Software;Installed Programs"
|
||||
InfoPage="Software;Licenses"
|
||||
InfoPage="Software;File Types"
|
||||
InfoPage="Software;Desktop Gadgets"
|
||||
InfoPage="Security;Windows Security"
|
||||
InfoPage="Security;Windows Update"
|
||||
InfoPage="Security;Anti-Virus"
|
||||
InfoPage="Security;Firewall"
|
||||
InfoPage="Security;Anti-Spyware"
|
||||
InfoPage="Security;Anti-Trojan"
|
||||
InfoPage="Config;Regional"
|
||||
InfoPage="Config;Environment"
|
||||
InfoPage="Config;Control Panel"
|
||||
InfoPage="Config;Recycle Bin"
|
||||
InfoPage="Config;System Files"
|
||||
InfoPage="Config;System Folders"
|
||||
InfoPage="Config;Event Logs"
|
||||
InfoPage="Database;Database Software"
|
||||
InfoPage="Database;BDE Drivers"
|
||||
InfoPage="Database;ODBC Drivers"
|
||||
InfoPage="Database;ODBC Data Sources"
|
||||
1
.cbin/_include/AIDA64/installed_programs.rpf
Normal file
1
.cbin/_include/AIDA64/installed_programs.rpf
Normal file
|
|
@ -0,0 +1 @@
|
|||
InfoPage="Software;Installed Programs"
|
||||
1
.cbin/_include/AIDA64/licenses.rpf
Normal file
1
.cbin/_include/AIDA64/licenses.rpf
Normal file
|
|
@ -0,0 +1 @@
|
|||
InfoPage="Software;Licenses"
|
||||
77
.cbin/_include/BleachBit/BleachBit.ini
Normal file
77
.cbin/_include/BleachBit/BleachBit.ini
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
[Portable]
|
||||
|
||||
[bleachbit]
|
||||
auto_hide = False
|
||||
auto_start = False
|
||||
check_beta = False
|
||||
check_online_updates = False
|
||||
shred = False
|
||||
exit_done = False
|
||||
delete_confirmation = True
|
||||
units_iec = True
|
||||
update_winapp2 = False
|
||||
first_start = True
|
||||
version = 1.17
|
||||
|
||||
[hashpath]
|
||||
|
||||
[list/shred_drives]
|
||||
|
||||
[preserve_languages]
|
||||
en = True
|
||||
|
||||
[tree]
|
||||
adobe_reader = True
|
||||
adobe_reader.cache = True
|
||||
adobe_reader.tmp = True
|
||||
amule = True
|
||||
amule.tmp = True
|
||||
chromium = True
|
||||
chromium.cache = True
|
||||
firefox = True
|
||||
firefox.cache = True
|
||||
gimp = True
|
||||
gimp.tmp = True
|
||||
google_chrome = True
|
||||
google_chrome.cache = True
|
||||
google_earth = True
|
||||
google_earth.temporary_files = True
|
||||
hippo_opensim_viewer = True
|
||||
hippo_opensim_viewer.cache = True
|
||||
internet_explorer = True
|
||||
internet_explorer.temporary_files = True
|
||||
java = True
|
||||
java.cache = True
|
||||
libreoffice = True
|
||||
libreoffice.cache = True
|
||||
liferea = True
|
||||
liferea.cache = True
|
||||
miro = True
|
||||
miro.cache = True
|
||||
openofficeorg = True
|
||||
openofficeorg.cache = True
|
||||
opera = True
|
||||
opera.cache = True
|
||||
pidgin = True
|
||||
pidgin.cache = True
|
||||
safari = True
|
||||
safari.cache = True
|
||||
seamonkey = True
|
||||
seamonkey.cache = True
|
||||
secondlife_viewer = True
|
||||
secondlife_viewer.Cache = True
|
||||
system = True
|
||||
system.recycle_bin = True
|
||||
system.tmp = True
|
||||
thunderbird = True
|
||||
thunderbird.cache = True
|
||||
vuze = True
|
||||
vuze.cache = True
|
||||
vuze.tmp = True
|
||||
yahoo_messenger = True
|
||||
yahoo_messenger.cache = True
|
||||
winapp2_windows = True
|
||||
winapp2_windows.cbs_logs = True
|
||||
winapp2_windows.cbs_logs_more = True
|
||||
winapp2_windows.windows_cbs_logs_more = True
|
||||
|
||||
|
|
@ -1,65 +1,56 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<NotepadPlus>
|
||||
<FindHistory nbMaxFindHistoryPath="10" nbMaxFindHistoryFilter="10" nbMaxFindHistoryFind="10" nbMaxFindHistoryReplace="10" matchWord="no" matchCase="no" wrap="yes" directionDown="yes" fifRecuisive="yes" fifInHiddenFolder="no" fifProjectPanel1="no" fifProjectPanel2="no" fifProjectPanel3="no" fifFilterFollowsDoc="no" fifFolderFollowsDoc="no" searchMode="0" transparencyMode="1" transparency="150" dotMatchesNewline="no" isSearch2ButtonsMode="no" regexBackward4PowerUser="no" />
|
||||
<History nbMaxFile="10" inSubMenu="no" customLength="-1" />
|
||||
<ProjectPanels>
|
||||
<ProjectPanel id="0" workSpaceFile="" />
|
||||
<ProjectPanel id="1" workSpaceFile="" />
|
||||
<ProjectPanel id="2" workSpaceFile="" />
|
||||
</ProjectPanels>
|
||||
<GUIConfigs>
|
||||
<GUIConfig name="ToolBar" visible="no">standard</GUIConfig>
|
||||
<GUIConfig name="StatusBar">show</GUIConfig>
|
||||
<GUIConfig name="TabBar" dragAndDrop="yes" drawTopBar="yes" drawInactiveTab="yes" reduce="yes" closeButton="yes" doubleClick2Close="no" vertical="no" multiLine="no" hide="no" quitOnEmpty="yes" iconSetNumber="1" />
|
||||
<GUIConfig name="ScintillaViewsSplitter">vertical</GUIConfig>
|
||||
<GUIConfig name="UserDefineDlg" position="undocked">hide</GUIConfig>
|
||||
<GUIConfig name="TabSetting" replaceBySpace="yes" size="2" />
|
||||
<GUIConfig name="FindWindowPosition" left="0" top="0" right="0" bottom="0" />
|
||||
<GUIConfig name="FinderConfig" wrappedLines="no" purgeBeforeEverySearch="no" />
|
||||
<GUIConfig name="noUpdate" intervalDays="15" nextUpdateDate="20080426">no</GUIConfig>
|
||||
<GUIConfig name="Auto-detection">yes</GUIConfig>
|
||||
<GUIConfig name="CheckHistoryFiles">no</GUIConfig>
|
||||
<GUIConfig name="TrayIcon">no</GUIConfig>
|
||||
<GUIConfig name="MaitainIndent">yes</GUIConfig>
|
||||
<GUIConfig name="TagsMatchHighLight" TagAttrHighLight="yes" HighLightNonHtmlZone="no">yes</GUIConfig>
|
||||
<GUIConfig name="RememberLastSession">no</GUIConfig>
|
||||
<GUIConfig name="DetectEncoding">yes</GUIConfig>
|
||||
<GUIConfig name="SaveAllConfirm">yes</GUIConfig>
|
||||
<GUIConfig name="NewDocDefaultSettings" format="0" encoding="4" lang="0" codepage="-1" openAnsiAsUTF8="yes" />
|
||||
<GUIConfig name="langsExcluded" gr0="0" gr1="0" gr2="0" gr3="0" gr4="0" gr5="0" gr6="0" gr7="0" gr8="0" gr9="0" gr10="0" gr11="0" gr12="0" langMenuCompact="yes" />
|
||||
<GUIConfig name="Print" lineNumber="yes" printOption="3" headerLeft="" headerMiddle="" headerRight="" footerLeft="" footerMiddle="" footerRight="" headerFontName="" headerFontStyle="0" headerFontSize="0" footerFontName="" footerFontStyle="0" footerFontSize="0" margeLeft="0" margeRight="0" margeTop="0" margeBottom="0" />
|
||||
<GUIConfig name="Backup" action="0" useCustumDir="no" dir="" isSnapshotMode="no" snapshotBackupTiming="7000" />
|
||||
<GUIConfig name="TaskList">no</GUIConfig>
|
||||
<GUIConfig name="MRU">no</GUIConfig>
|
||||
<GUIConfig name="URL">2</GUIConfig>
|
||||
<GUIConfig name="uriCustomizedSchemes">svn:// cvs:// git:// imap:// irc:// irc6:// ircs:// ldap:// ldaps:// news: telnet:// gopher:// ssh:// sftp:// smb:// skype: snmp:// spotify: steam:// sms: slack:// chrome:// bitcoin:</GUIConfig>
|
||||
<GUIConfig name="globalOverride" fg="no" bg="no" font="no" fontSize="no" bold="no" italic="no" underline="no" />
|
||||
<GUIConfig name="auto-completion" autoCAction="3" triggerFromNbChar="1" autoCIgnoreNumbers="yes" funcParams="yes" />
|
||||
<GUIConfig name="auto-insert" parentheses="no" brackets="no" curlyBrackets="no" quotes="no" doubleQuotes="no" htmlXmlTag="no" />
|
||||
<GUIConfig name="sessionExt"></GUIConfig>
|
||||
<GUIConfig name="workspaceExt"></GUIConfig>
|
||||
<GUIConfig name="MenuBar">show</GUIConfig>
|
||||
<GUIConfig name="Caret" width="1" blinkRate="600" />
|
||||
<GUIConfig name="ScintillaGlobalSettings" enableMultiSelection="no" />
|
||||
<GUIConfig name="openSaveDir" value="0" defaultDirPath="" />
|
||||
<GUIConfig name="titleBar" short="no" />
|
||||
<GUIConfig name="insertDateTime" customizedFormat="yyyy-MM-dd HH:mm:ss" reverseDefaultOrder="no" />
|
||||
<GUIConfig name="wordCharList" useDefault="yes" charsAdded="" />
|
||||
<GUIConfig name="delimiterSelection" leftmostDelimiter="40" rightmostDelimiter="41" delimiterSelectionOnEntireDocument="no" />
|
||||
<GUIConfig name="multiInst" setting="0" />
|
||||
<GUIConfig name="MISC" fileSwitcherWithoutExtColumn="yes" fileSwitcherExtWidth="50" fileSwitcherWithoutPathColumn="yes" fileSwitcherPathWidth="50" backSlashIsEscapeCharacterForSql="yes" writeTechnologyEngine="0" isFolderDroppedOpenFiles="no" docPeekOnTab="no" docPeekOnMap="no" saveDlgExtFilterToAllTypes="no" muteSounds="no" />
|
||||
<GUIConfig name="Searching" monospacedFontFindDlg="no" stopFillingFindField="no" findDlgAlwaysVisible="no" confirmReplaceInAllOpenDocs="yes" replaceStopsWithoutFindingNext="no" />
|
||||
<GUIConfig name="searchEngine" searchEngineChoice="2" searchEngineCustom="" />
|
||||
<GUIConfig name="MarkAll" matchCase="no" wholeWordOnly="yes" />
|
||||
<GUIConfig name="SmartHighLight" matchCase="no" wholeWordOnly="yes" useFindSettings="no" onAnotherView="no">yes</GUIConfig>
|
||||
<GUIConfig name="DarkMode" enable="no" colorTone="0" customColorTop="2105376" customColorMenuHotTrack="4210752" customColorActive="4210752" customColorMain="2105376" customColorError="176" customColorText="14737632" customColorDarkText="12632256" customColorDisabledText="8421504" customColorEdge="6579300" />
|
||||
<GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" lineNumberDynamicWidth="yes" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="yes" rightClickKeepsSelection="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" isEdgeBgMode="no" edgeMultiColumnPos="" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" paddingLeft="0" paddingRight="0" distractionFreeDivPart="4" />
|
||||
<GUIConfig name="DockingManager" leftWidth="200" rightWidth="200" topHeight="200" bottomHeight="200">
|
||||
<ActiveTabs cont="0" activeTab="-1" />
|
||||
<ActiveTabs cont="1" activeTab="-1" />
|
||||
<ActiveTabs cont="2" activeTab="-1" />
|
||||
<ActiveTabs cont="3" activeTab="-1" />
|
||||
</GUIConfig>
|
||||
</GUIConfigs>
|
||||
</NotepadPlus>
|
||||
|
||||
<?xml version="1.0" encoding="Windows-1252" ?>
|
||||
<NotepadPlus>
|
||||
<FindHistory nbMaxFindHistoryPath="10" nbMaxFindHistoryFilter="10" nbMaxFindHistoryFind="10" nbMaxFindHistoryReplace="10" matchWord="no" matchCase="no" wrap="yes" directionDown="yes" fifRecuisive="yes" fifInHiddenFolder="no" dlgAlwaysVisible="no" fifFilterFollowsDoc="no" fifFolderFollowsDoc="no" searchMode="0" transparencyMode="1" transparency="150" dotMatchesNewline="no" />
|
||||
<History nbMaxFile="10" inSubMenu="no" customLength="-1" />
|
||||
<GUIConfigs>
|
||||
<GUIConfig name="ToolBar" visible="no">standard</GUIConfig>
|
||||
<GUIConfig name="StatusBar">hide</GUIConfig>
|
||||
<GUIConfig name="TabBar" dragAndDrop="yes" drawTopBar="yes" drawInactiveTab="yes" reduce="yes" closeButton="yes" doubleClick2Close="no" vertical="no" multiLine="no" hide="yes" quitOnEmpty="no" />
|
||||
<GUIConfig name="ScintillaViewsSplitter">vertical</GUIConfig>
|
||||
<GUIConfig name="UserDefineDlg" position="undocked">hide</GUIConfig>
|
||||
<GUIConfig name="TabSetting" replaceBySpace="yes" size="4" />
|
||||
<GUIConfig name="noUpdate" intervalDays="15" nextUpdateDate="20080426">no</GUIConfig>
|
||||
<GUIConfig name="Auto-detection">yes</GUIConfig>
|
||||
<GUIConfig name="CheckHistoryFiles">no</GUIConfig>
|
||||
<GUIConfig name="TrayIcon">no</GUIConfig>
|
||||
<GUIConfig name="MaitainIndent">yes</GUIConfig>
|
||||
<GUIConfig name="TagsMatchHighLight" TagAttrHighLight="yes" HighLightNonHtmlZone="no">yes</GUIConfig>
|
||||
<GUIConfig name="RememberLastSession">no</GUIConfig>
|
||||
<GUIConfig name="DetectEncoding">yes</GUIConfig>
|
||||
<GUIConfig name="NewDocDefaultSettings" format="0" encoding="4" lang="0" codepage="-1" openAnsiAsUTF8="yes" />
|
||||
<GUIConfig name="langsExcluded" gr0="0" gr1="0" gr2="0" gr3="0" gr4="0" gr5="0" gr6="0" gr7="0" langMenuCompact="yes" />
|
||||
<GUIConfig name="Print" lineNumber="yes" printOption="3" headerLeft="" headerMiddle="" headerRight="" footerLeft="" footerMiddle="" footerRight="" headerFontName="" headerFontStyle="0" headerFontSize="0" footerFontName="" footerFontStyle="0" footerFontSize="0" margeLeft="0" margeRight="0" margeTop="0" margeBottom="0" />
|
||||
<GUIConfig name="Backup" action="0" useCustumDir="no" dir="" isSnapshotMode="no" snapshotBackupTiming="7000" />
|
||||
<GUIConfig name="TaskList">yes</GUIConfig>
|
||||
<GUIConfig name="MRU">yes</GUIConfig>
|
||||
<GUIConfig name="URL">2</GUIConfig>
|
||||
<GUIConfig name="globalOverride" fg="no" bg="no" font="no" fontSize="no" bold="no" italic="no" underline="no" />
|
||||
<GUIConfig name="auto-completion" autoCAction="3" triggerFromNbChar="1" autoCIgnoreNumbers="yes" funcParams="yes" />
|
||||
<GUIConfig name="auto-insert" parentheses="no" brackets="no" curlyBrackets="no" quotes="no" doubleQuotes="no" htmlXmlTag="no" />
|
||||
<GUIConfig name="sessionExt"></GUIConfig>
|
||||
<GUIConfig name="workspaceExt"></GUIConfig>
|
||||
<GUIConfig name="MenuBar">hide</GUIConfig>
|
||||
<GUIConfig name="Caret" width="1" blinkRate="600" />
|
||||
<GUIConfig name="ScintillaGlobalSettings" enableMultiSelection="no" />
|
||||
<GUIConfig name="openSaveDir" value="0" defaultDirPath="" />
|
||||
<GUIConfig name="titleBar" short="no" />
|
||||
<GUIConfig name="wordCharList" useDefault="yes" charsAdded="" />
|
||||
<GUIConfig name="delimiterSelection" leftmostDelimiter="40" rightmostDelimiter="41" delimiterSelectionOnEntireDocument="no" />
|
||||
<GUIConfig name="multiInst" setting="0" />
|
||||
<GUIConfig name="MISC" fileSwitcherWithoutExtColumn="no" backSlashIsEscapeCharacterForSql="yes" newStyleSaveDlg="no" isFolderDroppedOpenFiles="no" />
|
||||
<GUIConfig name="searchEngine" searchEngineChoice="1" searchEngineCustom="" />
|
||||
<GUIConfig name="SmartHighLight" matchCase="no" wholeWordOnly="no" useFindSettings="no" onAnotherView="no">yes</GUIConfig>
|
||||
<GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" />
|
||||
<GUIConfig name="DockingManager" leftWidth="200" rightWidth="200" topHeight="200" bottomHeight="200">
|
||||
<ActiveTabs cont="0" activeTab="-1" />
|
||||
<ActiveTabs cont="1" activeTab="-1" />
|
||||
<ActiveTabs cont="2" activeTab="-1" />
|
||||
<ActiveTabs cont="3" activeTab="-1" />
|
||||
</GUIConfig>
|
||||
</GUIConfigs>
|
||||
<ProjectPanels>
|
||||
<ProjectPanel id="0" workSpaceFile="" />
|
||||
<ProjectPanel id="1" workSpaceFile="" />
|
||||
<ProjectPanel id="2" workSpaceFile="" />
|
||||
</ProjectPanels>
|
||||
</NotepadPlus>
|
||||
|
|
@ -1,154 +1,139 @@
|
|||
[XMPlay]
|
||||
MixMode=56
|
||||
AutoName=0
|
||||
WriteSource=0
|
||||
WriteSourceRes=1
|
||||
WriteSepInst=0
|
||||
WriteNoExt=0
|
||||
WriteTitle=0
|
||||
AutoAmp=1
|
||||
RGain=0
|
||||
RGainAmp=0
|
||||
RGainLimit=0
|
||||
Time=1
|
||||
ShowTenths=1
|
||||
TimeHours=1
|
||||
Volume=90
|
||||
LogVolume=1
|
||||
Balance=50
|
||||
Amplify=0
|
||||
AmpReset=1
|
||||
PanSep=50
|
||||
Loop=0
|
||||
LoopLimit=1
|
||||
LoopLimitTime=0
|
||||
DecayEnd=5
|
||||
LoopList=1
|
||||
ListTotal=0
|
||||
UnloadLast=0
|
||||
AutoAdvance=1
|
||||
ListSort=0
|
||||
FollowList=0
|
||||
AutoRemove=0
|
||||
Trim=0
|
||||
NoMute=0
|
||||
Fade=0
|
||||
NetBuffer=5
|
||||
NetPreBuffer=3
|
||||
NetTimeout=10
|
||||
RestrictRate=0
|
||||
AutoReconnect=0
|
||||
Proxy=1
|
||||
ProxyConfig=
|
||||
Dither=0
|
||||
CrossFadeLen=0
|
||||
CrossFadeChange=0
|
||||
MODmode=0
|
||||
MODtimeinfo=1
|
||||
MODxfx=0
|
||||
MODloop=1
|
||||
MODloopreset=0
|
||||
MODvirtchans=256
|
||||
Mini=0
|
||||
InTray=0
|
||||
OnTop=259
|
||||
MultiInstance=0
|
||||
SaveClosePos=0
|
||||
Bubbles=3
|
||||
FadeBubbles=1
|
||||
InfoMove=0
|
||||
WindowLock=0
|
||||
PanelPos=0
|
||||
ListFilenames=0
|
||||
ListQueue=0
|
||||
ListClick=1793
|
||||
AutoSave=0
|
||||
ListCols=-2146959349
|
||||
Verify=1
|
||||
NoDuplicates=0
|
||||
ScanHTML=1
|
||||
ArchiveLevel=2
|
||||
SearchDrives=0
|
||||
Random=3
|
||||
DeadStop=0
|
||||
Queue=0
|
||||
QueueStop=0
|
||||
QueuePlay=0
|
||||
QueueToggle=1
|
||||
SubDir=0
|
||||
TitleNoExt=0
|
||||
TitleSpaces=0
|
||||
TitleSubsongs=0
|
||||
TitleCUE=1
|
||||
TitleScroll=1
|
||||
TitleTray=3
|
||||
Clipboard=0
|
||||
AutoSet=0
|
||||
InfoResize=1
|
||||
InfoResizeLimit=500
|
||||
InfoTextSize=0
|
||||
InfoWidth=80
|
||||
InfoList=15
|
||||
InfoPaty=234
|
||||
InfoPatmc=20
|
||||
RestrictVis=0
|
||||
RestrictVisW=290
|
||||
RestrictVisH=218
|
||||
SpectrumSpeed=1
|
||||
VisSync=0
|
||||
VisTextSize=0
|
||||
VisRefresh=40
|
||||
HelpTextSize=0
|
||||
PanelOpen=0
|
||||
InfoPos=B0010000190100006305000009030000
|
||||
VisSize=22010000DA000000
|
||||
FindSize=0000000000000000C8000000
|
||||
LibWidth=600
|
||||
LibSort=2
|
||||
LibMode=0
|
||||
LibCols=0000000000000000010000000000E04102000000000050410300000000005041040000000000E040050000000000E04006000000000040410700000000000000080000000000C04009000000000000000A0000000000E0400B0000000000E0400C000000000000000D000000000000000E000000000000000F00000000000000
|
||||
LibParseList=0
|
||||
LibFilePath=0
|
||||
LibAbrSize=1
|
||||
LibInlineText=1
|
||||
LibInfoTags=1
|
||||
LibKeepOverridden=1
|
||||
LibPlayTime=0
|
||||
LibAvgCount=0
|
||||
LibPlayReplace=0
|
||||
UpdateCheck=0
|
||||
UpdateTime=0
|
||||
IgnoreTypes=avi mpg mpeg
|
||||
FilePath=
|
||||
WritePath=X:\
|
||||
TitleForm=%?2{%2 - }%?1{%1|%0}%?3{ [%3]}
|
||||
TitleFormList=
|
||||
Find=
|
||||
FindPlay=0
|
||||
FindAutoList=0
|
||||
FindIn=3
|
||||
NoCheckDead=0
|
||||
CurTrack=64
|
||||
Info=197635
|
||||
Skin=plugins\Innocuous (Dark Skies - Purple-80) [L1]
|
||||
External=464C414300666C6163202D54205449544C453D2531202D54204152544953543D2532202D5420414C42554D3D2533202D5420444154453D2534202D5420545241434B4E554D4245523D2535202D542047454E52453D2536202D5420434F4D4D454E543D2537202D6F20256F202D00666C616300404C414D45006C616D65202D2D616C742D707265736574207374616E64617264202D2D69676E6F72652D7461672D6572726F7273202D2D7474202531202D2D7461202532202D2D746C202533202D2D7479202534202D2D746E202535202D2D7467202536202D2D7463202537202D20256F006D703300864F4747454E43006F6767656E63202D74202531202D61202532202D6C202533202D64202534202D4E202535202D47202536202D6320636F6D6D656E743D2537202D6F20256F202D006F676700C800
|
||||
DSP=FF000200100000000000000040410000004100008041000100280000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
PluginTypes=
|
||||
Shortcuts=060000004F0018020C0000004F04180250000000500019025100000050041902500000001300450251000000130445025200000027004D035300000025004B0354000000240047035600000027044D035500000025044B03810000002100490380000000220051038200000023004F03700100002D005203710100002D045203900100005A022C027B0100005100100277010000BF0435025001000026004803580100002604480351010000280050035901000028045003540100002602480354010000280250035501000041021E02560100004902170260010000460221026401000046012102610100004600210262010000460421026301000046062102740100000D001C02750100002000390276010000BF0035027E010000BF023502720100002E005303730100002E045303000200006B004E02010200006D004A02070200006F003503080200006A003702010000004D003202020000004E003102030000004E0431020A00000073013E020B00000073053E0205000000780043020101000070003B020201000071003C020301000072003D020401000073003E020501000074003F0260020000750040020801000043022E02060100006800480207010000620050022101000064004B022201000066004D022301000065004C0224010000670047022501000069004902040000007B005802
|
||||
DeviceMode=0000000080BB000002000000020000008A0200000000000003000000
|
||||
Track1=0
|
||||
CrossFade=1
|
||||
MODadlib=0
|
||||
WindowX=311
|
||||
WindowY=262
|
||||
ListSaveOpt=2
|
||||
TagCase=1
|
||||
UpdateStuff=0
|
||||
FindSelect=1
|
||||
Big=0
|
||||
BringToFore=1
|
||||
NoHistory=1
|
||||
NoSaveList=1
|
||||
NoScanList=1
|
||||
NoUserConfig=1
|
||||
|
||||
[XMPlay]
|
||||
MixMode=56
|
||||
AutoName=0
|
||||
WriteSource=0
|
||||
WriteSourceRes=1
|
||||
WriteSepInst=0
|
||||
WriteNoExt=0
|
||||
WriteTitle=0
|
||||
AutoAmp=1
|
||||
RGain=0
|
||||
RGainAmp=0
|
||||
RGainLimit=0
|
||||
Time=1
|
||||
ShowTenths=1
|
||||
TimeHours=1
|
||||
Volume=90
|
||||
LogVolume=1
|
||||
Balance=50
|
||||
Amplify=-1074017600
|
||||
AmpReset=1
|
||||
PanSep=50
|
||||
Loop=0
|
||||
LoopLimit=1
|
||||
LoopLimitTime=0
|
||||
DecayEnd=5
|
||||
LoopList=1
|
||||
ListTotal=0
|
||||
UnloadLast=0
|
||||
AutoAdvance=1
|
||||
ListSort=0
|
||||
FollowList=0
|
||||
AutoRemove=0
|
||||
Trim=0
|
||||
NoMute=0
|
||||
Fade=0
|
||||
NetBuffer=5
|
||||
NetPreBuffer=3
|
||||
NetTimeout=10
|
||||
RestrictRate=0
|
||||
AutoReconnect=0
|
||||
Proxy=1
|
||||
ProxyConfig=
|
||||
Dither=0
|
||||
CrossFadeLen=0
|
||||
CrossFadeChange=0
|
||||
MODmode=0
|
||||
MODtimeinfo=1
|
||||
MODxfx=0
|
||||
MODloop=1
|
||||
MODloopreset=0
|
||||
MODvirtchans=256
|
||||
Mini=0
|
||||
InTray=0
|
||||
OnTop=259
|
||||
MultiInstance=0
|
||||
SaveClosePos=0
|
||||
Bubbles=3
|
||||
FadeBubbles=1
|
||||
InfoMove=0
|
||||
WindowLock=0
|
||||
PanelPos=-268374016
|
||||
ListFilenames=0
|
||||
ListQueue=0
|
||||
ListClick=1793
|
||||
AutoSave=0
|
||||
ListCols=-2146959349
|
||||
Verify=1
|
||||
NoDuplicates=0
|
||||
ScanHTML=1
|
||||
ArchiveLevel=2
|
||||
SearchDrives=0
|
||||
Random=3
|
||||
DeadStop=0
|
||||
Queue=0
|
||||
QueueStop=0
|
||||
QueuePlay=0
|
||||
QueueToggle=1
|
||||
SubDir=0
|
||||
TitleNoExt=0
|
||||
TitleSpaces=0
|
||||
TitleSubsongs=0
|
||||
TitleCUE=1
|
||||
TitleScroll=1
|
||||
TitleTray=3
|
||||
Clipboard=0
|
||||
AutoSet=0
|
||||
InfoResize=1
|
||||
InfoResizeLimit=500
|
||||
InfoTextSize=0
|
||||
InfoWidth=80
|
||||
InfoList=15
|
||||
InfoPaty=234
|
||||
InfoPatmc=20
|
||||
RestrictVis=0
|
||||
RestrictVisW=290
|
||||
RestrictVisH=218
|
||||
SpectrumSpeed=1
|
||||
VisSync=0
|
||||
VisTextSize=0
|
||||
VisRefresh=40
|
||||
HelpTextSize=0
|
||||
PanelOpen=0
|
||||
InfoPos=00020000000200005D0300003E030000
|
||||
VisSize=22010000DA000000
|
||||
FindSize=0000000000000000C8000000
|
||||
LibWidth=600
|
||||
LibSort=2
|
||||
LibMode=0
|
||||
LibCols=0000000000000000010000000000E04102000000000050410300000000005041040000000000E040050000000000E04006000000000040410700000000000000080000000000C04009000000000000000A0000000000E0400B0000000000E0400C000000000000000D000000000000000E000000000000000F00000000000000
|
||||
LibParseList=0
|
||||
LibFilePath=0
|
||||
LibAbrSize=1
|
||||
LibInlineText=1
|
||||
LibInfoTags=1
|
||||
LibKeepOverridden=1
|
||||
LibPlayTime=0
|
||||
LibAvgCount=0
|
||||
LibPlayReplace=0
|
||||
UpdateCheck=0
|
||||
UpdateTime=0
|
||||
IgnoreTypes=avi mpg mpeg
|
||||
FilePath=
|
||||
WritePath=X:\
|
||||
TitleForm=%?2{%2 - }%?1{%1|%0}
|
||||
TitleFormList=
|
||||
Find=
|
||||
FindPlay=0
|
||||
FindAutoList=0
|
||||
FindIn=3
|
||||
NoCheckDead=0
|
||||
CurTrack=64
|
||||
Info=197379
|
||||
Skin=plugins\WAModern NightVision
|
||||
External=464C414300666C6163202D54205449544C453D2531202D54204152544953543D2532202D5420414C42554D3D2533202D5420444154453D2534202D5420545241434B4E554D4245523D2535202D542047454E52453D2536202D5420434F4D4D454E543D2537202D6F20256F202D00666C616300404C414D45006C616D65202D2D616C742D707265736574207374616E64617264202D2D69676E6F72652D7461672D6572726F7273202D2D7474202531202D2D7461202532202D2D746C202533202D2D7479202534202D2D746E202535202D2D7467202536202D2D7463202537202D20256F006D703300864F4747454E43006F6767656E63202D74202531202D61202532202D6C202533202D64202534202D4E202535202D47202536202D6320636F6D6D656E743D2537202D6F20256F202D006F676700C800
|
||||
DSP=FF000200100000000000000040410000004100008041000100280000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
PluginTypes=
|
||||
Shortcuts=060000004F0018020C0000004F04180250000000500019025100000050041902500000001300450251000000130445025200000027004D035300000025004B0354000000240047035600000027044D035500000025044B03810000002100490380000000220051038200000023004F03700100002D005203710100002D045203900100005A022C027B0100005100100277010000BF0435025001000026004803580100002604480351010000280050035901000028045003540100002602480354010000280250035501000041021E02560100004902170260010000460221026401000046012102610100004600210262010000460421026301000046062102740100000D001C02750100002000390276010000BF0035027E010000BF023502720100002E005303730100002E045303000200006B004E02010200006D004A02070200006F003503080200006A003702010000004D003202020000004E003102030000004E0431020A00000073013E020B00000073053E0205000000780043020101000070003B020201000071003C020301000072003D020401000073003E020501000074003F0260020000750040020801000043022E02060100006800480207010000620050022101000064004B022201000066004D022301000065004C0224010000670047022501000069004902040000007B005802
|
||||
DeviceMode=0000000080BB000002000000020000008A0200000000000003000000
|
||||
Track1=0
|
||||
1920
.cbin/_include/XYplorerFree/Data/XYplorer.ini
Normal file
1920
.cbin/_include/XYplorerFree/Data/XYplorer.ini
Normal file
File diff suppressed because it is too large
Load diff
1
.cbin/_include/_Drivers/Intel RST/SetupRST_13.x.txt
Normal file
1
.cbin/_include/_Drivers/Intel RST/SetupRST_13.x.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
Broken. "requires" .NET 4.5 but fails to accept .NET 4.6 or newer (which we install).
|
||||
7
.cbin/_include/_Office/365_32.xml
Normal file
7
.cbin/_include/_Office/365_32.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="32" Channel="Current">
|
||||
<Product ID="O365ProPlusRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
7
.cbin/_include/_Office/365_64.xml
Normal file
7
.cbin/_include/_Office/365_64.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="64" Channel="Current">
|
||||
<Product ID="O365ProPlusRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
7
.cbin/_include/_Office/hb_32.xml
Normal file
7
.cbin/_include/_Office/hb_32.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="32" Channel="Current">
|
||||
<Product ID="HomeBusinessRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
7
.cbin/_include/_Office/hb_64.xml
Normal file
7
.cbin/_include/_Office/hb_64.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="64" Channel="Current">
|
||||
<Product ID="HomeBusinessRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
7
.cbin/_include/_Office/hs_32.xml
Normal file
7
.cbin/_include/_Office/hs_32.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="32" Channel="Current">
|
||||
<Product ID="HomeStudentRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
7
.cbin/_include/_Office/hs_64.xml
Normal file
7
.cbin/_include/_Office/hs_64.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="64" Channel="Current">
|
||||
<Product ID="HomeStudentRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
22
.cbin/_include/_vcredists/InstallAll.bat
Normal file
22
.cbin/_include/_vcredists/InstallAll.bat
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
@echo off
|
||||
setlocal
|
||||
|
||||
start "" /wait "2008sp1\x32\vcredist.exe" /qb! /norestart
|
||||
start "" /wait "2008sp1\x64\vcredist.exe" /qb! /norestart
|
||||
|
||||
start "" /wait "2010\x32\vcredist.exe" /passive /norestart
|
||||
start "" /wait "2010\x64\vcredist.exe" /passive /norestart
|
||||
|
||||
start "" /wait "2012u4\x32\vcredist.exe" /passive /norestart
|
||||
start "" /wait "2012u4\x64\vcredist.exe" /passive /norestart
|
||||
|
||||
start "" /wait "2013\x32\vcredist.exe" /install /passive /norestart
|
||||
start "" /wait "2013\x64\vcredist.exe" /install /passive /norestart
|
||||
|
||||
start "" /wait "2015u3\x32\vcredist.exe" /install /passive /norestart
|
||||
start "" /wait "2015u3\x64\vcredist.exe" /install /passive /norestart
|
||||
|
||||
start "" /wait "2017\x32\vcredist.exe" /install /passive /norestart
|
||||
start "" /wait "2017\x64\vcredist.exe" /install /passive /norestart
|
||||
|
||||
endlocal
|
||||
48
.gitignore
vendored
48
.gitignore
vendored
|
|
@ -1,8 +1,40 @@
|
|||
**/__pycache__
|
||||
**/*.7z
|
||||
**/*.DS_Store
|
||||
**/*.bak
|
||||
**/*.exe
|
||||
**/*.swp
|
||||
setup/BUILD*
|
||||
setup/OUT*
|
||||
**/__pycache__/*
|
||||
*.bak
|
||||
*.exe
|
||||
.bin/7-Zip/
|
||||
.bin/AIDA64/
|
||||
.bin/BleachBit/
|
||||
.bin/ClassicStartSkin/
|
||||
.bin/ConEmu/
|
||||
.bin/Erunt/
|
||||
.bin/Everything/
|
||||
.bin/FastCopy/
|
||||
.bin/HWiNFO/HWiNFO*.ini
|
||||
.bin/NotepadPlusPlus/
|
||||
.bin/ProcessKiller/
|
||||
.bin/ProduKey/
|
||||
.bin/Python/
|
||||
.bin/Tmp/
|
||||
.bin/XMPlay/
|
||||
.bin/_Drivers/SDIO/
|
||||
.cbin/*.7z
|
||||
.cbin/AIDA64/
|
||||
.cbin/Autoruns/
|
||||
.cbin/BleachBit-Portable/
|
||||
.cbin/BlueScreenView/
|
||||
.cbin/Caffeine/
|
||||
.cbin/Du/
|
||||
.cbin/Everything/
|
||||
.cbin/FirefoxExtensions/
|
||||
.cbin/IObitUninstallerPortable/
|
||||
.cbin/ProduKey/
|
||||
.cbin/TestDisk/
|
||||
.cbin/TreeSizeFree-Portable/
|
||||
.cbin/XMPlay/
|
||||
.cbin/XYplorerFree/
|
||||
.cbin/_Drivers/
|
||||
.cbin/_Office/
|
||||
.cbin/_vcredists/
|
||||
.cbin/wimlib/
|
||||
BUILD*/
|
||||
OUT*/
|
||||
|
|
|
|||
2
.kit_items/Drivers/Extras/AMD.url
Normal file
2
.kit_items/Drivers/Extras/AMD.url
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
[InternetShortcut]
|
||||
URL=https://support.amd.com/en-us/download
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[InternetShortcut]
|
||||
URL=https://ftp.dell.com/browse_for_drivers/
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[InternetShortcut]
|
||||
URL=https://downloads.dell.com/published/Pages/index.html
|
||||
6
.kit_items/Drivers/Extras/Dell (Support Site).url
Normal file
6
.kit_items/Drivers/Extras/Dell (Support Site).url
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[InternetShortcut]
|
||||
URL=http://support.dell.com/
|
||||
IDList=
|
||||
HotKey=0
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
5
.kit_items/Drivers/Extras/Device Remover.url
Normal file
5
.kit_items/Drivers/Extras/Device Remover.url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://www.majorgeeks.com/files/details/device_remover_543c.html
|
||||
5
.kit_items/Drivers/Extras/Display Driver Uninstaller.url
Normal file
5
.kit_items/Drivers/Extras/Display Driver Uninstaller.url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=https://www.wagnardsoft.com/
|
||||
2
.kit_items/Drivers/Extras/HP.url
Normal file
2
.kit_items/Drivers/Extras/HP.url
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
[InternetShortcut]
|
||||
URL=http://support.hp.com/us-en/drivers
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=https://www.intel.com/content/www/us/en/support/detect.html
|
||||
2
.kit_items/Drivers/Extras/NVIDIA.url
Normal file
2
.kit_items/Drivers/Extras/NVIDIA.url
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
[InternetShortcut]
|
||||
URL=https://www.nvidia.com/Download/index.aspx?lang=en-us
|
||||
5
.kit_items/Drivers/Extras/Samsung Tools & Software.url
Normal file
5
.kit_items/Drivers/Extras/Samsung Tools & Software.url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://www.samsung.com/semiconductor/minisite/ssd/download/tools.html
|
||||
5
.kit_items/Installers/BackBlaze.url
Normal file
5
.kit_items/Installers/BackBlaze.url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
URL=https://www.backblaze.com/gen/install_backblaze-af9duk
|
||||
IDList=
|
||||
6
.kit_items/Misc/Fix Missing Optical Drive.reg
Normal file
6
.kit_items/Misc/Fix Missing Optical Drive.reg
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
Windows Registry Editor Version 5.00
|
||||
|
||||
;Delete entries acording to http://support.microsoft.com/kb/314060
|
||||
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}]
|
||||
"UpperFilters"=-
|
||||
"LowerFilters"=-
|
||||
6
.kit_items/Misc/Nirsoft Utilities - Outlook.url
Normal file
6
.kit_items/Misc/Nirsoft Utilities - Outlook.url
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://www.nirsoft.net/outlook_office_software.html
|
||||
HotKey=0
|
||||
6
.kit_items/Misc/Nirsoft Utilities - Passwords.url
Normal file
6
.kit_items/Misc/Nirsoft Utilities - Passwords.url
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://www.nirsoft.net/password_recovery_tools.html
|
||||
HotKey=0
|
||||
5
.kit_items/Misc/Sysinternals Suite (Live).url
Normal file
5
.kit_items/Misc/Sysinternals Suite (Live).url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://live.sysinternals.com/
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://kb.eset.com/esetkb/index?page=content&id=SOLN146
|
||||
IDList=
|
||||
5
.kit_items/Uninstallers/AV Removal Tools/AVG.url
Normal file
5
.kit_items/Uninstallers/AV Removal Tools/AVG.url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://www.avg.com/us-en/utilities
|
||||
IDList=
|
||||
6
.kit_items/Uninstallers/AV Removal Tools/Avast.url
Normal file
6
.kit_items/Uninstallers/AV Removal Tools/Avast.url
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://files.avast.com/iavs9x/avastclear.exe
|
||||
IDList=
|
||||
HotKey=0
|
||||
6
.kit_items/Uninstallers/AV Removal Tools/Avira.url
Normal file
6
.kit_items/Uninstallers/AV Removal Tools/Avira.url
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://dlpro.antivir.com/package/regcleaner/win32/en/avira_registry_cleaner_en.zip
|
||||
IDList=
|
||||
HotKey=0
|
||||
6
.kit_items/Uninstallers/AV Removal Tools/ESET.url
Normal file
6
.kit_items/Uninstallers/AV Removal Tools/ESET.url
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://download.eset.com/special/ESETUninstaller.exe
|
||||
IDList=
|
||||
HotKey=0
|
||||
6
.kit_items/Uninstallers/AV Removal Tools/Kaspersky.url
Normal file
6
.kit_items/Uninstallers/AV Removal Tools/Kaspersky.url
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://media.kaspersky.com/utilities/ConsumerUtilities/kavremvr.exe
|
||||
IDList=
|
||||
HotKey=0
|
||||
5
.kit_items/Uninstallers/AV Removal Tools/MBAM.url
Normal file
5
.kit_items/Uninstallers/AV Removal Tools/MBAM.url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://www.malwarebytes.org/mbam-clean.exe
|
||||
IDList=
|
||||
5
.kit_items/Uninstallers/AV Removal Tools/McAfee.url
Normal file
5
.kit_items/Uninstallers/AV Removal Tools/McAfee.url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://download.mcafee.com/products/licensed/cust_support_patches/MCPR.exe
|
||||
IDList=
|
||||
5
.kit_items/Uninstallers/AV Removal Tools/Norton.url
Normal file
5
.kit_items/Uninstallers/AV Removal Tools/Norton.url
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,1
|
||||
[InternetShortcut]
|
||||
URL=ftp://ftp.symantec.com/public/english_us_canada/removal_tools/Norton_Removal_Tool.exe
|
||||
IDList=
|
||||
6
.pe_items/System32/Winpeshl.ini
Normal file
6
.pe_items/System32/Winpeshl.ini
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[LaunchApp]
|
||||
[LaunchApps]
|
||||
wpeinit
|
||||
wpeutil updatebootinfo
|
||||
cd /d "%SystemDrive%\.bin"
|
||||
"%SystemDrive%\.bin\ConEmu\ConEmu.exe", /cmd cmd /k cd "%SystemDrive%\.bin" & python "%SystemDrive%\.bin\Scripts\winpe_root_menu.py"
|
||||
2
.pe_items/System32/menu.cmd
Normal file
2
.pe_items/System32/menu.cmd
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
@echo off
|
||||
python "%SystemDrive%\.bin\Scripts\winpe_root_menu.py"
|
||||
20
.pe_items/_include/CPU-Z/cpuz.ini
Normal file
20
.pe_items/_include/CPU-Z/cpuz.ini
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
[CPU-Z]
|
||||
VERSION=1.7.7.0
|
||||
TextFontName=
|
||||
TextFontSize=14
|
||||
TextFontColor=000080
|
||||
LabelFontName=
|
||||
LabelFontSize=14
|
||||
ACPI=1
|
||||
PCI=1
|
||||
MaxPCIBus=256
|
||||
DMI=1
|
||||
Sensor=1
|
||||
SMBus=1
|
||||
Display=1
|
||||
UseDisplayAPI=1
|
||||
BusClock=1
|
||||
Chipset=1
|
||||
SPD=1
|
||||
XOC=0
|
||||
CheckUpdates=0
|
||||
File diff suppressed because it is too large
Load diff
671
.pe_items/_include/HWiNFO/HWiNFO.INI
Normal file
671
.pe_items/_include/HWiNFO/HWiNFO.INI
Normal file
|
|
@ -0,0 +1,671 @@
|
|||
[Benchmark_CPU]
|
||||
Intel Pentium-100=707
|
||||
Intel Pentium-120/Notebook=835
|
||||
Intel Pentium-166/QDI=1380
|
||||
Cyrix 6x86MX-PR300=1411
|
||||
AMD-K6-166/QDI=1482
|
||||
Intel Pentium MMX-200=1484
|
||||
Cyrix MII-PR333=1518
|
||||
Intel Mobile Pentium MMX-233=1642
|
||||
Intel Pentium Pro-166 Dual CPU=1679
|
||||
AMD-K6-200/DTK=1777
|
||||
AMD-K6-200/QDI=1778
|
||||
Intel Pentium Pro-200=1944
|
||||
AMD-K6-233/DTK=2067
|
||||
Intel P2-233/Siemens=2350
|
||||
VIA Cyrix III 533/133=2362
|
||||
Intel Celeron-266/BXmaster=2586
|
||||
Intel P2-266/Siemens=2603
|
||||
AMD-K6-2-300/PCChips M577=2655
|
||||
Intel Celeron 300=2883
|
||||
Intel Celeron-300/PCChips=2922
|
||||
AMD-K6-2-350/FIC=3092
|
||||
AMD-K6-III-400=3524
|
||||
AMD-K6-III-400/FIC VA-503A=3557
|
||||
Intel Celeron-366/BXmaster=3718
|
||||
Intel P2-400/Siemens=3886
|
||||
Intel Celeron-400/BXmaster=3890
|
||||
AMD-K6-2-450/FIC=3964
|
||||
AMD-K6-III-448/FIC VA-503A=3975
|
||||
AMD-K6-III-450=3978
|
||||
Intel Mobile P2-400/Scenic=4047
|
||||
Intel Celeron-413/BXmaster=4175
|
||||
Intel Celeron-433=4219
|
||||
Intel P3-450/CC820=4363
|
||||
Intel P3-450/Siemens=4372
|
||||
Intel Celeron-450=4555
|
||||
Intel Celeron-300A@467=4686
|
||||
Intel Celeron-466/BXmaster=4789
|
||||
Intel P3-500/GA-6BXDS=5021
|
||||
Intel Pentium III Xeon-550=5299
|
||||
Intel Celeron-525/BXmaster=5314
|
||||
Intel P3-550/Siemens=5543
|
||||
Intel Celeron-550/BXmaster=5579
|
||||
Intel Celeron-575/BXmaster=5845
|
||||
Intel Celeron-616/BXmaster=5999
|
||||
Intel P3-617/GA-BX2000=6241
|
||||
AMD Athlon-600/AMD-750=6303
|
||||
AMD Duron-600/KT133=6436
|
||||
Intel P3-650/BX=6497
|
||||
AMD Athlon-650/KX133=6749
|
||||
AMD Duron-650/KT133=6971
|
||||
Intel P3-700/BX=7013
|
||||
AMD Athlon-700/KX133=7185
|
||||
AMD Duron-700/KT133=7507
|
||||
Intel Celeron-815/BXmaster=7985
|
||||
AMD Athlon-750/KT133=8085
|
||||
AMD Athlon-800/AMD-750=8286
|
||||
AMD Duron-800/KT133=8580
|
||||
Intel P3-650@870/BX=8675
|
||||
AMD Duron-850/KT133=9120
|
||||
Intel P3-650@917/BX=9175
|
||||
AMD Duron-900/KT133=9654
|
||||
AMD Duron-928 (9x103)=9952
|
||||
Intel Celeron-566@1010=10115
|
||||
VIA Antaur-1000=6108
|
||||
VIA C3-1333=7601
|
||||
AMD Duron-950/KT133=10190
|
||||
AMD Athlon-1000/KT133=10734
|
||||
AMD Athlon-1200/KT133=12949
|
||||
AMD Athlon XP 1500+/KT133=14297
|
||||
AMD Athlon XP 2000+/KT133A=17691
|
||||
AMD Athlon XP 2200+/KT133A=19490
|
||||
AMD Athlon XP-M 2500+/KM400=19590
|
||||
AMD Athlon XP-M 3000+/SiS748=23391
|
||||
Intel P3-1000/i815=10381
|
||||
Intel P4-1600=6636
|
||||
Intel P4-1800=7445
|
||||
Intel P4-2000=8272
|
||||
Intel P4-2500=11051
|
||||
Intel Pentium-M ULV-1000=10515
|
||||
Intel Pentium-M-1300=13590
|
||||
Intel Pentium-M-1600=16856
|
||||
Intel Pentium-M 735=16958
|
||||
Intel Pentium-M 755=20008
|
||||
Intel Pentium-M 770=21163
|
||||
Intel P4-2800(noHT)/i875P=12399
|
||||
Intel P4-3066(noHT)/i845PE=13479
|
||||
Intel P4-3000E(noHT)/i915P=22136
|
||||
Intel P4-3000 530 (HT)=34013
|
||||
Intel P4-3200E(noHT)/i875P=23446
|
||||
Intel P4-3600E(noHT)/i925X=26424
|
||||
Intel Xeon-3800(HT)=55028
|
||||
AMD Athlon64 3200+=23814
|
||||
AMD Athlon64 3800+=28731
|
||||
AMD Athlon64 FX-53=28727
|
||||
AMD Opteron 248=25920
|
||||
AMD Turion64 ML-34+=18520
|
||||
AMD Turion64 X2 TL-60=47697
|
||||
AMD Athlon 64 X2 4400+=52867
|
||||
Intel Core Duo T2600 (1core)=20293
|
||||
Intel Core Duo T2600 (2core)=40849
|
||||
Intel Core 2 Duo E6700=51765
|
||||
Intel Core 2 Duo T7400=53238
|
||||
Transmeta Crusoe TM5800-1000=6382
|
||||
2xIntel Xeon 5150/5000P=131832
|
||||
4xIntel Xeon MP 7040=180052
|
||||
Intel Core 2 Extreme QX6700=129908
|
||||
AMD Phenom 9500=103687
|
||||
Intel Atom 230=15438
|
||||
Intel Core i5-520M=94834
|
||||
Intel Core i7-860=180329
|
||||
Intel Core i7-820QM=123279
|
||||
Intel Core i7-980X=347501
|
||||
Intel Core i5-2520M=111448
|
||||
Intel Core i7-3820=265424
|
||||
|
||||
[Benchmark_FPU]
|
||||
Intel Pentium-100=1109
|
||||
VIA Cyrix III 533/133=1327
|
||||
Intel Pentium 120/Notebook=1350
|
||||
Intel Pentium Pro-166 Dual CPU=1663
|
||||
Intel Pentium Pro-200=1934
|
||||
Cyrix 6x86MX-PR300=2304
|
||||
Intel P2-233/Siemens=2323
|
||||
AMD-K6-166/QDI=2533
|
||||
Cyrix MII-PR333=2585
|
||||
Intel Celeron-266/BXmaster=2630
|
||||
Intel Mobile Pentium MMX-233=2647
|
||||
Intel P2-266/Siemens=2662
|
||||
Intel Celeron-300=2862
|
||||
AMD-K6-200/DTK=2999
|
||||
AMD-K6-200/QDI=3041
|
||||
AMD-K6-233/DTK=3492
|
||||
Intel Celeron-366/BXmaster=3650
|
||||
Intel P2-400/Siemens=3968
|
||||
Intel Celeron-400/BXmaster=3972
|
||||
Intel Mobile P2-400/Scenic=3973
|
||||
Intel Celeron-413/BXmaster=4097
|
||||
Intel Celeron-433=4304
|
||||
Intel P3-450/CC820=4444
|
||||
Intel P3-450/Siemens=4452
|
||||
Intel Celeron-450=4472
|
||||
Intel Celeron-300A@467=4599
|
||||
AMD-K6-2-300/PCChips M577=4605
|
||||
Intel Celeron-466/BXmaster=4628
|
||||
Intel P3-500/GA-6BXDS=4958
|
||||
Intel Celeron-525/BXmaster=5215
|
||||
AMD-K6-2-350/FIC=5368
|
||||
Intel Pentium III Xeon-550=5417
|
||||
Intel P3-550/Siemens=5440
|
||||
Intel Celeron-550/BXmaster=5477
|
||||
Intel Celeron-575/BXmaster=5738
|
||||
Intel Celeron-616/BXmaster=5897
|
||||
Intel P3-617/GA-BX2000=6114
|
||||
AMD-K6-III-400/FIC VA-503A=6166
|
||||
AMD-K6-III-400=6169
|
||||
Intel P3-650/BX=6446
|
||||
AMD-K6-2-450/FIC=6876
|
||||
AMD-K6-III-448/FIC VA-503A=6893
|
||||
AMD-K6-III-450=6895
|
||||
Intel P3-700/BX=6942
|
||||
Intel Celeron-815/BXmaster=7799
|
||||
Intel P3-650@870/BX=8614
|
||||
Intel P3-650@917/BX=9080
|
||||
VIA C3-1333=3160
|
||||
AMD Duron-600/KT133=9132
|
||||
AMD Athlon-600/AMD-750=9231
|
||||
AMD Athlon-650/KX133=9888
|
||||
Intel Celeron-566@1010=9977
|
||||
AMD Athlon-700/KX133=10527
|
||||
AMD Athlon-750/KT133=11457
|
||||
AMD Athlon-800/AMD-750=12149
|
||||
AMD Duron-850/KT133=12954
|
||||
AMD Duron-900/KT133=13712
|
||||
AMD Duron-928 (9x103)=14150
|
||||
AMD Duron-950/KT133=14479
|
||||
AMD Athlon-1000/KT133=15252
|
||||
AMD Athlon-1200/KT133=18378
|
||||
AMD Athlon XP 1500+/KT133=20757
|
||||
AMD Athlon XP 1800+=23375
|
||||
AMD Athlon XP 2000+/KT133A=25693
|
||||
AMD Athlon XP 2200+/KT133A=28296
|
||||
AMD Athlon XP-M 2500+/KM400=28877
|
||||
AMD Athlon XP-M 3000+/SiS748=34104
|
||||
Intel P3-1000/i815=9813
|
||||
Intel P4-1600=3282
|
||||
Intel P4-1800=3833
|
||||
Intel P4-2000=4256
|
||||
Intel P4-2500=6020
|
||||
Intel Pentium-M ULV-1000=8547
|
||||
Intel Pentium-M-1300=11089
|
||||
Intel Pentium-M-1600=13614
|
||||
Intel Pentium-M 735=14211
|
||||
Intel Pentium-M 755=16772
|
||||
Intel Pentium-M 770=17807
|
||||
Intel P4-2800(noHT)/i875P=6799
|
||||
Intel P4-3066(noHT)/i845PE=7396
|
||||
Intel P4-3000 530 (HT)=9220
|
||||
Intel P4-3200E(noHT)/i875P=6578
|
||||
Intel P4-3600E(noHT)/i925X=8163
|
||||
Intel Xeon-3800(HT)=17241
|
||||
AMD Athlon64 3200+=31194
|
||||
AMD Athlon64 3800+=37379
|
||||
AMD Athlon64 FX-53=37426
|
||||
AMD Opteron 248=34115
|
||||
AMD Turion64 ML-34+=28056
|
||||
AMD Turion64 X2 TL-60=62143
|
||||
AMD Athlon 64 X2 4400+=68974
|
||||
Intel Core Duo T2600 (1core)=16967
|
||||
Intel Core Duo T2600 (2core)=34039
|
||||
Intel Core 2 Duo E6600=36031
|
||||
Intel Core 2 Duo E6700=40075
|
||||
Intel Core 2 Duo T7400=32659
|
||||
Transmeta Crusoe TM5800-1000=4251
|
||||
2xIntel Xeon 5150/5000P=80725
|
||||
4xIntel Xeon MP 7040=54379
|
||||
Intel Core 2 Extreme QX6700=80338
|
||||
AMD Phenom 9500=133430
|
||||
Intel Atom 230=10769
|
||||
Intel Core i5-520M=60634
|
||||
Intel Core i7-860=131820
|
||||
Intel Core i7-820QM=90751
|
||||
Intel Core i7-980X=215620
|
||||
Intel Core i5-2520M=55354
|
||||
Intel Core i7-3820=130252
|
||||
|
||||
[Benchmark_MMX]
|
||||
AMD-K6-166/QDI=909
|
||||
AMD-K6-200/QDI=1070
|
||||
Intel P2-266/440LX=1339
|
||||
VIA Cyrix III 533/133=1815
|
||||
Intel Pentium MMX-200=2041
|
||||
Intel Mobile Pentium MMX-233=2363
|
||||
Intel P2-233/440BX=2390
|
||||
Intel Celeron-300=2931
|
||||
Intel Celeron-366=3742
|
||||
Intel Celeron-450=4602
|
||||
Intel Celeron-300A@467=4737
|
||||
Intel P3-500/GA-6BXDS=5009
|
||||
AMD Duron-600/KT133=5454
|
||||
Intel P3-550/Siemens=5513
|
||||
AMD Athlon-650/KX133=5906
|
||||
AMD Athlon-700/Abit KA7=6356
|
||||
Intel P3-650/BX=6490
|
||||
AMD Duron-750/KT133=6823
|
||||
AMD Athlon-750/KT133=6846
|
||||
Intel P3-700/BX=7025
|
||||
AMD Duron-800/KT133=7277
|
||||
AMD Duron-850/KT133=7738
|
||||
AMD Duron-900/KT133=8192
|
||||
AMD Duron-928 (9x103)=8448
|
||||
AMD Duron-950/KT133=8645
|
||||
Intel P3-650@870/BX=8706
|
||||
AMD Athlon-1000/KT133=9110
|
||||
Intel P3-650@917/BX=9173
|
||||
Intel Celeron-566@1010=10080
|
||||
VIA C3-1333=6063
|
||||
AMD Athlon-1200/KT133=10998
|
||||
AMD Athlon XP 1500+/KT133=12125
|
||||
AMD Athlon XP 1800+=13642
|
||||
AMD Athlon XP 2000+/KT133A=15013
|
||||
AMD Athlon XP 2200+/KT133A=16516
|
||||
AMD Athlon XP-M 2500+/KM400=16858
|
||||
AMD Athlon XP-M 3000+/SiS748=20040
|
||||
Intel P3-1000=9903
|
||||
Intel P4-1600=14468
|
||||
Intel P4-1800=16319
|
||||
Intel P4-2000=18140
|
||||
Intel P4-2500=22681
|
||||
Intel Pentium-M ULV-1000=9937
|
||||
Intel Pentium-M-1300=12865
|
||||
Intel Pentium-M-1600=15835
|
||||
Intel Pentium-M 735=16839
|
||||
Intel Pentium-M 755=19869
|
||||
Intel Pentium-M 770=21149
|
||||
Intel P4-2800(noHT)/i875P=24478
|
||||
Intel P4-3066(noHT)/i845PE=26437
|
||||
Intel P4-3000 530 (HT)=27352
|
||||
Intel P4-3200E(noHT)/i875P=22592
|
||||
Intel P4-3600E(noHT)/i925X=25314
|
||||
Intel Xeon-3800(HT)=53268
|
||||
AMD Athlon64 3200+=18228
|
||||
AMD Athlon64 3800+=21859
|
||||
AMD Athlon64 FX-53=21856
|
||||
AMD Opteron 248=19926
|
||||
AMD Turion64 ML-34+=16403
|
||||
AMD Turion64 X2 TL-60=36363
|
||||
AMD Athlon 64 X2 4400+=40282
|
||||
Intel Core Duo T2600 (1core)=21423
|
||||
Intel Core Duo T2600 (2core)=42912
|
||||
Intel Core 2 Duo E6600=74154
|
||||
Intel Core 2 Duo E6700=82312
|
||||
Intel Core 2 Duo T7400=67321
|
||||
Transmeta Crusoe TM5800-1000=5272
|
||||
2xIntel Xeon 5150/5000P=51186
|
||||
4xIntel Xeon MP 7040=83086
|
||||
Intel Core 2 Extreme QX6700=165067
|
||||
AMD Phenom 9500=80202
|
||||
Intel Atom 230=14545
|
||||
Intel Core i5-520M=80822
|
||||
Intel Core i7-860=171336
|
||||
Intel Core i7-820QM=115063
|
||||
Intel Core i7-980X=261051
|
||||
Intel Core i5-2520M=81444
|
||||
Intel Core i7-3820=160178
|
||||
|
||||
[Benchmark_Memory]
|
||||
Intel Pentium-100/FPM=69
|
||||
Intel Pentium Pro-166 Dual CPU=78
|
||||
AMD-K6-166/QDI/EDO=85
|
||||
Intel Pentium MMX-200/EDO=92
|
||||
AMD-K6-200/QDI/EDO=93
|
||||
Intel Pentium MMX-233/PC66=101
|
||||
Intel P2-233/440BX/PC66=111
|
||||
VIA Cyrix III 533/133=114
|
||||
Intel P2-266/440BX/PC66=117
|
||||
AMD-K6-III-400=135
|
||||
Intel Celeron-366/PC66=163
|
||||
AMD Duron-600/KT133=173
|
||||
AMD Athlon-700/KX133/PC133=202
|
||||
AMD Athlon-650/KX133=205
|
||||
Intel P3-500/GA-6BXDS/PC100=209
|
||||
Intel P3-550/Siemens/PC100=215
|
||||
Intel Celeron-300A@467/PC66=209
|
||||
Intel Celeron-300/PC66=146
|
||||
Intel P3-650/BX/PC100=238
|
||||
Intel P3-700/BX/PC100=211
|
||||
AMD Athlon-750/KT133/PC133=214
|
||||
AMD Duron-750/KT133=263
|
||||
Intel Celeron-566@1010=273
|
||||
VIA C3-1333/CN400=223
|
||||
AMD Duron-950/KT133=275
|
||||
AMD Duron-928 (9x103)/KT133=292
|
||||
AMD Duron-1100/SiS745/DDR333=477
|
||||
AMD Athlon XP-M 2500+/DDR333=548
|
||||
Intel P3-650@917/FSB140=310
|
||||
Intel P3-1000/PC133=218
|
||||
Intel P4-1600/i850=1115
|
||||
Intel P4-2000/i850/PC800=1245
|
||||
Intel P4-1800/i845G/DDR266=867
|
||||
Intel P4-2500/i845/DDR266=757
|
||||
Intel Pentium-M-1600/DDR266=830
|
||||
Intel Pentium-M 735/855PM/DDR400=971
|
||||
Intel P4-3066/i845PE/DDR266=1028
|
||||
Intel P4-2800/i875P/2Ch/DDR400=2056
|
||||
Intel P4-3200E/i875P/2Ch/DDR400=2342
|
||||
Intel P4-3600E/i915P/DDR2-533=2556
|
||||
Intel P4-3600E/i925X/DDR2-533=2844
|
||||
Intel Xeon-3800/E7525/DDR2-400=1635
|
||||
AMD Athlon64 3200+/1Ch/DDR400=1266
|
||||
AMD Athlon64 3800+/2Ch/DDR400=2375
|
||||
AMD Athlon64 FX-53/2Ch/DDR400=2166
|
||||
AMD Opteron 248/DDR266=947
|
||||
AMD Turion64 ML-34+=1071
|
||||
Intel Core 2 Duo E6700/DDR2-800=2894
|
||||
Transmeta Crusoe TM5800-1000=337
|
||||
2xIntel Xeon 5150/5000P/DDR2-667F=2919
|
||||
4xIntel Xeon MP 7040=1721
|
||||
AMD Phenom 9500=1795
|
||||
Intel Atom 230/945/DDR2-800=1682
|
||||
Intel Core i5-520M=5235
|
||||
Intel Core i7-860/DDR3-667/2CH=6506
|
||||
Intel Core i7-820QM=5424
|
||||
Intel Core i7-980X=9343
|
||||
Intel Core i7-3820/DDR3-1600/4CH=13366
|
||||
|
||||
[Benchmark_Disk_ReadBurst]
|
||||
Fujitsu MPB3043ATU E/PIO=4.03
|
||||
Seagate ST38410A/PIO=4.33
|
||||
Maxtor 91021U2/PIO=4.61
|
||||
Maxtor 92041U4/PIO=4.82
|
||||
Quantum Fireball_TM2110S300X=6.83
|
||||
SEAGATE ST51080N=7.92
|
||||
Seagate ST31277A=8,37
|
||||
IBM DCAS-32160 S65A=8.65
|
||||
QUANTUM FIREBALL ST3.2A/PIO=14.74
|
||||
Seagate ST39102LW Cheetah=30.05
|
||||
IBM DJNA-370910/UDMA66=15.27
|
||||
Seagate ST34321A/UDMA33=21.03
|
||||
Seagate ST38421A=23.82
|
||||
Seagate ST34310A=23.88
|
||||
QUANTUM FIREBALL SE2.1A=26.43
|
||||
Maxtor 91021U2/UDMA33=29.13
|
||||
Maxtor 54098U8/UDMA33=29.5
|
||||
IBM DTTA-350430=29.7
|
||||
IBM-DPTA-371360=29.86
|
||||
Seagate ST320420A=47.3
|
||||
IBM-DJNA-371350=27.87
|
||||
IBM-DTLA-307030/ATA100=82.22
|
||||
SEAGATE Cheetah X15/RAID=137.08
|
||||
IBM Deskstar 60GXP/ATA100=81.98
|
||||
MAXTOR 4K020H1/ATA100=84.58
|
||||
Seagate ST317221A/UDMA66=42.03
|
||||
Maxtor 6E040L0=79.36
|
||||
Seagate ST380021A/ATA100=73.11
|
||||
HITACHI DK23EA-40=80.04
|
||||
WDC WD800JB/ATA100=85.71
|
||||
TOSHIBA MK4019GAX=83.60
|
||||
Maxtor MaxLine III SATA+NCQ=119.96
|
||||
ST312002 6AS=106.61
|
||||
Maxtor Atlas 10K5 73SCA=145.86
|
||||
WDC WD3200YS-01PGB0=167.33
|
||||
Hitachi HTE726040M9AT00=84.61
|
||||
Seagate ST3160827AS=120.88
|
||||
WDC WD5000AADS-00S9B0=122.87
|
||||
Hitachi HTS545032B9A=161.10
|
||||
Seagate ST1000DM003-9YN1=282.43
|
||||
|
||||
[Benchmark_Disk_ReadRandom]
|
||||
Hitachi HTE726040M9AT00=22.82
|
||||
Maxtor Atlas 10K5 73SCA=31.61
|
||||
Seagate ST3160827AS=32.26
|
||||
FUJITSU MHV2080BH=17.79
|
||||
TOSHIBA MK8034GSX=18.12
|
||||
ST916082 1AS=22.27
|
||||
WDC WD5000AADS-00S9B0=24.58
|
||||
Hitachi HTS545032B9A=24.72
|
||||
Seagate ST1000DM003-9YN1=37.09
|
||||
|
||||
[Benchmark_Disk_RandomAccess]
|
||||
SEAGATE ST51080N=20.96
|
||||
Quantum Fireball_TM2110S300X=20.74
|
||||
Seagate ST34321A/UDMA33=17.21
|
||||
Seagate ST38410A/PIO=17.17
|
||||
Seagate ST31277A=16.75
|
||||
Fujitsu MPB3043ATU E=16.18
|
||||
IBM DTTA-350430=16.5
|
||||
IBM DCAS-32160 S65A=15.95
|
||||
Maxtor 92041U4/PIO=15.81
|
||||
Seagate ST34310A=15.56
|
||||
Maxtor 91021U2/PIO=15.66
|
||||
Seagate ST38421A=15.71
|
||||
QUANTUM FIREBALL ST3.2A=15.50
|
||||
QUANTUM FIREBALL SE2.1A=14.94
|
||||
Maxtor 54098U8/UDMA33=13.77
|
||||
Seagate ST320420A=12.57
|
||||
IBM DJNA-370910/UDMA66=12.10
|
||||
Seagate ST39102LW Cheetah=8.78
|
||||
IBM-DPTA-371360=13.37
|
||||
IBM-DJNA-371350=13.38
|
||||
IBM-DTLA-307030/ATA100=12.44
|
||||
IBM-DTLA-307030/ATA100+AAM=22.34
|
||||
SEAGATE Cheetah X15/RAID=5.65
|
||||
IBM Deskstar 60GXP=12.70
|
||||
MAXTOR 4K020H1/ATA100=19.12
|
||||
Seagate ST317221A/UDMA66=16.60
|
||||
Maxtor 6E040L0=14.52
|
||||
Seagate ST380021A/ATA100=14.58
|
||||
HITACHI DK23EA-40=19.40
|
||||
WDC WD800JB/ATA100=13.61
|
||||
TOSHIBA MK4019GAX=18.61
|
||||
Maxtor MaxLine III SATA+NCQ=15.82
|
||||
ST312002 6AS=12.51
|
||||
Maxtor Atlas 10K5 73SCA=10.16
|
||||
WDC WD3200YS-01PGB0=13.16
|
||||
Hitachi HTE726040M9AT00=12.90
|
||||
Seagate ST3160827AS=11.65
|
||||
Seagate ST380215A=14.82
|
||||
WDC WD5000AADS-00S9B0=17.37
|
||||
Hitachi HTS545032B9A=22.16
|
||||
Seagate ST1000DM003-9YN1=15.53
|
||||
|
||||
[LogfileSettings]
|
||||
COMP=1
|
||||
COMP_SP=1
|
||||
COMP_Name=1
|
||||
COMP_Os=1
|
||||
COMP_User=0
|
||||
CPU=1
|
||||
CPU_Name=1
|
||||
CPU_ID=1
|
||||
CPU_Vendor=1
|
||||
CPU_Stepping=1
|
||||
CPU_Type=1
|
||||
CPU_BrandID=1
|
||||
CPU_PN=1
|
||||
CPU_Clock=1
|
||||
CPU_MaxFreq=1
|
||||
CPU_CacheL1=1
|
||||
CPU_CacheL2=1
|
||||
CPU_TLB_I=1
|
||||
CPU_TLB_D=1
|
||||
CPU_Features=1
|
||||
CPU_PIROM=1
|
||||
MEM=1
|
||||
MEM_TotalSize=1
|
||||
MEM_Timing=1
|
||||
MEM_Row=1
|
||||
MEM_Row_Size=1
|
||||
MEM_Row_Type=1
|
||||
MEM_Row_Speed=1
|
||||
MEM_Row_Model=1
|
||||
MEM_Row_ECC=1
|
||||
MEM_Row_Date=1
|
||||
MEM_Row_SN=1
|
||||
MEM_Row_Cfg=1
|
||||
MEM_Row_Latency=1
|
||||
MEM_Row_Features=1
|
||||
MEM_Row_iFeatures=1
|
||||
BUS=1
|
||||
BUS_PCI=1
|
||||
BUS_PCI_DevName=1
|
||||
BUS_PCI_DevNumber=1
|
||||
BUS_PCI_Resources=1
|
||||
BUS_PCI_Features=1
|
||||
BUS_PCI_DevSpecific=1
|
||||
BUS_PCIX_Features=1
|
||||
BUS_PCIe_Features=1
|
||||
BUS_PCI_DRV_INFO=1
|
||||
BUS_EISA=1
|
||||
DMI=1
|
||||
DMI_0=1
|
||||
DMI_1=1
|
||||
DMI_2=1
|
||||
DMI_3=1
|
||||
DMI_4=1
|
||||
DMI_5=1
|
||||
DMI_6=1
|
||||
DMI_7=1
|
||||
DMI_8=1
|
||||
DMI_9=1
|
||||
DMI_10=1
|
||||
DMI_11=1
|
||||
DMI_12=1
|
||||
DMI_13=1
|
||||
DMI_14=1
|
||||
DMI_15=1
|
||||
DMI_16=1
|
||||
DMI_17=1
|
||||
DMI_18=1
|
||||
DMI_19=1
|
||||
DMI_20=1
|
||||
DMI_21=1
|
||||
DMI_22=1
|
||||
DMI_23=1
|
||||
DMI_24=1
|
||||
DMI_25=1
|
||||
DMI_26=1
|
||||
DMI_27=1
|
||||
DMI_28=1
|
||||
DMI_29=1
|
||||
DMI_30=1
|
||||
DMI_31=1
|
||||
DMI_32=1
|
||||
DMI_33=1
|
||||
DMI_34=1
|
||||
DMI_35=1
|
||||
DMI_36=1
|
||||
DMI_37=1
|
||||
DMI_38=1
|
||||
DMI_39=1
|
||||
DMI_129=1
|
||||
DMI_130=1
|
||||
DMI_131=1
|
||||
VIDEO=1
|
||||
VIDEO_Chipset=1
|
||||
VIDEO_Memory=1
|
||||
VIDEO_Card=1
|
||||
VIDEO_Bus=1
|
||||
VIDEO_RAMDAC=1
|
||||
VIDEO_BIOSver=1
|
||||
VIDEO_Clock=1
|
||||
VIDEO_HWID=1
|
||||
VIDEO_DRV_INFO=1
|
||||
VIDEO_DirectX=1
|
||||
MON=1
|
||||
MON_Name=1
|
||||
MON_SN=1
|
||||
MON_Date=1
|
||||
MON_Dimensions=1
|
||||
MON_DisplayType=1
|
||||
MON_InputSignal=1
|
||||
MON_Gamma=1
|
||||
MON_DPMSinput=1
|
||||
MON_DPMSmodes=1
|
||||
MOBO=1
|
||||
MOBO_Model=1
|
||||
MOBO_Chipset=1
|
||||
MOBO_CompName=1
|
||||
MOBO_MachineType=1
|
||||
MOBO_Slots=1
|
||||
MOBO_BIOS_Manuf=1
|
||||
MOBO_BIOS_Date=1
|
||||
MOBO_PNP_Devs=1
|
||||
MOBO_PNP_Nodes=1
|
||||
MOBO_ACPI_Devs=1
|
||||
MOBO_ACPI_Enum=1
|
||||
DRIVE=1
|
||||
DRIVE_IDE=1
|
||||
DRIVE_IDE_Ctrller=1
|
||||
DRIVE_IDE_Channel=1
|
||||
DRIVE_IDE_Model=1
|
||||
DRIVE_IDE_Rev=1
|
||||
DRIVE_IDE_SN=1
|
||||
DRIVE_IDE_Capacity=1
|
||||
DRIVE_IDE_Geometry=1
|
||||
DRIVE_IDE_Cache=1
|
||||
DRIVE_IDE_Xfer=1
|
||||
DRIVE_IDE_BasicCapab=1
|
||||
DRIVE_IDE_ATA2Capab=1
|
||||
DRIVE_IDE_SMART=1
|
||||
DRIVE_SCSI=1
|
||||
DRIVE_SCSI_ID=1
|
||||
DRIVE_SCSI_Desc=1
|
||||
DRIVE_SCSI_Class=1
|
||||
DRIVE_Floppy=1
|
||||
NETWORK=1
|
||||
NETWORK_HWID=1
|
||||
NETWORK_DRV_INFO=1
|
||||
AUDIO=1
|
||||
AUDIO_DRV_INFO=1
|
||||
AUDIO_HWID=1
|
||||
PORTS=1
|
||||
BUS_USB=1
|
||||
BUS_USB_DRV_INFO=1
|
||||
BATTERY=1
|
||||
SENSORS=1
|
||||
|
||||
[Settings]
|
||||
HighestIdeAddress=0
|
||||
AcpiEnum=0
|
||||
SWSMI=1
|
||||
DebugMode=0
|
||||
SMBus=1
|
||||
TempScale=C
|
||||
AC97CodecID=1
|
||||
SkipProblematicPciDev=0
|
||||
GPUI2C=1
|
||||
LPC=1
|
||||
DefReportType=5
|
||||
TPM=0
|
||||
PCIdirect=1
|
||||
OpenSystemSummary=0
|
||||
RememberPreferences=1
|
||||
LargeFonts=0
|
||||
OpenSensors=0
|
||||
MinimalizeMainWnd=0
|
||||
MinimalizeSensors=0
|
||||
PersistentDriver=0
|
||||
UseHPET=1
|
||||
AutoUpdate=0
|
||||
GPUI2CNVAPI=1
|
||||
GPUI2CADL=0
|
||||
SensorsOnly=0
|
||||
AcpiEval=1
|
||||
CpuClkFromBusClk=1
|
||||
BusClkPolling=1
|
||||
SMBusAdrExclude=11111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000
|
||||
GPUI2CBusExclude=00000000
|
||||
SensorsSM=1
|
||||
IoctlKernel=0
|
||||
SummaryOnly=0
|
||||
WakeGPUs=1
|
||||
KeepTheme=0
|
||||
FlushBuffers=1
|
||||
iMEsupport=1
|
||||
GPUI2Ccaching=1
|
||||
CSMI_SAS_Support=1
|
||||
DebugDirect=1
|
||||
MinimalizeSensorsClose=0
|
||||
WakeGPUsExt=0
|
||||
PollSleepingGPUs=0
|
||||
ShowWelcomeAndProgress=1
|
||||
EnablePchTherm=0
|
||||
ReorderGPUs=1
|
||||
NvmlSupport=1
|
||||
DecimalSeparator=.
|
||||
ThousandsSeparator=,
|
||||
CsvSeparator=,
|
||||
MinimizeGraphs=1
|
||||
TextButtons=0
|
||||
|
|
@ -1,56 +1,56 @@
|
|||
<?xml version="1.0" encoding="Windows-1252" ?>
|
||||
<NotepadPlus>
|
||||
<FindHistory nbMaxFindHistoryPath="10" nbMaxFindHistoryFilter="10" nbMaxFindHistoryFind="10" nbMaxFindHistoryReplace="10" matchWord="no" matchCase="no" wrap="yes" directionDown="yes" fifRecuisive="yes" fifInHiddenFolder="no" dlgAlwaysVisible="no" fifFilterFollowsDoc="no" fifFolderFollowsDoc="no" searchMode="0" transparencyMode="1" transparency="150" dotMatchesNewline="no" />
|
||||
<History nbMaxFile="10" inSubMenu="no" customLength="-1" />
|
||||
<GUIConfigs>
|
||||
<GUIConfig name="ToolBar" visible="no">standard</GUIConfig>
|
||||
<GUIConfig name="StatusBar">hide</GUIConfig>
|
||||
<GUIConfig name="TabBar" dragAndDrop="yes" drawTopBar="yes" drawInactiveTab="yes" reduce="yes" closeButton="yes" doubleClick2Close="no" vertical="no" multiLine="no" hide="no" quitOnEmpty="no" />
|
||||
<GUIConfig name="ScintillaViewsSplitter">vertical</GUIConfig>
|
||||
<GUIConfig name="UserDefineDlg" position="undocked">hide</GUIConfig>
|
||||
<GUIConfig name="TabSetting" replaceBySpace="yes" size="4" />
|
||||
<GUIConfig name="noUpdate" intervalDays="15" nextUpdateDate="20080426">no</GUIConfig>
|
||||
<GUIConfig name="Auto-detection">yes</GUIConfig>
|
||||
<GUIConfig name="CheckHistoryFiles">no</GUIConfig>
|
||||
<GUIConfig name="TrayIcon">no</GUIConfig>
|
||||
<GUIConfig name="MaitainIndent">yes</GUIConfig>
|
||||
<GUIConfig name="TagsMatchHighLight" TagAttrHighLight="yes" HighLightNonHtmlZone="no">yes</GUIConfig>
|
||||
<GUIConfig name="RememberLastSession">no</GUIConfig>
|
||||
<GUIConfig name="DetectEncoding">yes</GUIConfig>
|
||||
<GUIConfig name="NewDocDefaultSettings" format="0" encoding="4" lang="0" codepage="-1" openAnsiAsUTF8="yes" />
|
||||
<GUIConfig name="langsExcluded" gr0="0" gr1="0" gr2="0" gr3="0" gr4="0" gr5="0" gr6="0" gr7="0" langMenuCompact="yes" />
|
||||
<GUIConfig name="Print" lineNumber="yes" printOption="3" headerLeft="" headerMiddle="" headerRight="" footerLeft="" footerMiddle="" footerRight="" headerFontName="" headerFontStyle="0" headerFontSize="0" footerFontName="" footerFontStyle="0" footerFontSize="0" margeLeft="0" margeRight="0" margeTop="0" margeBottom="0" />
|
||||
<GUIConfig name="Backup" action="0" useCustumDir="no" dir="" isSnapshotMode="no" snapshotBackupTiming="7000" />
|
||||
<GUIConfig name="TaskList">yes</GUIConfig>
|
||||
<GUIConfig name="MRU">yes</GUIConfig>
|
||||
<GUIConfig name="URL">2</GUIConfig>
|
||||
<GUIConfig name="globalOverride" fg="no" bg="no" font="yes" fontSize="no" bold="no" italic="no" underline="no" />
|
||||
<GUIConfig name="auto-completion" autoCAction="3" triggerFromNbChar="1" autoCIgnoreNumbers="yes" funcParams="yes" />
|
||||
<GUIConfig name="auto-insert" parentheses="no" brackets="no" curlyBrackets="no" quotes="no" doubleQuotes="no" htmlXmlTag="no" />
|
||||
<GUIConfig name="sessionExt"></GUIConfig>
|
||||
<GUIConfig name="workspaceExt"></GUIConfig>
|
||||
<GUIConfig name="MenuBar">hide</GUIConfig>
|
||||
<GUIConfig name="Caret" width="1" blinkRate="600" />
|
||||
<GUIConfig name="ScintillaGlobalSettings" enableMultiSelection="no" />
|
||||
<GUIConfig name="openSaveDir" value="0" defaultDirPath="" />
|
||||
<GUIConfig name="titleBar" short="no" />
|
||||
<GUIConfig name="wordCharList" useDefault="yes" charsAdded="" />
|
||||
<GUIConfig name="delimiterSelection" leftmostDelimiter="40" rightmostDelimiter="41" delimiterSelectionOnEntireDocument="no" />
|
||||
<GUIConfig name="multiInst" setting="0" />
|
||||
<GUIConfig name="MISC" fileSwitcherWithoutExtColumn="no" backSlashIsEscapeCharacterForSql="yes" newStyleSaveDlg="no" isFolderDroppedOpenFiles="no" />
|
||||
<GUIConfig name="searchEngine" searchEngineChoice="1" searchEngineCustom="" />
|
||||
<GUIConfig name="SmartHighLight" matchCase="no" wholeWordOnly="no" useFindSettings="no" onAnotherView="no">yes</GUIConfig>
|
||||
<GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" />
|
||||
<GUIConfig name="DockingManager" leftWidth="200" rightWidth="200" topHeight="200" bottomHeight="200">
|
||||
<ActiveTabs cont="0" activeTab="-1" />
|
||||
<ActiveTabs cont="1" activeTab="-1" />
|
||||
<ActiveTabs cont="2" activeTab="-1" />
|
||||
<ActiveTabs cont="3" activeTab="-1" />
|
||||
</GUIConfig>
|
||||
</GUIConfigs>
|
||||
<ProjectPanels>
|
||||
<ProjectPanel id="0" workSpaceFile="" />
|
||||
<ProjectPanel id="1" workSpaceFile="" />
|
||||
<ProjectPanel id="2" workSpaceFile="" />
|
||||
</ProjectPanels>
|
||||
</NotepadPlus>
|
||||
<?xml version="1.0" encoding="Windows-1252" ?>
|
||||
<NotepadPlus>
|
||||
<FindHistory nbMaxFindHistoryPath="10" nbMaxFindHistoryFilter="10" nbMaxFindHistoryFind="10" nbMaxFindHistoryReplace="10" matchWord="no" matchCase="no" wrap="yes" directionDown="yes" fifRecuisive="yes" fifInHiddenFolder="no" dlgAlwaysVisible="no" fifFilterFollowsDoc="no" fifFolderFollowsDoc="no" searchMode="0" transparencyMode="1" transparency="150" dotMatchesNewline="no" />
|
||||
<History nbMaxFile="10" inSubMenu="no" customLength="-1" />
|
||||
<GUIConfigs>
|
||||
<GUIConfig name="ToolBar" visible="no">standard</GUIConfig>
|
||||
<GUIConfig name="StatusBar">hide</GUIConfig>
|
||||
<GUIConfig name="TabBar" dragAndDrop="yes" drawTopBar="yes" drawInactiveTab="yes" reduce="yes" closeButton="yes" doubleClick2Close="no" vertical="no" multiLine="no" hide="no" quitOnEmpty="no" />
|
||||
<GUIConfig name="ScintillaViewsSplitter">vertical</GUIConfig>
|
||||
<GUIConfig name="UserDefineDlg" position="undocked">hide</GUIConfig>
|
||||
<GUIConfig name="TabSetting" replaceBySpace="yes" size="4" />
|
||||
<GUIConfig name="noUpdate" intervalDays="15" nextUpdateDate="20080426">no</GUIConfig>
|
||||
<GUIConfig name="Auto-detection">yes</GUIConfig>
|
||||
<GUIConfig name="CheckHistoryFiles">no</GUIConfig>
|
||||
<GUIConfig name="TrayIcon">no</GUIConfig>
|
||||
<GUIConfig name="MaitainIndent">yes</GUIConfig>
|
||||
<GUIConfig name="TagsMatchHighLight" TagAttrHighLight="yes" HighLightNonHtmlZone="no">yes</GUIConfig>
|
||||
<GUIConfig name="RememberLastSession">no</GUIConfig>
|
||||
<GUIConfig name="DetectEncoding">yes</GUIConfig>
|
||||
<GUIConfig name="NewDocDefaultSettings" format="0" encoding="4" lang="0" codepage="-1" openAnsiAsUTF8="yes" />
|
||||
<GUIConfig name="langsExcluded" gr0="0" gr1="0" gr2="0" gr3="0" gr4="0" gr5="0" gr6="0" gr7="0" langMenuCompact="yes" />
|
||||
<GUIConfig name="Print" lineNumber="yes" printOption="3" headerLeft="" headerMiddle="" headerRight="" footerLeft="" footerMiddle="" footerRight="" headerFontName="" headerFontStyle="0" headerFontSize="0" footerFontName="" footerFontStyle="0" footerFontSize="0" margeLeft="0" margeRight="0" margeTop="0" margeBottom="0" />
|
||||
<GUIConfig name="Backup" action="0" useCustumDir="no" dir="" isSnapshotMode="no" snapshotBackupTiming="7000" />
|
||||
<GUIConfig name="TaskList">yes</GUIConfig>
|
||||
<GUIConfig name="MRU">yes</GUIConfig>
|
||||
<GUIConfig name="URL">2</GUIConfig>
|
||||
<GUIConfig name="globalOverride" fg="no" bg="no" font="yes" fontSize="no" bold="no" italic="no" underline="no" />
|
||||
<GUIConfig name="auto-completion" autoCAction="3" triggerFromNbChar="1" autoCIgnoreNumbers="yes" funcParams="yes" />
|
||||
<GUIConfig name="auto-insert" parentheses="no" brackets="no" curlyBrackets="no" quotes="no" doubleQuotes="no" htmlXmlTag="no" />
|
||||
<GUIConfig name="sessionExt"></GUIConfig>
|
||||
<GUIConfig name="workspaceExt"></GUIConfig>
|
||||
<GUIConfig name="MenuBar">hide</GUIConfig>
|
||||
<GUIConfig name="Caret" width="1" blinkRate="600" />
|
||||
<GUIConfig name="ScintillaGlobalSettings" enableMultiSelection="no" />
|
||||
<GUIConfig name="openSaveDir" value="0" defaultDirPath="" />
|
||||
<GUIConfig name="titleBar" short="no" />
|
||||
<GUIConfig name="wordCharList" useDefault="yes" charsAdded="" />
|
||||
<GUIConfig name="delimiterSelection" leftmostDelimiter="40" rightmostDelimiter="41" delimiterSelectionOnEntireDocument="no" />
|
||||
<GUIConfig name="multiInst" setting="0" />
|
||||
<GUIConfig name="MISC" fileSwitcherWithoutExtColumn="no" backSlashIsEscapeCharacterForSql="yes" newStyleSaveDlg="no" isFolderDroppedOpenFiles="no" />
|
||||
<GUIConfig name="searchEngine" searchEngineChoice="1" searchEngineCustom="" />
|
||||
<GUIConfig name="SmartHighLight" matchCase="no" wholeWordOnly="no" useFindSettings="no" onAnotherView="no">yes</GUIConfig>
|
||||
<GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" />
|
||||
<GUIConfig name="DockingManager" leftWidth="200" rightWidth="200" topHeight="200" bottomHeight="200">
|
||||
<ActiveTabs cont="0" activeTab="-1" />
|
||||
<ActiveTabs cont="1" activeTab="-1" />
|
||||
<ActiveTabs cont="2" activeTab="-1" />
|
||||
<ActiveTabs cont="3" activeTab="-1" />
|
||||
</GUIConfig>
|
||||
</GUIConfigs>
|
||||
<ProjectPanels>
|
||||
<ProjectPanel id="0" workSpaceFile="" />
|
||||
<ProjectPanel id="1" workSpaceFile="" />
|
||||
<ProjectPanel id="2" workSpaceFile="" />
|
||||
</ProjectPanels>
|
||||
</NotepadPlus>
|
||||
3
.pe_items/_include/NotepadPlusPlus/npp.cmd
Normal file
3
.pe_items/_include/NotepadPlusPlus/npp.cmd
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
@echo off
|
||||
|
||||
start "" %SystemDrive%\.bin\NotepadPlusPlus\notepadplusplus.exe %2 %3 %4 %5 %6 %7 %8 %9
|
||||
File diff suppressed because it is too large
Load diff
68
.pe_items/_include/Q-Dir/Q-Dir.ini
Normal file
68
.pe_items/_include/Q-Dir/Q-Dir.ini
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
[Start]
|
||||
m_lang_id=1
|
||||
QDir_Id=0
|
||||
useColorStart=1
|
||||
Als=12
|
||||
designe_mode=2
|
||||
showCmd=3
|
||||
StartCrash=0
|
||||
default_tab=
|
||||
Max=1
|
||||
show_ext_in_type=1
|
||||
title_info=1
|
||||
adresbar_style=1
|
||||
useTreeColor=1
|
||||
useColor=1
|
||||
[Favoriten]
|
||||
Ordner=.\Favoriten\
|
||||
[Q]
|
||||
Link=.\Favoriten\Quick-Link\
|
||||
[Q-Dir]
|
||||
Lizenz=1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[Vorschau]
|
||||
Filter=*.avi;*.bmp;*.gif;*.ico;*.jpeg;*.jpg;*.mp*;*.pdf;*.png;*.wm*;
|
||||
[Filter2]
|
||||
0=#Hidden=1=-1=1=1=-1=0
|
||||
1=*.zip;*.rar;*.gz;*.7z;=1=00AA00=-1=1=-1=0
|
||||
2=*.mp*;*.avi;*.wma;=1=DD0058=-1=1=-1=0
|
||||
3=#DIR=1=008800=-1=1=-1=0
|
||||
4=*.jpg;*.jpeg;*.png,*.gif;*.bmp;*.ico=1=BB00BB=-1=1=-1=0
|
||||
5=*.html;*.htm;*.url=1=456789=-1=1=-1=0
|
||||
6=*.pl;*.cgi;*.php;*.pdf;*.doc;*.rtf;*.xls=1=BB8844=-1=1=-1=0
|
||||
7=*.cpp;*.hpp;*.h=1=DD0058=-1=1=-1=0
|
||||
8=*.exe;*.dll;*.bat=1=FF0000=-1=1=-1=0
|
||||
9=*=1=0000BB=-1=1=-1=0
|
||||
10=#BG=1=-1=-1=1=-1=0
|
||||
11=#BG-A=1=-1=-1=1=-1=0
|
||||
[Ordner]
|
||||
Filter=
|
||||
[Column_OS_6.1_Ploder1]
|
||||
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
|
||||
Spatlen_291=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%00%00%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%EE%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0E%00%00%00%69%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%91%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0C%00%00%00%46%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%00%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-563719693|772
|
||||
[Column_OS_6.1_Ploder2]
|
||||
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
|
||||
[Column_OS_6.1_Ploder3]
|
||||
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
|
||||
[Column_OS_6.1_Ploder4]
|
||||
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
|
||||
[Programs_State]
|
||||
Disable=0
|
||||
[Quick-Links]
|
||||
WK=%systemdrive%/WK
|
||||
[Options]
|
||||
Start=7
|
||||
[X-Size]
|
||||
mode=1
|
||||
dig=0
|
||||
fld_size=1
|
||||
ths_sep=1
|
||||
type=0
|
||||
precent=1
|
||||
ff_cnt=1
|
||||
block_no_focus=1
|
||||
nosort_fld_size=1
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
repos:
|
||||
- repo: https://github.com/charliermarsh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: 'v0.0.257'
|
||||
hooks:
|
||||
- id: ruff
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue