VirtualBox

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

Last change on this file since 70171 was 70164, checked in by vboxsync, 7 years ago

Additions: No more VBoxGuestNT.sys; NT uses the same driver build as the rest now.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 32.1 KB
Line 
1; $Id: VBoxGuestAdditionsCommon.nsh 70164 2017-12-15 17:32:56Z vboxsync $
2;; @file
3; VBoxGuestAdditionsCommon.nsh - Common / shared utility functions.
4;
5
6;
7; Copyright (C) 2006-2017 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
18Function Common_CopyFiles
19
20 SetOutPath "$INSTDIR"
21 SetOverwrite on
22
23!ifdef VBOX_WITH_LICENSE_INSTALL_RTF
24 ; Copy license file (if any) into the installation directory
25 FILE "/oname=${LICENSE_FILE_RTF}" "$%VBOX_BRAND_LICENSE_RTF%"
26!endif
27
28 FILE "$%VBOX_PATH_DIFX%\DIFxAPI.dll"
29 FILE "$%PATH_OUT%\bin\additions\VBoxDrvInst.exe"
30
31 FILE "$%PATH_OUT%\bin\additions\VBoxVideo.inf"
32!ifdef VBOX_SIGN_ADDITIONS
33 FILE "$%PATH_OUT%\bin\additions\VBoxVideo.cat"
34!endif
35
36 FILE "iexplore.ico"
37
38FunctionEnd
39
40!ifndef UNINSTALLER_ONLY
41Function ExtractFiles
42
43 ; @todo: Use a define for all the file specs to group the files per module
44 ; and keep the redundancy low
45
46 Push $0
47 StrCpy "$0" "$INSTDIR\$%BUILD_TARGET_ARCH%"
48
49 ; Root files
50 SetOutPath "$0"
51!if $%VBOX_WITH_LICENSE_INSTALL_RTF% == "1"
52 FILE "/oname=${LICENSE_FILE_RTF}" "$%VBOX_BRAND_LICENSE_RTF%"
53!endif
54
55 ; Video driver
56 SetOutPath "$0\VBoxVideo"
57 FILE "$%PATH_OUT%\bin\additions\VBoxVideo.sys"
58 FILE "$%PATH_OUT%\bin\additions\VBoxVideo.inf"
59!ifdef VBOX_SIGN_ADDITIONS
60 FILE "$%PATH_OUT%\bin\additions\VBoxVideo.cat"
61!endif
62 FILE "$%PATH_OUT%\bin\additions\VBoxDisp.dll"
63
64!if $%VBOX_WITH_CROGL% == "1"
65 ; crOpenGL
66 FILE "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu.dll"
67 FILE "$%PATH_OUT%\bin\additions\VBoxOGLcrutil.dll"
68 FILE "$%PATH_OUT%\bin\additions\VBoxOGLerrorspu.dll"
69 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpackspu.dll"
70 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpassthroughspu.dll"
71 FILE "$%PATH_OUT%\bin\additions\VBoxOGLfeedbackspu.dll"
72 FILE "$%PATH_OUT%\bin\additions\VBoxOGL.dll"
73
74 SetOutPath "$0\VBoxVideo\OpenGL"
75 FILE "$%PATH_OUT%\bin\additions\d3d8.dll"
76 FILE "$%PATH_OUT%\bin\additions\d3d9.dll"
77 FILE "$%PATH_OUT%\bin\additions\VBoxD3D8.dll"
78 FILE "$%PATH_OUT%\bin\additions\VBoxD3D9.dll"
79 FILE "$%PATH_OUT%\bin\additions\wined3d.dll"
80
81 !if $%BUILD_TARGET_ARCH% == "amd64"
82 ; Only 64-bit installer: Also copy 32-bit DLLs on 64-bit target
83 SetOutPath "$0\VBoxVideo\OpenGL\SysWow64"
84 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\d3d8.dll"
85 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\d3d9.dll"
86 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLarrayspu.dll"
87 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLcrutil.dll"
88 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLerrorspu.dll"
89 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLpackspu.dll"
90 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLpassthroughspu.dll"
91 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGLfeedbackspu.dll"
92 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxOGL.dll"
93 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxD3D8.dll"
94 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\VBoxD3D9.dll"
95 FILE "$%VBOX_PATH_ADDITIONS_WIN_X86%\wined3d.dll"
96 !endif
97!endif
98
99!if $%VBOX_WITH_WDDM% == "1"
100 ; WDDM Video driver for Vista and 7
101 SetOutPath "$0\VBoxVideoWddm"
102
103 !ifdef VBOX_SIGN_ADDITIONS
104 FILE "$%PATH_OUT%\bin\additions\VBoxVideoWddm.cat"
105 !endif
106 FILE "$%PATH_OUT%\bin\additions\VBoxVideoWddm.sys"
107 FILE "$%PATH_OUT%\bin\additions\VBoxVideoWddm.inf"
108 FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D.dll"
109
110 !if $%VBOX_WITH_CROGL% == "1"
111 FILE "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu.dll"
112 FILE "$%PATH_OUT%\bin\additions\VBoxOGLcrutil.dll"
113 FILE "$%PATH_OUT%\bin\additions\VBoxOGLerrorspu.dll"
114 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpackspu.dll"
115 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpassthroughspu.dll"
116 FILE "$%PATH_OUT%\bin\additions\VBoxOGLfeedbackspu.dll"
117 FILE "$%PATH_OUT%\bin\additions\VBoxOGL.dll"
118
119 FILE "$%PATH_OUT%\bin\additions\VBoxD3D9wddm.dll"
120 FILE "$%PATH_OUT%\bin\additions\wined3dwddm.dll"
121 !endif ; $%VBOX_WITH_CROGL% == "1"
122
123 !if $%BUILD_TARGET_ARCH% == "amd64"
124 FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D-x86.dll"
125
126 !if $%VBOX_WITH_CROGL% == "1"
127 FILE "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu-x86.dll"
128 FILE "$%PATH_OUT%\bin\additions\VBoxOGLcrutil-x86.dll"
129 FILE "$%PATH_OUT%\bin\additions\VBoxOGLerrorspu-x86.dll"
130 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpackspu-x86.dll"
131 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpassthroughspu-x86.dll"
132 FILE "$%PATH_OUT%\bin\additions\VBoxOGLfeedbackspu-x86.dll"
133 FILE "$%PATH_OUT%\bin\additions\VBoxOGL-x86.dll"
134
135 FILE "$%PATH_OUT%\bin\additions\VBoxD3D9wddm-x86.dll"
136 FILE "$%PATH_OUT%\bin\additions\wined3dwddm-x86.dll"
137 !endif ; $%VBOX_WITH_CROGL% == "1"
138 !endif ; $%BUILD_TARGET_ARCH% == "amd64"
139
140 !if $%VBOX_WITH_WDDM_W8% == "1"
141 ; WDDM Video driver for Win8
142 SetOutPath "$0\VBoxVideoW8"
143
144 !ifdef VBOX_SIGN_ADDITIONS
145 FILE "$%PATH_OUT%\bin\additions\VBoxVideoW8.cat"
146 !endif
147 FILE "$%PATH_OUT%\bin\additions\VBoxVideoW8.sys"
148 FILE "$%PATH_OUT%\bin\additions\VBoxVideoW8.inf"
149 FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D.dll"
150
151 !if $%VBOX_WITH_CROGL% == "1"
152 FILE "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu.dll"
153 FILE "$%PATH_OUT%\bin\additions\VBoxOGLcrutil.dll"
154 FILE "$%PATH_OUT%\bin\additions\VBoxOGLerrorspu.dll"
155 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpackspu.dll"
156 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpassthroughspu.dll"
157 FILE "$%PATH_OUT%\bin\additions\VBoxOGLfeedbackspu.dll"
158 FILE "$%PATH_OUT%\bin\additions\VBoxOGL.dll"
159
160 FILE "$%PATH_OUT%\bin\additions\VBoxD3D9wddm.dll"
161 FILE "$%PATH_OUT%\bin\additions\wined3dwddm.dll"
162 !endif ; $%VBOX_WITH_CROGL% == "1"
163
164 !if $%BUILD_TARGET_ARCH% == "amd64"
165 FILE "$%PATH_OUT%\bin\additions\VBoxDispD3D-x86.dll"
166
167 !if $%VBOX_WITH_CROGL% == "1"
168 FILE "$%PATH_OUT%\bin\additions\VBoxOGLarrayspu-x86.dll"
169 FILE "$%PATH_OUT%\bin\additions\VBoxOGLcrutil-x86.dll"
170 FILE "$%PATH_OUT%\bin\additions\VBoxOGLerrorspu-x86.dll"
171 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpackspu-x86.dll"
172 FILE "$%PATH_OUT%\bin\additions\VBoxOGLpassthroughspu-x86.dll"
173 FILE "$%PATH_OUT%\bin\additions\VBoxOGLfeedbackspu-x86.dll"
174 FILE "$%PATH_OUT%\bin\additions\VBoxOGL-x86.dll"
175
176 FILE "$%PATH_OUT%\bin\additions\VBoxD3D9wddm-x86.dll"
177 FILE "$%PATH_OUT%\bin\additions\wined3dwddm-x86.dll"
178 !endif ; $%VBOX_WITH_CROGL% == "1"
179 !endif ; $%BUILD_TARGET_ARCH% == "amd64"
180 !endif ; $%VBOX_WITH_WDDM_W8% == "1"
181!endif ; $%VBOX_WITH_WDDM% == "1"
182
183 ; Mouse driver
184 SetOutPath "$0\VBoxMouse"
185 FILE "$%PATH_OUT%\bin\additions\VBoxMouse.sys"
186 FILE "$%PATH_OUT%\bin\additions\VBoxMouse.inf"
187!ifdef VBOX_SIGN_ADDITIONS
188 FILE "$%PATH_OUT%\bin\additions\VBoxMouse.cat"
189!endif
190
191!if $%BUILD_TARGET_ARCH% == "x86"
192 SetOutPath "$0\VBoxMouse\NT4"
193 FILE "$%PATH_OUT%\bin\additions\VBoxMouseNT.sys"
194!endif
195
196 ; Guest driver
197 SetOutPath "$0\VBoxGuest"
198 FILE "$%PATH_OUT%\bin\additions\VBoxGuest.sys"
199 FILE "$%PATH_OUT%\bin\additions\VBoxGuest.inf"
200!ifdef VBOX_SIGN_ADDITIONS
201 FILE "$%PATH_OUT%\bin\additions\VBoxGuest.cat"
202!endif
203 FILE "$%PATH_OUT%\bin\additions\VBoxTray.exe"
204 FILE "$%PATH_OUT%\bin\additions\VBoxHook.dll"
205 FILE "$%PATH_OUT%\bin\additions\VBoxControl.exe"
206
207 ; VBoxService
208 SetOutPath "$0\Bin"
209 FILE "$%PATH_OUT%\bin\additions\VBoxService.exe"
210!if $%BUILD_TARGET_ARCH% == "x86"
211 FILE "$%PATH_OUT%\bin\additions\VBoxServiceNT.exe"
212!endif
213
214 ; Shared Folders
215 SetOutPath "$0\VBoxSF"
216 FILE "$%PATH_OUT%\bin\additions\VBoxSF.sys"
217 FILE "$%PATH_OUT%\bin\additions\VBoxMRXNP.dll"
218 !if $%BUILD_TARGET_ARCH% == "amd64"
219 ; Only 64-bit installer: Also copy 32-bit DLLs on 64-bit target
220 FILE "$%PATH_OUT%\bin\additions\VBoxMRXNP-x86.dll"
221 !endif
222
223 ; Auto-Logon
224 SetOutPath "$0\AutoLogon"
225 FILE "$%PATH_OUT%\bin\additions\VBoxGINA.dll"
226 FILE "$%PATH_OUT%\bin\additions\VBoxCredProv.dll"
227
228 ; Misc tools
229 SetOutPath "$0\Tools"
230 FILE "$%PATH_OUT%\bin\additions\VBoxDrvInst.exe"
231 FILE "$%VBOX_PATH_DIFX%\DIFxAPI.dll"
232
233!if $%BUILD_TARGET_ARCH% == "x86"
234 SetOutPath "$0\Tools\NT4"
235 FILE "$%PATH_OUT%\bin\additions\VBoxGuestDrvInst.exe"
236 FILE "$%PATH_OUT%\bin\additions\RegCleanup.exe"
237!endif
238
239 Pop $0
240
241FunctionEnd
242!endif ; UNINSTALLER_ONLY
243
244!macro CheckArchitecture un
245Function ${un}CheckArchitecture
246
247 Push $0
248
249 System::Call "kernel32::GetCurrentProcess() i .s"
250 System::Call "kernel32::IsWow64Process(i s, *i .r0)"
251 ; R0 now contains 1 if we're a 64-bit process, or 0 if not
252
253!if $%BUILD_TARGET_ARCH% == "amd64"
254 IntCmp $0 0 wrong_platform
255!else ; 32-bit
256 IntCmp $0 1 wrong_platform
257!endif
258
259 Push 0
260 Goto exit
261
262wrong_platform:
263
264 Push 1
265 Goto exit
266
267exit:
268
269FunctionEnd
270!macroend
271!insertmacro CheckArchitecture ""
272!insertmacro CheckArchitecture "un."
273
274;
275; Macro for retrieving the Windows version this installer is running on.
276;
277; @return Stack: Windows version string. Empty on error /
278; if not able to identify.
279;
280!macro GetWindowsVersionEx un
281Function ${un}GetWindowsVersionEx
282
283 Push $0
284 Push $1
285
286 ; Check if we are running on Windows 2000 or above
287 ; For other windows versions (> XP) it may be necessary to change winver.nsh
288 Call ${un}GetWindowsVersion
289 Pop $0 ; Windows Version
290
291 Push $0 ; The windows version string
292 Push "NT" ; String to search for. W2K+ returns no string containing "NT"
293 Call ${un}StrStr
294 Pop $1
295
296 ${If} $1 == "" ; If empty -> not NT 3.XX or 4.XX
297 ; $0 contains the original version string
298 ${Else}
299 ; Ok we know it is NT. Must be a string like NT X.XX
300 Push $0 ; The windows version string
301 Push "4." ; String to search for
302 Call ${un}StrStr
303 Pop $1
304 ${If} $1 == "" ; If empty -> not NT 4
305 ;; @todo NT <= 3.x ?
306 ; $0 contains the original version string
307 ${Else}
308 StrCpy $0 "NT4"
309 ${EndIf}
310 ${EndIf}
311
312 Pop $1
313 Exch $0
314
315FunctionEnd
316!macroend
317!insertmacro GetWindowsVersionEx ""
318!insertmacro GetWindowsVersionEx "un."
319
320!macro GetAdditionsVersion un
321Function ${un}GetAdditionsVersion
322
323 Push $0
324 Push $1
325
326 ; Get additions version
327 ReadRegStr $0 HKLM "SOFTWARE\$%VBOX_VENDOR_SHORT%\VirtualBox Guest Additions" "Version"
328
329 ; Get revision
330 ReadRegStr $g_strAddVerRev HKLM "SOFTWARE\$%VBOX_VENDOR_SHORT%\VirtualBox Guest Additions" "Revision"
331
332 ; Extract major version
333 Push "$0" ; String
334 Push "." ; SubString
335 Push ">" ; SearchDirection
336 Push "<" ; StrInclusionDirection
337 Push "0" ; IncludeSubString
338 Push "0" ; Loops
339 Push "0" ; CaseSensitive
340 Call ${un}StrStrAdv
341 Pop $g_strAddVerMaj
342
343 ; Extract minor version
344 Push "$0" ; String
345 Push "." ; SubString
346 Push ">" ; SearchDirection
347 Push ">" ; StrInclusionDirection
348 Push "0" ; IncludeSubString
349 Push "0" ; Loops
350 Push "0" ; CaseSensitive
351 Call ${un}StrStrAdv
352 Pop $1 ; Got first part (e.g. "1.5")
353
354 Push "$1" ; String
355 Push "." ; SubString
356 Push ">" ; SearchDirection
357 Push "<" ; StrInclusionDirection
358 Push "0" ; IncludeSubString
359 Push "0" ; Loops
360 Push "0" ; CaseSensitive
361 Call ${un}StrStrAdv
362 Pop $g_strAddVerMin ; Extracted second part (e.g. "5" from "1.5")
363
364 ; Extract build number
365 Push "$0" ; String
366 Push "." ; SubString
367 Push "<" ; SearchDirection
368 Push ">" ; StrInclusionDirection
369 Push "0" ; IncludeSubString
370 Push "0" ; Loops
371 Push "0" ; CaseSensitive
372 Call ${un}StrStrAdv
373 Pop $g_strAddVerBuild
374
375exit:
376
377 Pop $1
378 Pop $0
379
380FunctionEnd
381!macroend
382!insertmacro GetAdditionsVersion ""
383!insertmacro GetAdditionsVersion "un."
384
385!macro StopVBoxService un
386Function ${un}StopVBoxService
387
388 Push $0 ; Temp results
389 Push $1
390 Push $2 ; Image name of VBoxService
391 Push $3 ; Safety counter
392
393 StrCpy $3 "0" ; Init counter
394 ${LogVerbose} "Stopping VBoxService ..."
395
396svc_stop:
397
398 ${LogVerbose} "Stopping VBoxService via SCM ..."
399 ${If} $g_strWinVersion == "NT4"
400 nsExec::Exec '"$SYSDIR\net.exe" stop VBoxService'
401 ${Else}
402 nsExec::Exec '"$SYSDIR\SC.exe" stop VBoxService'
403 ${EndIf}
404 Sleep "1000" ; Wait a bit
405
406exe_stop:
407
408!ifdef _DEBUG
409 ${LogVerbose} "Stopping VBoxService (as exe) ..."
410!endif
411
412exe_stop_loop:
413
414 IntCmp $3 10 exit ; Only try this loop 10 times max
415 IntOp $3 $3 + 1 ; Increment
416
417!ifdef _DEBUG
418 ${LogVerbose} "Stopping attempt #$3"
419!endif
420
421 ${If} $g_strWinVersion == "NT4"
422 StrCpy $2 "VBoxServiceNT.exe"
423 ${Else}
424 StrCpy $2 "VBoxService.exe"
425 ${EndIf}
426
427 ${nsProcess::FindProcess} $2 $0
428 StrCmp $0 0 0 exit
429
430 ${nsProcess::KillProcess} $2 $0
431 Sleep "1000" ; Wait a bit
432 Goto exe_stop_loop
433
434exit:
435
436 ${LogVerbose} "Stopping VBoxService done"
437
438 Pop $3
439 Pop $2
440 Pop $1
441 Pop $0
442
443FunctionEnd
444!macroend
445!insertmacro StopVBoxService ""
446!insertmacro StopVBoxService "un."
447
448!macro StopVBoxTray un
449Function ${un}StopVBoxTray
450
451 Push $0 ; Temp results
452 Push $1 ; Safety counter
453
454 StrCpy $1 "0" ; Init counter
455 ${LogVerbose} "Stopping VBoxTray ..."
456
457exe_stop:
458
459 IntCmp $1 10 exit ; Only try this loop 10 times max
460 IntOp $1 $1 + 1 ; Increment
461
462 ${nsProcess::FindProcess} "VBoxTray.exe" $0
463 StrCmp $0 0 0 exit
464
465 ${nsProcess::KillProcess} "VBoxTray.exe" $0
466 Sleep "1000" ; Wait a bit
467 Goto exe_stop
468
469exit:
470
471 ${LogVerbose} "Stopping VBoxTray done"
472
473 Pop $1
474 Pop $0
475
476FunctionEnd
477!macroend
478!insertmacro StopVBoxTray ""
479!insertmacro StopVBoxTray "un."
480
481!macro StopVBoxMMR un
482Function ${un}StopVBoxMMR
483
484 Push $0 ; Temp results
485 Push $1 ; Safety counter
486
487 StrCpy $1 "0" ; Init counter
488 DetailPrint "Stopping VBoxMMR ..."
489
490exe_stop:
491
492 IntCmp $1 10 exit ; Only try this loop 10 times max
493 IntOp $1 $1 + 1 ; Increment
494
495 ${nsProcess::FindProcess} "VBoxMMR.exe" $0
496 StrCmp $0 0 0 exit
497
498 ${nsProcess::KillProcess} "VBoxMMR.exe" $0
499 Sleep "1000" ; Wait a bit
500 Goto exe_stop
501
502exit:
503
504 DetailPrint "Stopping VBoxMMR done."
505
506 Pop $1
507 Pop $0
508
509FunctionEnd
510!macroend
511!insertmacro StopVBoxMMR ""
512!insertmacro StopVBoxMMR "un."
513
514!macro WriteRegBinR ROOT KEY NAME VALUE
515 WriteRegBin "${ROOT}" "${KEY}" "${NAME}" "${VALUE}"
516!macroend
517
518!macro AbortShutdown un
519Function ${un}AbortShutdown
520
521 ${If} ${FileExists} "$g_strSystemDir\shutdown.exe"
522 ; Try to abort the shutdown
523 ${CmdExecute} "$\"$g_strSystemDir\shutdown.exe$\" -a" "true"
524 ${Else}
525 ${LogVerbose} "Shutting down not supported: Binary $\"$g_strSystemDir\shutdown.exe$\" not found"
526 ${EndIf}
527
528FunctionEnd
529!macroend
530!insertmacro AbortShutdown ""
531!insertmacro AbortShutdown "un."
532
533!macro CheckForWDDMCapability un
534Function ${un}CheckForWDDMCapability
535
536!if $%VBOX_WITH_WDDM% == "1"
537 ; If we're on a 32-bit Windows Vista / 7 / 8 we can use the WDDM driver
538 ${If} $g_strWinVersion == "Vista"
539 ${OrIf} $g_strWinVersion == "7"
540 ${OrIf} $g_strWinVersion == "8"
541 ${OrIf} $g_strWinVersion == "8_1"
542 ${OrIf} $g_strWinVersion == "10"
543 StrCpy $g_bCapWDDM "true"
544 ${LogVerbose} "OS is WDDM driver capable"
545 ${EndIf}
546 ; If we're on Windows 8 we *have* to use the WDDM driver, so select it
547 ; by default
548 ${If} $g_strWinVersion == "8"
549 ${OrIf} $g_strWinVersion == "8_1"
550 ${OrIf} $g_strWinVersion == "10"
551 StrCpy $g_bWithWDDM "true"
552 ${LogVerbose} "OS needs WDDM driver by default"
553 ${EndIf}
554!endif
555
556FunctionEnd
557!macroend
558!insertmacro CheckForWDDMCapability ""
559!insertmacro CheckForWDDMCapability "un."
560
561!macro CheckForCapabilities un
562Function ${un}CheckForCapabilities
563
564 Push $0
565
566 ; Retrieve system mode and store result in
567 System::Call 'user32::GetSystemMetrics(i ${SM_CLEANBOOT}) i .r0'
568 StrCpy $g_iSystemMode $0
569
570 ; Does the guest have a DLL cache?
571 ${If} $g_strWinVersion == "NT4"
572 ${OrIf} $g_strWinVersion == "2000"
573 ${OrIf} $g_strWinVersion == "XP"
574 StrCpy $g_bCapDllCache "true"
575 ${LogVerbose} "OS has a DLL cache"
576 ${EndIf}
577
578 ; Check whether this OS is capable of handling WDDM drivers
579 Call ${un}CheckForWDDMCapability
580
581 Pop $0
582
583FunctionEnd
584!macroend
585!insertmacro CheckForCapabilities ""
586!insertmacro CheckForCapabilities "un."
587
588; Switches (back) the path + registry view to
589; 32-bit mode (SysWOW64) on 64-bit guests
590!macro SetAppMode32 un
591Function ${un}SetAppMode32
592 !if $%BUILD_TARGET_ARCH% == "amd64"
593 ${EnableX64FSRedirection}
594 SetRegView 32
595 !endif
596FunctionEnd
597!macroend
598!insertmacro SetAppMode32 ""
599!insertmacro SetAppMode32 "un."
600
601; Because this NSIS installer is always built in 32-bit mode, we have to
602; do some tricks for the Windows paths + registry on 64-bit guests
603!macro SetAppMode64 un
604Function ${un}SetAppMode64
605 !if $%BUILD_TARGET_ARCH% == "amd64"
606 ${DisableX64FSRedirection}
607 SetRegView 64
608 !endif
609FunctionEnd
610!macroend
611!insertmacro SetAppMode64 ""
612!insertmacro SetAppMode64 "un."
613
614;
615; Retrieves the vendor ("CompanyName" of FILEINFO structure)
616; of a given file.
617; @return Stack: Company name, or "" on error/if not found.
618; @param Stack: File name to retrieve vendor for.
619;
620!macro GetFileVendor un
621Function ${un}GetFileVendor
622
623 ; Preserve values
624 Exch $0 ; Stack: $0 <filename> (Get file name into $0)
625 Push $1
626
627 IfFileExists "$0" found
628 Goto not_found
629
630found:
631
632 VBoxGuestInstallHelper::FileGetVendor "$0"
633 ; Stack: <vendor> $1 $0
634 Pop $0 ; Get vendor
635 Pop $1 ; Restore $1
636 Exch $0 ; Restore $0, push vendor on top of stack
637 Goto end
638
639not_found:
640
641 Pop $1
642 Pop $0
643 Push "File not found"
644 Goto end
645
646end:
647
648FunctionEnd
649!macroend
650!insertmacro GetFileVendor ""
651!insertmacro GetFileVendor "un."
652
653;
654; Retrieves the architecture of a given file.
655; @return Stack: Architecture ("x86", "amd64") or error message.
656; @param Stack: File name to retrieve architecture for.
657;
658!macro GetFileArchitecture un
659Function ${un}GetFileArchitecture
660
661 ; Preserve values
662 Exch $0 ; Stack: $0 <filename> (Get file name into $0)
663 Push $1
664
665 IfFileExists "$0" found
666 Goto not_found
667
668found:
669
670 VBoxGuestInstallHelper::FileGetArchitecture "$0"
671 ; Stack: <architecture> $1 $0
672 Pop $0 ; Get architecture string
673 Pop $1 ; Restore $1
674 Exch $0 ; Restore $0, push vendor on top of stack
675 Goto end
676
677not_found:
678
679 Pop $1
680 Pop $0
681 Push "File not found"
682 Goto end
683
684end:
685
686FunctionEnd
687!macroend
688!insertmacro GetFileArchitecture ""
689!insertmacro GetFileArchitecture "un."
690
691;
692; Verifies a given file by checking its file vendor and target
693; architecture.
694; @return Stack: "0" if valid, "1" if not, "2" on error / not found.
695; @param Stack: Architecture ("x86" or "amd64").
696; @param Stack: Vendor.
697; @param Stack: File name to verify.
698;
699!macro VerifyFile un
700Function ${un}VerifyFile
701
702 ; Preserve values
703 Exch $0 ; File; S: old$0 vendor arch
704 Exch ; S: vendor old$0 arch
705 Exch $1 ; Vendor; S: old$1 old$0 arch
706 Exch ; S: old$0 old$1 arch
707 Exch 2 ; S: arch old$1 old$0
708 Exch $2 ; Architecture; S: old$2 old$1 old$0
709 Push $3 ; S: old$3 old$2 old$1 old$0
710
711 IfFileExists "$0" check_vendor
712 Goto not_found
713
714check_vendor:
715
716 Push $0
717 Call ${un}GetFileVendor
718 Pop $3
719
720 ${If} $3 == $1
721 Goto check_arch
722 ${EndIf}
723 StrCpy $3 "1" ; Invalid
724 Goto end
725
726check_arch:
727
728 Push $0
729 Call ${un}GetFileArchitecture
730 Pop $3
731
732 ${If} $3 == $2
733 StrCpy $3 "0" ; Valid
734 ${Else}
735 StrCpy $3 "1" ; Invalid
736 ${EndIf}
737 Goto end
738
739not_found:
740
741 StrCpy $3 "2" ; Not found
742 Goto end
743
744end:
745
746 ; S: old$3 old$2 old$1 old$0
747 Exch $3 ; S: $3 old$2 old$1 old$0
748 Exch ; S: old$2 $3 old$1
749 Pop $2 ; S: $3 old$1 old$0
750 Exch ; S: old$1 $3 old$0
751 Pop $1 ; S: $3 old$0
752 Exch ; S: old$0 $3
753 Pop $0 ; S: $3
754
755FunctionEnd
756!macroend
757!insertmacro VerifyFile ""
758!insertmacro VerifyFile "un."
759
760;
761; Macro for accessing VerifyFile in a more convenient way by using
762; a parameter list.
763; @return Stack: "0" if valid, "1" if not, "2" on error / not found.
764; @param Un/Installer prefix; either "" or "un".
765; @param Name of file to verify.
766; @param Vendor to check for.
767; @param Architecture ("x86" or "amd64") to check for.
768;
769!macro VerifyFileEx un File Vendor Architecture
770 Push $0
771 Push "${Architecture}"
772 Push "${Vendor}"
773 Push "${File}"
774 ${LogVerbose} "Verifying file $\"${File}$\" ..."
775 Call ${un}VerifyFile
776 Pop $0
777 ${If} $0 == "0"
778 ${LogVerbose} "Verification of file $\"${File}$\" successful (Vendor: ${Vendor}, Architecture: ${Architecture})"
779 ${ElseIf} $0 == "1"
780 ${LogVerbose} "Verification of file $\"${File}$\" failed (not Vendor: ${Vendor}, and/or not Architecture: ${Architecture})"
781 ${Else}
782 ${LogVerbose} "Skipping to file $\"${File}$\"; not found"
783 ${EndIf}
784 ; Push result popped off the stack to stack again
785 Push $0
786!macroend
787!define VerifyFileEx "!insertmacro VerifyFileEx"
788
789;
790; Macro for copying a file only if the source file is verified
791; to be from a certain vendor and architecture.
792; @return Stack: "0" if copied, "1" if not, "2" on error / not found.
793; @param Un/Installer prefix; either "" or "un".
794; @param Name of file to verify and copy to destination.
795; @param Destination name to copy verified file to.
796; @param Vendor to check for.
797; @param Architecture ("x86" or "amd64") to check for.
798;
799!macro CopyFileEx un FileSrc FileDest Vendor Architecture
800 Push $0
801 Push "${Architecture}"
802 Push "${Vendor}"
803 Push "${FileSrc}"
804 Call ${un}VerifyFile
805 Pop $0
806 ${If} $0 == "0"
807 ${LogVerbose} "Copying verified file $\"${FileSrc}$\" to $\"${FileDest}$\" ..."
808 ClearErrors
809 SetOverwrite on
810 CopyFiles /SILENT "${FileSrc}" "${FileDest}"
811 ${If} ${Errors}
812 CreateDirectory "$TEMP\${PRODUCT_NAME}"
813 ${GetFileName} "${FileSrc}" $0 ; Get the base name
814 CopyFiles /SILENT "${FileSrc}" "$TEMP\${PRODUCT_NAME}\$0"
815 ${LogVerbose} "Immediate installation failed, postponing to next reboot (temporary location is: $\"$TEMP\${PRODUCT_NAME}\$0$\") ..."
816 ;${InstallFileEx} "${un}" "${FileSrc}" "${FileDest}" "$TEMP" ; Only works with compile time files!
817 System::Call "kernel32::MoveFileEx(t '$TEMP\${PRODUCT_NAME}\$0', t '${FileDest}', i 5)"
818 ${EndIf}
819 ${Else}
820 ${LogVerbose} "Skipping to copy file $\"${FileSrc}$\" to $\"${FileDest}$\" (not Vendor: ${Vendor}, Architecture: ${Architecture})"
821 ${EndIf}
822 ; Push result popped off the stack to stack again
823 Push $0
824!macroend
825!define CopyFileEx "!insertmacro CopyFileEx"
826
827;
828; Macro for installing a library/DLL.
829; @return Stack: "0" if copied, "1" if not, "2" on error / not found.
830; @param Un/Installer prefix; either "" or "un".
831; @param Name of lib/DLL to copy to destination.
832; @param Destination name to copy the source file to.
833; @param Temporary folder used for exchanging the (locked) lib/DLL after a reboot.
834;
835!macro InstallFileEx un FileSrc FileDest DirTemp
836 ${LogVerbose} "Installing library $\"${FileSrc}$\" to $\"${FileDest}$\" ..."
837 ; Try the gentle way and replace the file instantly
838 !insertmacro InstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED "${FileSrc}" "${FileDest}" "${DirTemp}"
839 ; If the above call didn't help, use a (later) reboot to replace the file
840 !insertmacro InstallLib DLL NOTSHARED REBOOT_NOTPROTECTED "${FileSrc}" "${FileDest}" "${DirTemp}"
841!macroend
842!define InstallFileEx "!insertmacro InstallFileEx"
843
844;
845; Macro for installing a library/DLL.
846; @return Stack: "0" if copied, "1" if not, "2" on error / not found.
847; @param Un/Installer prefix; either "" or "un".
848; @param Name of lib/DLL to verify and copy to destination.
849; @param Destination name to copy verified file to.
850; @param Temporary folder used for exchanging the (locked) lib/DLL after a reboot.
851; @param Vendor to check for.
852; @param Architecture ("x86" or "amd64") to check for.
853;
854!macro InstallFileVerify un FileSrc FileDest DirTemp Vendor Architecture
855 Push $0
856 Push "${Architecture}"
857 Push "${Vendor}"
858 Push "${FileSrc}"
859 ${LogVerbose} "Verifying library $\"${FileSrc}$\" ..."
860 Call ${un}VerifyFile
861 Pop $0
862 ${If} $0 == "0"
863 ${InstallFileEx} ${un} ${FileSrc} ${FileDest} ${DirTemp}
864 ${Else}
865 ${LogVerbose} "File $\"${FileSrc}$\" did not pass verification (Vendor: ${Vendor}, Architecture: ${Architecture})"
866 ${EndIf}
867 ; Push result popped off the stack to stack again.
868 Push $0
869!macroend
870!define InstallFileVerify "!insertmacro InstallFileVerify"
871
872; Prepares the access rights for replacing
873; a WRP (Windows Resource Protection) protected file
874!macro PrepareWRPFile un
875Function ${un}PrepareWRPFile
876
877 Pop $0
878 Push $1
879
880 ${IfNot} ${FileExists} "$0"
881 ${LogVerbose} "WRP: File $\"$0$\" does not exist, skipping"
882 Return
883 ${EndIf}
884
885 ${Switch} $g_strWinVersion
886 ${Case} "NT4"
887 ${Case} "2000"
888 ${Case} "XP"
889 ${LogVerbose} "WRP: changing ownership or permissions is not required on NT4, 2000, XP."
890 ${Break}
891 ${Default}
892 ${CmdExecute} "$\"$g_strSystemDir\takeown.exe$\" /A /F $\"$0$\"" "true"
893 Pop $1
894 ${LogVerbose} "WRP: Changing ownership for $\"$0$\" returned: $1"
895
896 ${CmdExecute} "icacls.exe $\"$0$\" /grant *S-1-5-32-544:F" "true"
897 Pop $1
898 ${LogVerbose} "WRP: Changing DACL for $\"$0$\" returned: $1"
899
900 Sleep 1000 ; TrustedInstaller needs some time to forget about the file
901 ${EndSwitch}
902
903!if $%VBOX_WITH_GUEST_INSTALL_HELPER% == "1"
904 !ifdef WFP_FILE_EXCEPTION
905 VBoxGuestInstallHelper::DisableWFP "$0"
906 Pop $1 ; Get return value (ignored for now)
907 ${LogVerbose} "WRP: Setting WFP exception for $\"$0$\" returned: $1"
908 !endif
909!endif
910
911 Pop $1
912
913FunctionEnd
914!macroend
915!insertmacro PrepareWRPFile ""
916!insertmacro PrepareWRPFile "un."
917
918;
919; Macro for preparing the access rights for replacing
920; a WRP (Windows Resource Protection) protected file.
921; @return None.
922; @param Path of file to prepare.
923;
924!macro PrepareWRPFileEx un FileSrc
925 Push $0
926 Push "${FileSrc}"
927 Call ${un}PrepareWRPFile
928 Pop $0
929!macroend
930!define PrepareWRPFileEx "!insertmacro PrepareWRPFileEx"
931
932;
933; Validates backed up and replaced Direct3D files; either the d3d*.dll have
934; to be from Microsoft or the (already) backed up msd3d*.dll files. If both
935; don't match we have a corrupted / invalid installation.
936; @return Stack: "0" if files are valid; otherwise "1".
937;
938!macro ValidateFilesDirect3D un
939Function ${un}ValidateD3DFiles
940
941 Push $0
942
943 ; We need to switch to 64-bit app mode to handle the "real" 64-bit files in
944 ; "system32" on a 64-bit guest
945 Call ${un}SetAppMode64
946
947 ; Note: Not finding a file (like *d3d8.dll) on Windows Vista/7 is fine;
948 ; it simply is not present there.
949
950 ; Note 2: On 64-bit systems there are no 64-bit *d3d8 DLLs, only 32-bit ones
951 ; in SysWOW64 (or in system32 on 32-bit systems).
952
953!if $%BUILD_TARGET_ARCH% == "x86"
954 ${VerifyFileEx} "${un}" "$SYSDIR\d3d8.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
955 Pop $0
956 ${If} $0 == "1"
957 Goto verify_msd3d
958 ${EndIf}
959!endif
960
961 ${VerifyFileEx} "${un}" "$SYSDIR\d3d9.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
962 Pop $0
963 ${If} $0 == "1"
964 Goto verify_msd3d
965 ${EndIf}
966
967 ${If} $g_bCapDllCache == "true"
968!if $%BUILD_TARGET_ARCH% == "x86"
969 ${VerifyFileEx} "${un}" "$SYSDIR\dllcache\d3d8.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
970 Pop $0
971 ${If} $0 == "1"
972 Goto verify_msd3d
973 ${EndIf}
974!endif
975 ${VerifyFileEx} "${un}" "$SYSDIR\dllcache\d3d9.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
976 Pop $0
977 ${If} $0 == "1"
978 Goto verify_msd3d
979 ${EndIf}
980 ${EndIf}
981
982!if $%BUILD_TARGET_ARCH% == "amd64"
983 ${VerifyFileEx} "${un}" "$g_strSysWow64\d3d8.dll" "Microsoft Corporation" "x86"
984 Pop $0
985 ${If} $0 == "1"
986 Goto verify_msd3d
987 ${EndIf}
988 ${VerifyFileEx} "${un}" "$g_strSysWow64\d3d9.dll" "Microsoft Corporation" "x86"
989 Pop $0
990 ${If} $0 == "1"
991 Goto verify_msd3d
992 ${EndIf}
993
994 ${If} $g_bCapDllCache == "true"
995 ${VerifyFileEx} "${un}" "$g_strSysWow64\dllcache\d3d8.dll" "Microsoft Corporation" "x86"
996 Pop $0
997 ${If} $0 == "1"
998 Goto verify_msd3d
999 ${EndIf}
1000 ${VerifyFileEx} "${un}" "$g_strSysWow64\dllcache\d3d9.dll" "Microsoft Corporation" "x86"
1001 Pop $0
1002 ${If} $0 == "1"
1003 Goto verify_msd3d
1004 ${EndIf}
1005 ${EndIf}
1006
1007!endif
1008
1009 Goto valid
1010
1011verify_msd3d:
1012
1013!if $%BUILD_TARGET_ARCH% == "x86"
1014 ${VerifyFileEx} "${un}" "$SYSDIR\msd3d8.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
1015 Pop $0
1016 ${If} $0 == "1"
1017 Goto invalid
1018 ${EndIf}
1019!endif
1020 ${VerifyFileEx} "${un}" "$SYSDIR\msd3d9.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
1021 Pop $0
1022 ${If} $0 == "1"
1023 Goto invalid
1024 ${EndIf}
1025
1026 ${If} $g_bCapDllCache == "true"
1027!if $%BUILD_TARGET_ARCH% == "x86"
1028 ${VerifyFileEx} "${un}" "$SYSDIR\dllcache\msd3d8.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
1029 Pop $0
1030 ${If} $0 == "1"
1031 Goto invalid
1032 ${EndIf}
1033!endif
1034 ${VerifyFileEx} "${un}" "$SYSDIR\dllcache\msd3d9.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
1035 Pop $0
1036 ${If} $0 == "1"
1037 Goto invalid
1038 ${EndIf}
1039 ${EndIf}
1040
1041!if $%BUILD_TARGET_ARCH% == "amd64"
1042 ${VerifyFileEx} "${un}" "$g_strSysWow64\msd3d8.dll" "Microsoft Corporation" "x86"
1043 Pop $0
1044 ${If} $0 == "1"
1045 Goto invalid
1046 ${EndIf}
1047 ${VerifyFileEx} "${un}" "$g_strSysWow64\msd3d9.dll" "Microsoft Corporation" "x86"
1048 Pop $0
1049 ${If} $0 == "1"
1050 Goto invalid
1051 ${EndIf}
1052
1053 ${If} $g_bCapDllCache == "true"
1054 ${VerifyFileEx} "${un}" "$g_strSysWow64\dllcache\msd3d8.dll" "Microsoft Corporation" "x86"
1055 Pop $0
1056 ${If} $0 == "1"
1057 Goto invalid
1058 ${EndIf}
1059 ${VerifyFileEx} "${un}" "$g_strSysWow64\dllcache\msd3d9.dll" "Microsoft Corporation" "x86"
1060 Pop $0
1061 ${If} $0 == "1"
1062 Goto invalid
1063 ${EndIf}
1064 ${EndIf}
1065!endif
1066
1067 Goto valid
1068
1069valid:
1070
1071 StrCpy $0 "0" ; Installation valid
1072 Goto end
1073
1074invalid:
1075
1076 StrCpy $0 "1" ; Installation invalid / corrupted
1077 Goto end
1078
1079end:
1080
1081 Exch $0
1082
1083FunctionEnd
1084!macroend
1085!insertmacro ValidateFilesDirect3D ""
1086!insertmacro ValidateFilesDirect3D "un."
1087
1088;
1089; Restores formerly backed up Direct3D original files, which were replaced by
1090; a VBox XPDM driver installation before. This might be necessary for upgrading a
1091; XPDM installation to a WDDM one.
1092; @return Stack: "0" if files were restored successfully; otherwise "1".
1093;
1094!macro RestoreFilesDirect3D un
1095Function ${un}RestoreFilesDirect3D
1096
1097 Push $0
1098
1099 ; We need to switch to 64-bit app mode to handle the "real" 64-bit files in
1100 ; "system32" on a 64-bit guest
1101 Call ${un}SetAppMode64
1102
1103 ; Note: Not finding a file (like *d3d8.dll) on Windows Vista/7 is fine;
1104 ; it simply is not present there.
1105
1106 ; Note 2: On 64-bit systems there are no 64-bit *d3d8 DLLs, only 32-bit ones
1107 ; in SysWOW64 (or in system32 on 32-bit systems).
1108
1109 ${LogVerbose} "Restoring original D3D files ..."
1110!if $%BUILD_TARGET_ARCH% == "x86"
1111 ${PrepareWRPFileEx} "${un}" "$SYSDIR\d3d8.dll"
1112 ${CopyFileEx} "${un}" "$SYSDIR\msd3d8.dll" "$SYSDIR\d3d8.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
1113!endif
1114 ${PrepareWRPFileEx} "${un}" "$SYSDIR\d3d9.dll"
1115 ${CopyFileEx} "${un}" "$SYSDIR\msd3d9.dll" "$SYSDIR\d3d9.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
1116
1117 ${If} $g_bCapDllCache == "true"
1118!if $%BUILD_TARGET_ARCH% == "x86"
1119 ${PrepareWRPFileEx} "${un}" "$SYSDIR\dllcache\d3d8.dll"
1120 ${CopyFileEx} "${un}" "$SYSDIR\dllcache\msd3d8.dll" "$SYSDIR\dllcache\d3d8.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
1121!endif
1122 ${PrepareWRPFileEx} "${un}" "$SYSDIR\dllcache\d3d9.dll"
1123 ${CopyFileEx} "${un}" "$SYSDIR\dllcache\msd3d9.dll" "$SYSDIR\dllcache\d3d9.dll" "Microsoft Corporation" "$%BUILD_TARGET_ARCH%"
1124 ${EndIf}
1125
1126!if $%BUILD_TARGET_ARCH% == "amd64"
1127 ${PrepareWRPFileEx} "${un}" "$g_strSysWow64\d3d8.dll"
1128 ${CopyFileEx} "${un}" "$g_strSysWow64\msd3d8.dll" "$g_strSysWow64\d3d8.dll" "Microsoft Corporation" "x86"
1129 ${PrepareWRPFileEx} "${un}" "$g_strSysWow64\d3d9.dll"
1130 ${CopyFileEx} "${un}" "$g_strSysWow64\msd3d9.dll" "$g_strSysWow64\d3d9.dll" "Microsoft Corporation" "x86"
1131
1132 ${If} $g_bCapDllCache == "true"
1133 ${PrepareWRPFileEx} "${un}" "$g_strSysWow64\dllcache\d3d8.dll"
1134 ${CopyFileEx} "${un}" "$g_strSysWow64\dllcache\msd3d8.dll" "$g_strSysWow64\dllcache\d3d8.dll" "Microsoft Corporation" "x86"
1135 ${PrepareWRPFileEx} "${un}" "$g_strSysWow64\dllcache\d3d9.dll"
1136 ${CopyFileEx} "${un}" "$g_strSysWow64\dllcache\msd3d9.dll" "$g_strSysWow64\dllcache\d3d9.dll" "Microsoft Corporation" "x86"
1137 ${EndIf}
1138!endif
1139
1140 ; Do a re-validation afterwards.
1141 Call ${un}ValidateD3DFiles
1142 Pop $0
1143 ${If} $0 == "1" ; D3D files are invalid
1144 ${LogVerbose} $(VBOX_UNINST_UNABLE_TO_RESTORE_D3D)
1145 MessageBox MB_ICONSTOP|MB_OK $(VBOX_UNINST_UNABLE_TO_RESTORE_D3D) /SD IDOK
1146 ${EndIf}
1147
1148 Exch $0
1149
1150FunctionEnd
1151!macroend
1152!insertmacro RestoreFilesDirect3D ""
1153!insertmacro RestoreFilesDirect3D "un."
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