-
Notifications
You must be signed in to change notification settings - Fork 6
/
initSS.cmd
241 lines (215 loc) · 9.43 KB
/
initSS.cmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:: echo Initializing WinPE, please be patient...
:: wpeinit
echo Initialization complete.
:: For use with winpeshl.ini which doesn't work as expected with CMD.exe, /K
:: set Path=%Path%%SystemDrive%\SDRState;
:: cd %SystemDrive%\SDRState
set debug=false
set peDrive=%SystemDrive%
set vhdDrive=none
set ini=Boot\osBootGuids.ini
:: Find the osBootGuids.ini file if it exists.
for /F "tokens=1 delims=\ " %%? in ('MOUNTVOL.EXE ^|FIND ":\"') do (
call :chkReady %%? ready
if !ready!==true if exist %%?\%ini% set vhdDrive=%%?
)
:: Did we find it?
if /I %vhdDrive%==none goto :missingINI
set ini=%vhdDrive%\%ini%
set lastVHD=none
set cVol="VHD Files"
set libChk=MediaID.txt
set thisScript=%~dpfx0-
set mediaVolName=STDYR-STATE
:: ===================================================================
:: THIS SCRIPT RUNS WHEN WinPE STEADIER STATE STARTS UP,
:: but where was it booted from- USB, ISO or WIM file?
::
:: With Thomas Freedman's modifications that question is
:: no longer important. All that is required to utilize
:: Steadier State is right here on this very media!
::
:: NOTE:
:: Changing the system's drives or partitions may affect
:: Steadier State's operation, especially after Steadier
:: state is installed. Also note WinPE may use different
:: drive definitions than are used by the Windows OS. X:
:: will always be the drive WinPE-SS runs on no matter
:: what media it was booted from.
:: First, lets figure out our operating context. Lets see
:: if things are where they should be...
:: Helpful while testing
if %debug%==true (
set diff1=
set diff2=
set lastBooted=
)
:: First, make sure this script is being run from WinPE-SS.
:: Verify correct PE version by existence of a specific file.
if NOT exist %peDrive%\%libChk% goto :notWinPEss
:: if setup is complete we know where our files are, no need to search
:: for them. Determining if setup is complete is a matter of checking
:: if the ini file exists. The only reason to do this when starting PE
:: is to provide some basic info about Steadier State's status.
if NOT exist %ini% goto :missingINI
:: Parse the ini file and assign variables + values based on its contents.
:: Verify the assignment. Validate each GUID value.
for /F "Tokens=1,2 delims==" %%A in ('type %ini% ^| find /V "["') do (
set %%A=%%B
if "!%%A!" NEQ "%%B" goto :iniError
call :validateGUID %%A status
if !status! NEQ 0 goto :guidError
)
:: Set the next AND last VHD files booted. When Windows was shutdown
:: last it set the value of lastBooted in the ini file to the NEXT GUID
:: to be booted. Merge needs to process the "other" one.
if "%lastBooted%" == "%diff1%" (
set nextVHD=%vhdDrive%\bootDif1.vhd
set lastVHD=%vhdDrive%\bootDif2.vhd
set nextGUID=%diff1%
) else (
set nextVHD=%vhdDrive%\bootDif2.vhd
set lastVHD=%vhdDrive%\bootDif1.vhd
set nextGUID=%diff2%
)
if %debug%==true (
echo.
echo Last VHD booted=%lastVHD%
echo Next VHD to boot=%nextVHD%
echo Next GUID to boot=%nextGUID%
echo.
)
:showshell
echo.
echo =========================================================================
echo Hi^^! You're here because you booted your system and chose "Admins Only^!"
echo or you are in the initial process of setting things up. Welcome to SS^^!
echo.
echo This VHD management system is based on Mark Minasi's "Steadier State" but
echo does not require WinPE for rolling back Windows to its "steady state" and
echo thus eliminates an extra boot cycle (first boots WinPE to do the rollback
echo then another restart is required to boot Windows in the steady state).
echo.
echo The modifications to Steadier State were created by Thomas Freedman after
echo he studied Sami Laiho's Wioski VHD management system which didn't require
echo WinPE or 2 boot cycles to return the system to its "steady state". Thomas
echo Had difficulty using Wioski due to issues related to Windows Setup.exe so
echo he then tried Mark Minasi's SS which worked for him but was not as fast
echo as Wioski. This system is essentially a hybrid of those two, which still
echo is implemeted entirely with Windows CMD shell scripts.
echo.
echo If you're here to update your Windows "master" template (C:\image.vhd) be
echo sure you see a "last booted" filename below. If you do, updating the base
echo image.vhd to keep any changes that were made to the system while logged
echo into Windows last time is as simple as running:
echo.
echo merge
echo.
echo Reboot once merge is done by typing exit at the command prompt or simply
echo close the command window. WinPE is ONLY required for setup and merge now,
echo and it will always restart to a pristine, rolled back state automatically
echo if the system shutdown script (newBcD.cmd) created by Thomas is used.
echo.
echo You may Contact Thomas Freedman on http://reboot.pro/ (user thomnet) or
echo Mark Minasi at [email protected] or http://www.steadierstate.com/. We hope
echo you find this useful!
echo =========================================================================
echo.
echo WinPE-SS on %peDrive%, VHD files on %vhdDrive% and last VHD booted: %lastVHD%
echo.
goto :EOF
:iniError
call :showshell
set /A errorlevel=%errorlevel% + 1
echo ************************************************************************
echo An error occurred setting the values from the ini file. (exit code: %errorlevel%)
echo ************************************************************************
goto :msgOut
:guidError
call :showshell
set /A errorlevel=%errorlevel% + 2
echo.
echo ************************************************************************
echo I found the %ini% file, but it doesn't contain valid data
echo (it failed GUID validation checks). There's not much I can do until this
echo is fixed. Bye! (exit code: %errorlevel%)
echo ************************************************************************
goto :msgOut
:missingINI
call :showshell
set /A errorlevel=%errorlevel% + 4
echo.
echo ************************************************************************
echo I can't find %ini% so I can't provide any information
echo about Steadier State on your system. Maybe you're in the initial stages
echo of setting your system up for Steadier State, or perhaps this is the 1st
echo time to run this script. However you found yourself here, you need to
echo resolve this error, which may simply be a matter of completing the setup
echo process. (exit code: %errorlevel%)
echo ************************************************************************
goto :msgOut
:notWinPEss
call :showshell
set /A errorlevel=%errorlevel% + 8
echo.
echo ************************************************************************
echo You don't appear to be running the WinPE-SS customized for use with
echo Steadier State as I don't see a specific file that should be there.
echo Is this the correct media? Not much I can do. Bye! (exit code: %errorlevel%)
echo ************************************************************************
:msgOut
goto :theExit
:: **** functions *************************************************************
:: "library" There are techniques whereby the following functions could be
:: included or imported into this batch as an external library,
:: however its a substantial amount of overhead for 3 functions.
:: Never-the-less, it is not optimal to have to maintain changes
:: to these functions in all of the places that use them.
:validateGUID -- Validate the input is a valid GUID ---------------------------
:: 1) Is length of string == 38 characters?
:: 2) Are the characters in it valid?
:: 3) Is the GUID enclosed in braces?
:: 4) Is the hyphen spacing correct?
:: Parameters:
:: -- %~1: Name of the variable with GUID (not the GUID value)
:: -- %~2: Name of variable to return results in
:: Returns:
:: -- 0 for a valid GUID and -1 for an invalid GUID
set /A valid= -1
call :strlen %1 length 38
if NOT %length% == 38 goto :returnValidity
for /F "delims={0123456789-ABCDEFabcdef}" %%A in ("!%~1!") do goto :returnValidity
set pattern="!%~1:~0,1!!%~1:~9,1!!%~1:~14,1!!%~1:~19,1!!%~1:~24,1!!%~1:~37,1!"
if NOT %pattern%=="{----}" goto :returnValidity
set /A valid= 0
:returnValidity
if "%~2" NEQ "" set /A %~2= %valid%
goto :EOF
:strlen -------- Find the length of a string ----------------------------------
:: Parameters:
:: -- %~1: The name of the variable (not the string value)
:: -- %~2: Name of variable to return results in
:: -- %~3: The maximum anticipated string length value (not ref)
:: Returns:
:: -- the string length or -1 for an invalid string or one
:: that exceeds the maximum length parameter
for /L %%L in (1,1,%3) do (
if "!%1!" == "!%1:~0,%%L!" set %2=%%L && goto :EOF
)
if "%~2" NEQ "" set /A %~2= -1
goto :EOF
:chkReady ------ Determine if a drive is active -------------------------------
:: Parameters:
:: -- %~1: The drive to be checked (value not reference)
:: -- %~2: Name of variable to return results in
:: Returns:
:: -- true if the drive is active, false if missing or not ready
set result=false
dir %~1 1>NUL 2>&1 || goto :returnResult
set result=true
:returnResult
if "%~2" NEQ "" set %~2=%result%
goto :EOF
:theExit