VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Installer/VBoxGuestAdditionsCommon.nsh@ 38876

Last change on this file since 38876 was 38751, checked in by vboxsync, 13 years ago

Windows Additions: hack Windows 8

  • Property svn:eol-style set to native
File size: 14.3 KB
Line 
1; $Id: $
2;; @file
3; VBoxGuestAdditionsCommon.nsh - Common / shared utility functions.
4;
5
6;
7; Copyright (C) 2006-2011 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17
18!ifndef UNINSTALLER_ONLY
19Function ExtractFiles
20
21 ; @todo: Use a define for all the file specs to group the files per module
22 ; and keep the redundancy low
23
24 Push $0
25 StrCpy "$0" "$INSTDIR\$%BUILD_TARGET_ARCH%"
26
27 ; Root files
28 SetOutPath "$0"
29!if $%VBOX_WITH_LICENSE_INSTALL_RTF% == "1"
30 FILE "/oname=${LICENSE_FILE_RTF}" "$%VBOX_BRAND_LICENSE_RTF%"
31!endif
32
33 ; Video driver
34 SetOutPath "$0\VBoxVideo"
35 FILE "$%PATH_OUT%\bin\additions\VBoxVideo.sys"
36 FILE "$%PATH_OUT%\bin\additions\VBoxVideo.inf"
37!ifdef VBOX_SIGN_ADDITIONS
38 FILE "$%PATH_OUT%\bin\additions\VBoxVideo.cat"
39!endif
40 FILE "$%PATH_OUT%\bin\additions\VBoxDisp.dll"
41
42!if $%VBOX_WITH_CROGL% == "1"
43 ; crOpenGL
44 FILE "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu.dll"
45 FILE "$%PATH_OUT%\bin\additions\VBoxOGLcrutil.dll"
46 FILE "$%PATH_OUT%\bin\additions\VBoxOGLerrorspu.dll"
47 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpackspu.dll"
48 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpassthroughspu.dll"
49 FILE "$%PATH_OUT%\bin\additions\VBoxOGLfeedbackspu.dll"
50 FILE "$%PATH_OUT%\bin\additions\VBoxOGL.dll"
51
52 SetOutPath "$0\VBoxVideo\OpenGL"
53 FILE "$%PATH_OUT%\bin\additions\d3d8.dll"
54 FILE "$%PATH_OUT%\bin\additions\d3d9.dll"
55 !if $%BUILD_TARGET_ARCH% == "x86"
56 ; libWine is used for 32bit d3d only
57 ; @todo: remove it for 32bit as well
58 FILE "$%PATH_OUT%\bin\additions\libWine.dll"
59 !endif
60 FILE "$%PATH_OUT%\bin\additions\VBoxD3D8.dll"
61 FILE "$%PATH_OUT%\bin\additions\VBoxD3D9.dll"
62 FILE "$%PATH_OUT%\bin\additions\wined3d.dll"
63
64 !if $%BUILD_TARGET_ARCH% == "amd64"
65 ; Only 64-bit installer: Also copy 32-bit DLLs on 64-bit target
66 SetOutPath "$0\VBoxVideo\OpenGL\SysWow64"
67 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\d3d8.dll"
68 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\d3d9.dll"
69 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\libWine.dll"
70 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLarrayspu.dll"
71 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLcrutil.dll"
72 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLerrorspu.dll"
73 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLpackspu.dll"
74 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLpassthroughspu.dll"
75 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLfeedbackspu.dll"
76 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGL.dll"
77 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxD3D8.dll"
78 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxD3D9.dll"
79 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\wined3d.dll"
80 !endif
81!endif
82
83!if $%VBOX_WITH_WDDM% == "1"
84 ; WDDM Video driver
85 SetOutPath "$0\VBoxVideoWddm"
86
87 !ifdef VBOX_SIGN_ADDITIONS
88 FILE "$%PATH_OUT%\bin\additions\VBoxVideoWddm.cat"
89 !endif
90 FILE "$%PATH_OUT%\bin\additions\VBoxVideoWddm.sys"
91 FILE "$%PATH_OUT%\bin\additions\VBoxVideoWddm.inf"
92 FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D.dll"
93
94 !if $%VBOX_WITH_CROGL% == "1"
95 FILE "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu.dll"
96 FILE "$%PATH_OUT%\bin\additions\VBoxOGLcrutil.dll"
97 FILE "$%PATH_OUT%\bin\additions\VBoxOGLerrorspu.dll"
98 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpackspu.dll"
99 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpassthroughspu.dll"
100 FILE "$%PATH_OUT%\bin\additions\VBoxOGLfeedbackspu.dll"
101 FILE "$%PATH_OUT%\bin\additions\VBoxOGL.dll"
102
103 FILE "$%PATH_OUT%\bin\additions\VBoxD3D9wddm.dll"
104 FILE "$%PATH_OUT%\bin\additions\wined3dwddm.dll"
105 !endif ; $%VBOX_WITH_CROGL% == "1"
106
107 !if $%BUILD_TARGET_ARCH% == "amd64"
108 FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D-x86.dll"
109
110 !if $%VBOX_WITH_CROGL% == "1"
111 FILE "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu-x86.dll"
112 FILE "$%PATH_OUT%\bin\additions\VBoxOGLcrutil-x86.dll"
113 FILE "$%PATH_OUT%\bin\additions\VBoxOGLerrorspu-x86.dll"
114 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpackspu-x86.dll"
115 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpassthroughspu-x86.dll"
116 FILE "$%PATH_OUT%\bin\additions\VBoxOGLfeedbackspu-x86.dll"
117 FILE "$%PATH_OUT%\bin\additions\VBoxOGL-x86.dll"
118
119 FILE "$%PATH_OUT%\bin\additions\VBoxD3D9wddm-x86.dll"
120 FILE "$%PATH_OUT%\bin\additions\wined3dwddm-x86.dll"
121 !endif ; $%VBOX_WITH_CROGL% == "1"
122 !endif ; $%BUILD_TARGET_ARCH% == "amd64"
123!endif ; $%VBOX_WITH_WDDM% == "1"
124
125 ; Mouse driver
126 SetOutPath "$0\VBoxMouse"
127 FILE "$%PATH_OUT%\bin\additions\VBoxMouse.sys"
128 FILE "$%PATH_OUT%\bin\additions\VBoxMouse.inf"
129!ifdef VBOX_SIGN_ADDITIONS
130 FILE "$%PATH_OUT%\bin\additions\VBoxMouse.cat"
131!endif
132
133!if $%BUILD_TARGET_ARCH% == "x86"
134 SetOutPath "$0\VBoxMouse\NT4"
135 FILE "$%PATH_OUT%\bin\additions\VBoxMouseNT.sys"
136!endif
137
138 ; Guest driver
139 SetOutPath "$0\VBoxGuest"
140 FILE "$%PATH_OUT%\bin\additions\VBoxGuest.sys"
141 FILE "$%PATH_OUT%\bin\additions\VBoxGuest.inf"
142!ifdef VBOX_SIGN_ADDITIONS
143 FILE "$%PATH_OUT%\bin\additions\VBoxGuest.cat"
144!endif
145 FILE "$%PATH_OUT%\bin\additions\VBoxTray.exe"
146 FILE "$%PATH_OUT%\bin\additions\VBoxHook.dll"
147 FILE "$%PATH_OUT%\bin\additions\VBoxControl.exe"
148
149!if $%BUILD_TARGET_ARCH% == "x86"
150 SetOutPath "$0\VBoxGuest\NT4"
151 FILE "$%PATH_OUT%\bin\additions\VBoxGuestNT.sys"
152!endif
153
154 ; VBoxService
155 SetOutPath "$0\Bin"
156 FILE "$%PATH_OUT%\bin\additions\VBoxService.exe"
157!if $%BUILD_TARGET_ARCH% == "x86"
158 FILE "$%PATH_OUT%\bin\additions\VBoxServiceNT.exe"
159!endif
160
161 ; Shared Folders
162 SetOutPath "$0\VBoxSF"
163 FILE "$%PATH_OUT%\bin\additions\VBoxSF.sys"
164 FILE "$%PATH_OUT%\bin\additions\VBoxMRXNP.dll"
165
166 ; Auto-Logon
167 SetOutPath "$0\AutoLogon"
168 FILE "$%PATH_OUT%\bin\additions\VBoxGINA.dll"
169 FILE "$%PATH_OUT%\bin\additions\VBoxCredProv.dll"
170
171 ; Misc tools
172 SetOutPath "$0\Tools"
173 FILE "$%PATH_OUT%\bin\additions\VBoxDrvInst.exe"
174 FILE "$%VBOX_PATH_DIFX%\DIFxAPI.dll"
175
176!if $%BUILD_TARGET_ARCH% == "x86"
177 SetOutPath "$0\Tools\NT4"
178 FILE "$%PATH_OUT%\bin\additions\VBoxGuestDrvInst.exe"
179 FILE "$%PATH_OUT%\bin\additions\RegCleanup.exe"
180!endif
181
182 Pop $0
183
184FunctionEnd
185!endif ; UNINSTALLER_ONLY
186
187!macro EnableLog un
188Function ${un}EnableLog
189
190!ifdef _DEBUG
191 Goto log
192!endif
193
194 StrCmp $g_bLogEnable "true" log
195 Goto exit
196
197log:
198
199 LogSet on
200 LogText "Start logging."
201
202exit:
203
204FunctionEnd
205!macroend
206!insertmacro EnableLog ""
207!insertmacro EnableLog "un."
208
209!macro WriteLogUI un
210Function ${un}WriteLogUI
211
212 IfSilent exit
213
214!ifdef _DEBUG
215 Goto log
216!endif
217
218 StrCmp $g_bLogEnable "true" log
219 Goto exit
220
221log:
222
223 ; Dump log to see what happened
224 StrCpy $0 "$INSTDIR\${un}install_ui.log"
225 Push $0
226 Call ${un}DumpLog
227
228exit:
229
230FunctionEnd
231!macroend
232!insertmacro WriteLogUI ""
233!insertmacro WriteLogUI "un."
234
235!macro WriteLogVBoxTray un
236Function ${un}WriteLogVBoxTray
237
238 ; Pop function parameters off the stack
239 ; in reverse order
240 Exch $1 ; Message type (0=Info, 1=Warning, 2=Error)
241 Exch
242 Exch $0 ; Body string
243
244 ; @todo Add more paramters here!
245!if $%VBOX_WITH_GUEST_INSTALL_HELPER% == "1"
246 ${If} $g_bPostInstallStatus == "true"
247 ; Parameters:
248 ; - String: Description / Body
249 ; - String: Title / Name of application
250 ; - Integer: Type of message: 0 (Info), 1 (Warning), 2 (Error)
251 ; - Integer: Time (in msec) to show the notification
252 VBoxGuestInstallHelper::VBoxTrayShowBallonMsg "$0" "VirtualBox Guest Additions Setup" $1 5000
253 Pop $0 ; Get return value (ignored for now)
254 ${EndIf}
255!endif
256 Pop $0
257 Pop $1
258
259FunctionEnd
260!macroend
261!insertmacro WriteLogVBoxTray ""
262!insertmacro WriteLogVBoxTray "un."
263
264!macro CheckArchitecture un
265Function ${un}CheckArchitecture
266
267 Push $0
268
269 System::Call "kernel32::GetCurrentProcess() i .s"
270 System::Call "kernel32::IsWow64Process(i s, *i .r0)"
271 ; R0 now contains 1 if we're a 64-bit process, or 0 if not
272
273!if $%BUILD_TARGET_ARCH% == "amd64"
274 IntCmp $0 0 wrong_platform
275!else ; 32-bit
276 IntCmp $0 1 wrong_platform
277!endif
278
279 Push 0
280 Goto exit
281
282wrong_platform:
283
284 Push 1
285 Goto exit
286
287exit:
288
289FunctionEnd
290!macroend
291!insertmacro CheckArchitecture ""
292!insertmacro CheckArchitecture "un."
293
294!macro GetWindowsVer un
295Function ${un}GetWindowsVer
296
297 ; Check if we are running on w2k or above
298 ; For other windows versions (>XP) it may be necessary to change winver.nsh
299 Call ${un}GetWindowsVersion
300 Pop $R3 ; Windows Version
301
302 Push $R3 ; The windows version string
303 Push "NT" ; String to search for. Win 2k family returns no string containing 'NT'
304 Call ${un}StrStr
305 Pop $R0
306 StrCmp $R0 '' nt5plus ; Not NT 3.XX or 4.XX
307
308 ; Ok we know it is NT. Must be a string like NT X.XX
309 Push $R3 ; The windows version string
310 Push "4." ; String to search for
311 Call ${un}StrStr
312 Pop $R0
313 StrCmp $R0 "" nt5plus nt4 ; If empty -> not NT 4
314
315nt5plus: ; Windows 2000+ (XP, Vista, ...)
316
317 StrCpy $g_strWinVersion $R3
318 goto exit
319
320nt4: ; NT 4.0
321
322 StrCpy $g_strWinVersion "NT4"
323 goto exit
324
325exit:
326
327FunctionEnd
328!macroend
329!insertmacro GetWindowsVer ""
330!insertmacro GetWindowsVer "un."
331
332!macro GetAdditionsVersion un
333Function ${un}GetAdditionsVersion
334
335 Push $0
336 Push $1
337
338 ; Get additions version
339 ReadRegStr $0 HKLM "SOFTWARE\$%VBOX_VENDOR_SHORT%\VirtualBox Guest Additions" "Version"
340
341 ; Get revision
342 ReadRegStr $g_strAddVerRev HKLM "SOFTWARE\$%VBOX_VENDOR_SHORT%\VirtualBox Guest Additions" "Revision"
343
344 ; Extract major version
345 Push "$0" ; String
346 Push "." ; SubString
347 Push ">" ; SearchDirection
348 Push "<" ; StrInclusionDirection
349 Push "0" ; IncludeSubString
350 Push "0" ; Loops
351 Push "0" ; CaseSensitive
352 Call ${un}StrStrAdv
353 Pop $g_strAddVerMaj
354
355 ; Extract minor version
356 Push "$0" ; String
357 Push "." ; SubString
358 Push ">" ; SearchDirection
359 Push ">" ; StrInclusionDirection
360 Push "0" ; IncludeSubString
361 Push "0" ; Loops
362 Push "0" ; CaseSensitive
363 Call ${un}StrStrAdv
364 Pop $1 ; Got first part (e.g. "1.5")
365
366 Push "$1" ; String
367 Push "." ; SubString
368 Push ">" ; SearchDirection
369 Push "<" ; StrInclusionDirection
370 Push "0" ; IncludeSubString
371 Push "0" ; Loops
372 Push "0" ; CaseSensitive
373 Call ${un}StrStrAdv
374 Pop $g_strAddVerMin ; Extracted second part (e.g. "5" from "1.5")
375
376 ; Extract build number
377 Push "$0" ; String
378 Push "." ; SubString
379 Push "<" ; SearchDirection
380 Push ">" ; StrInclusionDirection
381 Push "0" ; IncludeSubString
382 Push "0" ; Loops
383 Push "0" ; CaseSensitive
384 Call ${un}StrStrAdv
385 Pop $g_strAddVerBuild
386
387exit:
388
389 Pop $1
390 Pop $0
391
392FunctionEnd
393!macroend
394!insertmacro GetAdditionsVersion ""
395!insertmacro GetAdditionsVersion "un."
396
397!macro StopVBoxService un
398Function ${un}StopVBoxService
399
400 Push $0 ; Temp results
401 Push $1
402 Push $2 ; Image name of VBoxService
403 Push $3 ; Safety counter
404
405 StrCpy $3 "0" ; Init counter
406 DetailPrint "Stopping VBoxService ..."
407
408svc_stop:
409
410 LogText "Stopping VBoxService (as service) ..."
411 ${If} $g_strWinVersion == "NT4"
412 nsExec::Exec '"$SYSDIR\net.exe" stop VBoxService'
413 ${Else}
414 nsExec::Exec '"$SYSDIR\SC.exe" stop VBoxService'
415 ${EndIf}
416 Sleep "1000" ; Wait a bit
417
418exe_stop:
419
420!ifdef _DEBUG
421 DetailPrint "Stopping VBoxService (as exe) ..."
422!endif
423
424exe_stop_loop:
425
426 IntCmp $3 10 exit ; Only try this loop 10 times max
427 IntOp $3 $3 + 1 ; Increment
428
429 LogText "Try: $3"
430
431 ${If} $g_strWinVersion == "NT4"
432 StrCpy $2 "VBoxServiceNT.exe"
433 ${Else}
434 StrCpy $2 "VBoxService.exe"
435 ${EndIf}
436
437 ${nsProcess::FindProcess} $2 $0
438 StrCmp $0 0 0 exit
439
440 ${nsProcess::KillProcess} $2 $0
441 Sleep "1000" ; Wait a bit
442 Goto exe_stop_loop
443
444exit:
445
446 DetailPrint "Stopping VBoxService done."
447
448 Pop $3
449 Pop $2
450 Pop $1
451 Pop $0
452
453FunctionEnd
454!macroend
455!insertmacro StopVBoxService ""
456!insertmacro StopVBoxService "un."
457
458!macro StopVBoxTray un
459Function ${un}StopVBoxTray
460
461 Push $0 ; Temp results
462 Push $1 ; Safety counter
463
464 StrCpy $1 "0" ; Init counter
465 DetailPrint "Stopping VBoxTray ..."
466
467exe_stop:
468
469 IntCmp $1 10 exit ; Only try this loop 10 times max
470 IntOp $1 $1 + 1 ; Increment
471
472 ${nsProcess::FindProcess} "VBoxTray.exe" $0
473 StrCmp $0 0 0 exit
474
475 ${nsProcess::KillProcess} "VBoxTray.exe" $0
476 Sleep "1000" ; Wait a bit
477 Goto exe_stop
478
479exit:
480
481 DetailPrint "Stopping VBoxTray done."
482
483 Pop $1
484 Pop $0
485
486FunctionEnd
487!macroend
488!insertmacro StopVBoxTray ""
489!insertmacro StopVBoxTray "un."
490
491!macro WriteRegBinR ROOT KEY NAME VALUE
492 WriteRegBin "${ROOT}" "${KEY}" "${NAME}" "${VALUE}"
493!macroend
494
495!macro AbortShutdown un
496Function ${un}AbortShutdown
497
498 Push $0
499
500 ; Try to abort the shutdown
501 nsExec::ExecToLog '"$g_strSystemDir\shutdown.exe" -a' $0
502
503 Pop $0
504
505FunctionEnd
506!macroend
507!insertmacro AbortShutdown ""
508!insertmacro AbortShutdown "un."
509
510!macro CheckForWDDMCapability un
511Function ${un}CheckForWDDMCapability
512
513!if $%VBOX_WITH_WDDM% == "1"
514 ; If we're on a 32-bit Windows Vista / 7 we can use the WDDM driver
515 ${If} $g_strWinVersion == "Vista"
516 ${OrIf} $g_strWinVersion == "7"
517 ${OrIf} $g_strWinVersion == "8"
518 StrCpy $g_bCapWDDM "true"
519 ${EndIf}
520!endif
521
522FunctionEnd
523!macroend
524!insertmacro CheckForWDDMCapability ""
525!insertmacro CheckForWDDMCapability "un."
526
527!macro CheckForCapabilities un
528Function ${un}CheckForCapabilities
529
530 Push $0
531
532 ; Retrieve system mode and store result in
533 System::Call 'user32::GetSystemMetrics(i ${SM_CLEANBOOT}) i .r0'
534 StrCpy $g_iSystemMode $0
535
536 ; Check whether this OS is capable of handling WDDM drivers
537 Call ${un}CheckForWDDMCapability
538
539 Pop $0
540
541FunctionEnd
542!macroend
543!insertmacro CheckForCapabilities ""
544!insertmacro CheckForCapabilities "un."
545
546; Switches (back) the path + registry view to
547; 32-bit mode (SysWOW64) on 64-bit guests
548!macro SetAppMode32 un
549Function ${un}SetAppMode32
550 !if $%BUILD_TARGET_ARCH% == "amd64"
551 ${EnableX64FSRedirection}
552 SetRegView 32
553 !endif
554FunctionEnd
555!macroend
556!insertmacro SetAppMode32 ""
557!insertmacro SetAppMode32 "un."
558
559; Because this NSIS installer is always built in 32-bit mode, we have to
560; do some tricks for the Windows paths + registry on 64-bit guests
561!macro SetAppMode64 un
562Function ${un}SetAppMode64
563 !if $%BUILD_TARGET_ARCH% == "amd64"
564 ${DisableX64FSRedirection}
565 SetRegView 64
566 !endif
567FunctionEnd
568!macroend
569!insertmacro SetAppMode64 ""
570!insertmacro SetAppMode64 "un."
571
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette