[WinOF] Support Winmad.dll, libibverbs.dll, libibumad.dll, ibverbs symbols(.pdb files).
[mirror/winof/.git] / WinOF / WIX / CustomActions.vbs
1 ' WIX CustomActions used in the WinOF (Windows OpenFabrics) Release.\r
2 ' File is based on the installer src contributed by Mellanox Technologies.\r
3 '\r
4 ' TabStops == 4\r
5 '\r
6 ' $Id$\r
7 \r
8 Function Architecture()\r
9       Dim Arch,item\r
10       For Each item In GetObject("winmgmts:root/cimv2").ExecQuery("SELECT Architecture FROM Win32_Processor")\r
11                   Arch=item.Architecture\r
12                   Exit For\r
13       Next\r
14       \r
15       If (Arch=0) Then\r
16                   Arch="x86"\r
17       Elseif (Arch=1) Then\r
18                   Arch="MIPS"\r
19       Elseif (Arch=2) Then\r
20                   Arch="Alpha"\r
21       Elseif (Arch=3) Then\r
22                   Arch="PowerPC"\r
23       Elseif (Arch=6) Then\r
24                   Arch="ia64"\r
25       Elseif (Arch=9) Then\r
26                   'Arch="x64"\r
27                   Arch="amd64"\r
28       Else\r
29                   WScript.echo "Arch ID=" & Arch\r
30                   Arch="CustomAction.vbs: Unable to determine Architecture"\r
31       End If\r
32       Architecture=Arch\r
33 \r
34 End Function\r
35 \r
36 \r
37 \r
38 ' A CustomAction (CA) that runs after SetupInitialize which sets up\r
39 ' CustomAction Data for the defered action CA DriverInstall().\r
40 ' A CA can only see Installer properties through pre-loaded 'CustomActionData'\r
41 \r
42 Sub WinOF_setup\r
43         dim VersionNT,Installed,AddLocal,use_this_HCA\r
44 \r
45         VersionNT = Session.Property("VersionNT")\r
46         Installed = Session.Property("Installed")\r
47         AddLocal = Session.Property("ADDLOCAL")\r
48 \r
49         ' The WIX UI (UserInterface) sets up ADDLOCAL. When cmd-line msiexec.exe is\r
50         ' run with a deprecited UI, then ADDLOCAL is not setup; default it's value\r
51         ' here.\r
52         If AddLocal = "" AND Installed = "" Then\r
53                 ' Enable default features.\r
54                 AddLocal = "IBcore,hca_mthca,fIPoIB,fWSD,fDAPL,fDatBASIC1,fDatBASIC2" \r
55         End If\r
56 \r
57         ' Process msiexec cmd line arg HCA=cx or HCA=+cx\r
58         ' Pre WLH OS only (Server 2003/XP)\r
59         ' Replace default InfiniHost HCA driver with ConnectX HCA driver if\r
60         ' requested 'HCA=cx' or add ConnectX '+cx'.\r
61 \r
62         If VersionNT < 600 Then\r
63                 use_this_HCA = Session.Property("HCA")\r
64                 If use_this_HCA <> "" Then\r
65                         ' down-case if required.\r
66                         If Instr(use_this_HCA,"CX") <> 0 Then\r
67                                 use_this_HCA = Replace(use_this_HCA,"CX","cx")\r
68                         End if\r
69                         If Instr(use_this_HCA,"+cx") <> 0 Then\r
70                                 ' Add ConnectX HCA drivers\r
71                                 AddLocal = AddLocal & ",hca_connectX"\r
72                         Else\r
73                                 If Instr(use_this_HCA,"cx") <> 0 Then\r
74                                         If Instr(AddLocal,"hca_mthca") <> 0 Then\r
75                                                 AddLocal = Replace(AddLocal,"hca_mthca","hca_connectX")\r
76                                         Else\r
77                                                 AddLocal = AddLocal & ",hca_connectX"\r
78                                         End If\r
79                                 End If\r
80                         End If\r
81                 End If\r
82         End If\r
83 \r
84         SRP = Session.Property("SRP")\r
85         If SRP = "1" Then\r
86                 AddLocal = AddLocal & ",fSRP"\r
87         End If\r
88 \r
89         VNIC = Session.Property("VNIC")\r
90         If VNIC = "1" Then\r
91                 AddLocal = AddLocal & ",fVNIC"\r
92         End If\r
93 \r
94         ' Driver Install Properties:\r
95     ' 0-INSTALLDIR; 1-SystemFolder; 2-System64Folder; 3-WindowsFolder ;\r
96         ' 4-VersionNT; 5-ADDLOCAL; 6-REMOVE; 7-NODRV\r
97 \r
98         Session.Property("DriverInstall") = _\r
99                 Session.Property("INSTALLDIR")          & ";" & _\r
100                 Session.Property("SystemFolder")        & ";" & _\r
101                 Session.Property("System64Folder")      & ";" & _\r
102                 Session.Property("WindowsFolder")       & ";" & _\r
103                 VersionNT                                                       & ";" & _\r
104                 AddLocal                                                        & ";" & _\r
105                 Session.Property("REMOVE")                      & ";" & _\r
106                 Session.Property("NODRV")\r
107 \r
108 End Sub\r
109 \r
110 \r
111 'Waiting to delete a file until it's free\r
112 \r
113 Function FileDeleteUntilFree(filename)\r
114         Set objFSO=CreateObject("Scripting.FileSystemObject") \r
115         Set WshShell = CreateObject("WScript.Shell")\r
116         dim too_much \r
117         too_much = 0\r
118         Do While objFSO.FileExists(filename)\r
119           On Error Resume Next \r
120           objFSO.DeleteFile(filename)\r
121           WScript.Sleep 100    ' milliseconds\r
122       ' Do not wait to long to delete the file, bail and don't delete it if too\r
123       ' long of a wait.\r
124           too_much = too_much + 1\r
125           if too_much > 50 then\r
126                 msgbox "delete Timeout(5) " & filename\r
127                 exit Do\r
128           End If\r
129           err.clear \r
130         Loop \r
131 End Function\r
132 \r
133 Function FileDelete(filename)\r
134     Dim fso\r
135     Set fso = CreateObject("Scripting.FileSystemObject")\r
136     Err.clear\r
137     If fso.FileExists(filename) Then\r
138             On Error Resume Next \r
139             fso.DeleteFile(filename),True\r
140             If (Err And Err.Number <> 70) Then  ' tolerate protection errors\r
141                     ErrMsg ("Could not delete: " & filename)\r
142         End If \r
143     End If\r
144 End Function\r
145 \r
146 \r
147 ' Move and then Delete a file. File is moved into %TEMP%\basename(filename)\r
148 ' then deleted; pesky files in 'system32\drivers'.\r
149 \r
150 Function FileMove(filename,destination)\r
151     Dim fso\r
152     Set fso = CreateObject("Scripting.FileSystemObject")\r
153     On Error Resume Next \r
154     If fso.FileExists(filename) Then\r
155             fso.MoveFile filename,destination\r
156             If (Err And Err.Number <> 70) then ' tolerate protection errors.\r
157             ErrMsg ("Could not move: " & filename & " to " & destination)\r
158         End if\r
159     End If\r
160     If Err Then ShowError\r
161 End Function\r
162 \r
163 \r
164 Function DriverFileDelete(fso,WshShell,filename)\r
165     Err.clear\r
166     If fso.FileExists(filename) Then\r
167             On Error Resume Next \r
168                 ' unlock the driver file by deleting PnPLocked reg entry.\r
169                 base = "reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles /v "\r
170                 Return = WshShell.Run (base & filename & " /f", 0, true)\r
171             fso.DeleteFile(filename),True\r
172             If (Err And Err.Number <> 70) Then  ' tolerate protection errors\r
173                     ErrMsg ("Could not delete: " & filename)\r
174         End If \r
175     End If\r
176 End Function\r
177 \r
178 \r
179 \r
180 Function FileMDelete(src,file)\r
181     Dim rc,cmd\r
182         On Error Resume Next \r
183     Err.clear\r
184         Set WshShell = CreateObject("WScript.Shell")\r
185         cmd = "cmd.exe /c cd /d " & src & " & del /Q/F " & file\r
186         rc = WshShell.Run (cmd, 0, true)\r
187 ' Debug\r
188 '       Set cmdExec = WshShell.Exec (cmd)\r
189 '       noise = cmdExec.StdErr.ReadAll\r
190 '       msgbox "FileMDel " & src & " stdErr " & noise\r
191 \r
192 End Function\r
193 \r
194 \r
195 ' Remove the specified folder and all sub-folders & files. \r
196 ' What rmdir does from the cmd line but will not do from vbs?\r
197 \r
198 Sub RemoveFolder(objStartFolder)\r
199     \r
200     Set objFSO = CreateObject("Scripting.FileSystemObject")\r
201     \r
202     If Not objFSO.FolderExists(objStartFolder) Then\r
203         Exit Sub\r
204     End if\r
205     \r
206     Set objFolder = objFSO.GetFolder(objStartFolder)\r
207     'Wscript.Echo objFolder.Path\r
208     Set colFiles = objFolder.Files\r
209     \r
210     ' del files in top-level folder\r
211     For Each objFile in colFiles\r
212         objFSO.DeleteFile(objFolder.Path & "\" & objFile.Name)\r
213         If Err Then\r
214             ErrMsg("Del err on " & objFolder.Path & "\" & objFile.Name)\r
215         End if\r
216     Next\r
217     \r
218     ShowSubfolders objFSO.GetFolder(objStartFolder), objFSO\r
219     \r
220     On Error Resume Next\r
221     objFSO.DeleteFolder(objStartFolder)\r
222     If Err Then\r
223         ErrMsg("DelFolder err on " & objStartFolder)\r
224     End if\r
225     \r
226 End Sub\r
227 \r
228 \r
229 Sub ShowSubFolders(Folder,FSO)\r
230     On Error Resume Next\r
231     For Each Subfolder in Folder.SubFolders\r
232         ' Wscript.Echo Subfolder.Path\r
233         Set objFolder = FSO.GetFolder(Subfolder.Path)\r
234         Set colFiles = objFolder.Files\r
235         For Each objFile in colFiles\r
236             ' Wscript.Echo Subfolder.Path & "\" & objFile.Name\r
237             FSO.DeleteFile(Subfolder.Path & "\" & objFile.Name)\r
238             If Err Then\r
239                 ErrMsg("DelFile err on " & Subfolder.Path & "\" & objFile.Name)\r
240             End if\r
241         Next\r
242         ' Wscript.Echo\r
243         ShowSubFolders Subfolder, FSO\r
244         FSO.DeleteFolder(Subfolder.Path)\r
245         If Err Then\r
246             ErrMsg("DelFolder err on " & Subfolder.Path)\r
247         End if\r
248     Next\r
249 End Sub\r
250 \r
251 \r
252 \r
253 \r
254 ''''''''''' Remove Driver Files ''''''''''''\r
255 \r
256 ' Attempt to clean out driver installed files which fail to be uninstalled\r
257 ' when the driver is uninstalled. Win2K3/x64 files persist, XP & Win2K3/x86\r
258 ' the driver files are correctly remove?\r
259  \r
260 Function RemoveDriverFiles(WshShell)\r
261     Dim Win, sDRIVERS, sSystem64Folder, sInstalldir, sSYS32, sSYSWOW64\r
262     Dim sSystemFolder, CheckMode, PropArray, dllCache, fso, sTemp\r
263         \r
264     ' Function can be called from the Driver{Install/Uninstall} rtns.\r
265     ' (properties are different).\r
266     CheckMode = Session.Property("CustomActionData")\r
267     If Not CheckMode = "" Then\r
268                 PropArray = Split(Session.Property("CustomActionData"), ";") \r
269                 Win = PropArray(3)\r
270         sSystem64Folder = PropArray(2)\r
271         sSystemFolder = PropArray(1)\r
272         sInstalldir = PropArray(0)\r
273     Else\r
274                 Win = Session.Property("WindowsFolder")\r
275         sSystem64Folder = Session.Property("System64Folder") \r
276         sInstalldir = Session.Property("INSTALLDIR") \r
277         sSystemFolder = Session.Property("SystemFolder") \r
278     End if\r
279 \r
280     Set WshShell = CreateObject("WScript.Shell")\r
281     Set fso = CreateObject("Scripting.FileSystemObject")\r
282 \r
283     MTARCH = Architecture \r
284 \r
285         ' this is screw-ball: on 64-bit systems: SystemFolder == %windir%\SysWOW64\r
286         ' on 32-bit systems: SystemFolder == %windir%\system32\r
287         ' Pay attention and switch sSYS32 on x86 systems\r
288 \r
289     sDRIVERS = sSystem64Folder \r
290         sSYS32 = sSystem64Folder\r
291         sSYSWOW64 = sSystemFolder\r
292 \r
293     If (MTARCH = "x86") Then\r
294         sDRIVERS = sSystemFolder  ' holds Session.Property("SystemFolder")\r
295                 sSYS32 = sSystemFolder\r
296     End If\r
297     sDRIVERS = sSYS32 & "drivers\"\r
298 \r
299     DriverFileDelete fso,WshShell,sDRIVERS & "ibbus.sys"\r
300     FileDelete(sDRIVERS & "ibbus.sy1")\r
301     DriverFileDelete fso,WshShell,sDRIVERS & "ibiou.sys"\r
302     DriverFileDelete fso,WshShell,sDRIVERS & "mthca.sys"\r
303     FileDelete(sDRIVERS & "mthca.sy1")\r
304     DriverFileDelete fso,WshShell,sDRIVERS & "mlx4_bus.sys"\r
305     DriverFileDelete fso,WshShell,sDRIVERS & "mlx4_hca.sys"\r
306 \r
307     DriverFileDelete fso,WshShell,sDRIVERS & "ipoib.sys"\r
308     DriverFileDelete fso,WshShell,sDRIVERS & "ibsrp.sys"\r
309     DriverFileDelete fso,WshShell,sDRIVERS & "vnic.sys"\r
310     DriverFileDelete fso,WshShell,sDRIVERS & "qlgcvnic.sys"\r
311     \r
312     dllCache = sSystem64Folder & "dllcache\"\r
313         If fso.FolderExists(dllCache) Then\r
314         FileDelete(dllCache & "ibal.dll")\r
315         FileDelete(dllCache & "ibald.dll")\r
316         FileDelete(dllCache & "complib.dll")\r
317         FileDelete(dllCache & "complibd.dll")\r
318         FileDelete(dllCache & "mthcau.dll")\r
319         FileDelete(dllCache & "mthcaud.dll")\r
320         FileDelete(dllCache & "mlx4u.dll")\r
321         FileDelete(dllCache & "mlx4ud.dll")\r
322         FileDelete(dllCache & "IbInstaller.dll")\r
323         FileDelete(dllCache & "ibwsd.dll")\r
324         FileDelete(dllCache & "ibsrp.dll")\r
325         FileDelete(dllCache & "ibsrpd.dll")\r
326         End if\r
327     \r
328     DriverFileDelete fso,WshShell,sSYS32 & "ibal.dll"\r
329     DriverFileDelete fso,WshShell,sSYS32 & "ibald.dll"\r
330     DriverFileDelete fso,WshShell,sSYS32 & "ibal32.dll"\r
331     DriverFileDelete fso,WshShell,sSYS32 & "ibal32d.dll"\r
332     DriverFileDelete fso,WshShell,sSYS32 & "complib.dll"\r
333     DriverFileDelete fso,WshShell,sSYS32 & "complibd.dll"\r
334     DriverFileDelete fso,WshShell,sSYS32 & "cl32.dll"\r
335     DriverFileDelete fso,WshShell,sSYS32 & "cl32d.dll"\r
336     DriverFileDelete fso,WshShell,sSYS32 & "mthcau.dll"\r
337     DriverFileDelete fso,WshShell,sSYS32 & "mthcaud.dll"\r
338     DriverFileDelete fso,WshShell,sSYS32 & "mthca32.dll"\r
339     DriverFileDelete fso,WshShell,sSYS32 & "mthca32d.dll"\r
340     DriverFileDelete fso,WshShell,sSYS32 & "mlx4u.dll"\r
341     DriverFileDelete fso,WshShell,sSYS32 & "mlx4ud.dll"\r
342     DriverFileDelete fso,WshShell,sSYS32 & "mlx4u32.dll"\r
343     DriverFileDelete fso,WshShell,sSYS32 & "mlx4u32d.dll"\r
344     DriverFileDelete fso,WshShell,sSYS32 & "ibsrp.dll"\r
345     DriverFileDelete fso,WshShell,sSYS32 & "ibsrpd.dll"\r
346     DriverFileDelete fso,WshShell,sSYS32 & "IbInstaller.dll"\r
347     DriverFileDelete fso,WshShell,sSYS32 & "ibwsd.dll"\r
348     DriverFileDelete fso,WshShell,sSYS32 & "ibndprov.dll"\r
349     DriverFileDelete fso,WshShell,sSYS32 & "ibndprov32.dll"\r
350     DriverFileDelete fso,WshShell,sSYS32 & "ndinstall.exe"\r
351 \r
352         If fso.FolderExists(sSYSWOW64) Then\r
353                 DriverFileDelete fso,WshShell,sSYSWOW64 & "ibal.dll"\r
354                 DriverFileDelete fso,WshShell,sSYSWOW64 & "ibald.dll"\r
355                 DriverFileDelete fso,WshShell,sSYSWOW64 & "complib.dll"\r
356                 DriverFileDelete fso,WshShell,sSYSWOW64 & "complibd.dll"\r
357                 DriverFileDelete fso,WshShell,sSYSWOW64 & "mthcau.dll"\r
358                 DriverFileDelete fso,WshShell,sSYSWOW64 & "mthcaud.dll"\r
359                 DriverFileDelete fso,WshShell,sSYSWOW64 & "mlx4u.dll"\r
360                 DriverFileDelete fso,WshShell,sSYSWOW64 & "mlx4ud.dll"\r
361                 DriverFileDelete fso,WshShell,sSYSWOW64 & "ibsrp.dll"\r
362                 DriverFileDelete fso,WshShell,sSYSWOW64 & "ibsrpd.dll"\r
363                 DriverFileDelete fso,WshShell,sSYSWOW64 & "IbInstaller.dll"\r
364                 DriverFileDelete fso,WshShell,sSYSWOW64 & "ibwsd.dll"\r
365                 DriverFileDelete fso,WshShell,sSYSWOW64 & "ibndprov.dll"\r
366         End If\r
367 \r
368         If fso.FolderExists(Win & "lastgood" ) Then\r
369         FileDelete(Win & "lastgood\system32\ibwsd.dll")\r
370         FileDelete(Win & "lastgood\SysWOW64\ibwsd.dll")\r
371         FileDelete(Win & "lastgood\SysWOW64\mthcau.dll")\r
372         FileDelete(Win & "lastgood\SysWOW64\mthcaud.dll")\r
373         FileDelete(Win & "lastgood\system32\mthcau.dll")\r
374         FileDelete(Win & "lastgood\system32\mthcaud.dll")\r
375         FileDelete(Win & "lastgood\system32\drivers\mthcau.dll")\r
376         FileDelete(Win & "lastgood\system32\drivers\mthcaud.dll")\r
377         FileDelete(Win & "lastgood\system32\drivers\mthca.sys")\r
378         End If\r
379 \r
380     FileDelete(Win & "winverbs.lib")\r
381     FileDelete(Win & "libibverbs.lib")\r
382     DriverFileDelete fso,WshShell,sDRIVERS & "winverbs.sys"\r
383     DriverFileDelete fso,WshShell,sSYS32 & "winverbs.dll"\r
384     DriverFileDelete fso,WshShell,sSYS32 & "winverbsd.dll"\r
385     DriverFileDelete fso,WshShell,sSYS32 & "libibverbs.dll"\r
386     DriverFileDelete fso,WshShell,sSYS32 & "libibverbsd.dll"\r
387     \r
388     ' delete opensm files\r
389     sTemp = fso.GetSpecialFolder(0) & "\temp\"\r
390     ' remove files from %SystemRoot%\temp\r
391     FileDelete(sTemp & "guid2lid")\r
392     FileDelete(sTemp & "opensm-sa.dump")\r
393     FileDelete(sTemp & "osm.log")\r
394     FileDelete(sTemp & "osm-subnet.lst")\r
395     \r
396     ' Delete oem*.inf and oem*.pnf files\r
397     dim  InfFiles, PnfFiles, IFILES, PFILES\r
398     Set infFilesExec = WshShell.Exec ("cmd.exe /c for /f  %i in ('findstr /m Mellanox %WINDIR%\inf\oem*.*') do @echo %i")\r
399     ' Display error number and description if applicable\r
400     If Err Then ShowError\r
401     \r
402     InfFiles = infFilesExec.StdOut.ReadAll\r
403     PnfFiles = Replace(InfFiles,".inf",".pnf")\r
404     \r
405     IFILES = Split(InfFiles,vbCrLf)\r
406     PFILES = Split(PnfFiles,vbCrLf)\r
407     \r
408     For Each file in IFILES\r
409         If (file <> "") Then\r
410             FileDelete(file)\r
411         End IF\r
412     Next\r
413     \r
414     For Each file in PFILES\r
415         If (file <> "") Then\r
416             FileDelete(file)\r
417         End IF\r
418     Next\r
419     \r
420 End Function\r
421 \r
422 \r
423 ''''''''''' Delete registry key ''''''''''''\r
424 \r
425 Function DeleteRegKey(KeyPath)\r
426    Const HKEY_LOCAL_MACHINE = &H80000002\r
427    dim strComputer\r
428    strComputer = "."\r
429    Set objReg=GetObject("winmgmts:" & _\r
430        "{impersonationLevel=impersonate}!\\" & _\r
431        strComputer & "\root\default:StdRegProv")\r
432 \r
433    ' Display error number and description if applicable\r
434    ' If Err Then ShowError\r
435    Return = objReg.DeleteKey(HKEY_LOCAL_MACHINE, KeyPath)\r
436    \r
437 End Function\r
438 \r
439 \r
440 ''''''''''' Delete registry value ''''''''''''\r
441 \r
442 Function DeleteRegValue(strKeyPath, strValueName)\r
443    Const HKEY_LOCAL_MACHINE = &H80000002\r
444    \r
445    dim strComputer\r
446    strComputer = "."\r
447    \r
448    Set objReg=GetObject("winmgmts:" & _\r
449        "{impersonationLevel=impersonate}!\\" & _ \r
450        strComputer & "\root\default:StdRegProv")\r
451 \r
452     \r
453    Return = objReg.DeleteValue(HKEY_LOCAL_MACHINE, strKeyPath, strValueName)\r
454    ' Display error number and description if applicable\r
455    If Err Then ShowError\r
456 '    If (Return = 0) And (Err.Number = 0) Then\r
457 '           WScript.Echo value & "Registry value HKEY_LOCAL_MACHINE," & _\r
458 '             strKeyPath & "," & strValueName & "," & dwValue & " deleted"\r
459 '    Else\r
460 '           WScript.Echo "Registry value not deleted" & VBNewLine & _\r
461 '             "Error = " & Err.Number\r
462 '    End If\r
463 \r
464 End Function\r
465 \r
466 \r
467 \r
468 Function ReadSysPath\r
469 \r
470     Const HKEY_LOCAL_MACHINE = &H80000002\r
471     Dim strComputer, strKeyPath, strValueName, strValue\r
472 \r
473     ReadSysPath = Null  ' assume the worst.\r
474     strComputer = "."\r
475     Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ \r
476                         strComputer & "\root\default:StdRegProv")\r
477  \r
478     strKeyPath="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"\r
479     strValueName = "Path"\r
480     oReg.GetExpandedStringValue HKEY_LOCAL_MACHINE,_\r
481          strKeyPath, strValueName, strValue\r
482 \r
483     If (Err.Number = 0) And (Not IsNull(strValue)) Then\r
484         ReadSysPath = strValue\r
485     End if\r
486 End Function\r
487 \r
488 \r
489 Function WriteSysPath(NewPath)\r
490 \r
491     Const HKEY_LOCAL_MACHINE = &H80000002\r
492     Dim strComputer, strKeyPath, strValueName\r
493 \r
494     strComputer = "."\r
495     Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ \r
496                         strComputer & "\root\default:StdRegProv")\r
497  \r
498     strKeyPath="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"\r
499     strValueName = "Path"\r
500     oReg.SetExpandedStringValue _\r
501          HKEY_LOCAL_MACHINE, strKeyPath, strValueName, NewPath\r
502 \r
503     WriteSysPath = Err.Number\r
504 End Function\r
505 \r
506 \r
507 'Chops the last character off a string if it matches strchar\r
508 Function ChopChar(strString, strChar)\r
509   Dim x\r
510   x = Len(strString)\r
511   if mid(strString, x) = strChar then\r
512     ChopChar = mid(strString, 1, x -1)\r
513   else\r
514     ChopChar = strString\r
515   end if\r
516 End Function\r
517 \r
518 \r
519 ' Add specified path to the system search path registry entry @\r
520 ' 'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path'\r
521 ' Normally the added path is [INSTALLDIR]\r
522 ' Called from a defered exection context (aka, DriverInstall).\r
523 \r
524 Function SysPathAdd(InstallDir)\r
525 \r
526     Dim rc, result, sInstallDir, newPath\r
527 \r
528     ' On Error Resume Next\r
529     sInstallDir = ChopChar(InstallDir,"\")\r
530 \r
531     result = ReadSysPath\r
532     If IsNull(result) Then\r
533         SysPathAdd = ShowErr2("SysPathAdd - RegRead()")\r
534         Exit Function\r
535     End if\r
536 \r
537     ' Is [INSTALLDIR] already set?\r
538     start = instr(result,sInstallDir)\r
539     If start <> 0 Then\r
540         SysPathAdd = 0\r
541         Exit Function\r
542     End if\r
543 \r
544     newPath = result & ";" & sInstallDir\r
545 \r
546     rc = WriteSysPath(newPath)\r
547     If rc <> 0 Then\r
548         SysPathAdd = ShowErr2("SysPathAdd - WriteSysPath()")\r
549     Else\r
550        ' TODO - Notify current windows of updated PATH registry value.\r
551        SysPathAdd = 0\r
552     End if\r
553 \r
554 End Function\r
555 \r
556 \r
557 ' Remove specified path from the system search path.\r
558 \r
559 Function SysPathRemove(InstallDir)\r
560 \r
561     Dim rc, curPath, rKey, sInstallDir, newPath\r
562 \r
563     ' On Error Resume Next\r
564     ' sInstallDir = Session.Property("INSTALLDIR")\r
565 \r
566     sInstallDir = ";" & ChopChar(InstallDir,"\")\r
567 \r
568     curPath = ReadSysPath\r
569     If IsNull(curPath) Then\r
570         SysPathRemove = ShowErr2("SysPathRemove - ReadSysPath() = NULL?")\r
571         Exit Function\r
572     End if\r
573 \r
574     SysPathRemove = 0  ' assume SUCCESS\r
575 \r
576     start = instr(curPath,sInstallDir)\r
577     If start <> 0 Then\r
578         ' INSTALLDIR IS in the system search path\r
579         ' remove INSTALLDIR from system search path\r
580         s0 = Left(curPath,start-1)\r
581         s1 = Right(curPath,Len(curPath) - (start+Len(sInstallDir) - 1))\r
582         NewPath = s0 & s1\r
583         rc = WriteSysPath(NewPath)\r
584         If rc <> 0 Then\r
585             SysPathRemove = ShowErr2("SysPathRemove - WriteSysPath()")\r
586         End if\r
587     End if\r
588 \r
589 End Function\r
590 \r
591 \r
592 \r
593 ' not used\r
594 ''''''''''' Check installation status ''''''''''''\r
595 \r
596 Function install_verify()\r
597    Dim Status\r
598    Dim sInstalldir\r
599    sInstalldir = Session.Property("INSTALLDIR")\r
600    Set WshShell = CreateObject("WScript.Shell")\r
601    Set vstat = WshShell.Exec(sInstalldir & "\bin\vstat.exe")\r
602    install_verify = vstat.ExitCode\r
603 End Function\r
604 \r
605 '-------------------------------------------------------------\r
606 \r
607 ' add registry key\r
608 Function CreateRegKey(KeyPath)\r
609    Const HKEY_LOCAL_MACHINE = &H80000002\r
610    dim strComputer\r
611    strComputer = "."\r
612    Set objReg=GetObject("winmgmts:" & _\r
613        "{impersonationLevel=impersonate}!\\" & _\r
614        strComputer & "\root\default:StdRegProv")\r
615 \r
616    ' Display error number and description if applicable\r
617    If Err Then ShowError\r
618    Return = objReg.CreateKey(HKEY_LOCAL_MACHINE, KeyPath)\r
619    \r
620 End Function\r
621 \r
622 \r
623 \r
624 '--------------------------------------------------------\r
625 \r
626 \r
627 ' Function to add registry DWORD val.\r
628 Function AddRegDWORDValue(strKeyPath, strValueName, dwValue)\r
629     Const HKEY_LOCAL_MACHINE = &H80000002\r
630     strComputer = "."\r
631  \r
632     Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ \r
633                        strComputer & "\root\default:StdRegProv")\r
634     If Err Then ShowError\r
635  \r
636     oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,dwValue\r
637 \r
638     If Err Then ShowError\r
639 \r
640 End Function\r
641 \r
642 '-------------------------------------------------\r
643 \r
644 ' Function to add registry Expanded string val.\r
645 \r
646 Function AddRegExpandValue(strKeyPath, strValueName, dwValue)\r
647     Const HKEY_LOCAL_MACHINE = &H80000002\r
648     strComputer = "."\r
649  \r
650     Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ \r
651             strComputer & "\root\default:StdRegProv")\r
652  \r
653     If Err Then ShowError\r
654     oReg.SetExpandedStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,_\r
655          dwValue\r
656     If Err Then ShowError\r
657 \r
658 End Function\r
659 \r
660 '------------------------------------------------------------------------\r
661 \r
662 \r
663 ' Function to add registry string val.\r
664 \r
665 Function AddRegStringValue(strKeyPath, strValueName, dwValue)\r
666 Const HKEY_LOCAL_MACHINE = &H80000002\r
667 strComputer = "."\r
668  \r
669 Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ \r
670 strComputer & "\root\default:StdRegProv")\r
671  \r
672 If Err Then ShowError\r
673 oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,dwValue\r
674 If Err Then ShowError\r
675 \r
676 End Function\r
677 \r
678 '------------------------------------------------------------------------\r
679 \r
680 ' Return a list of PCI devices using 'devcon find | findall'\r
681 ' sFindHow - stringArg: devcon cmd arg {find | findall}\r
682 \r
683 Function Find_Dev_by_Tag(WshShell,exe,sFindHow,tag)\r
684     Dim cmd\r
685 \r
686         cmd = exe & " " & sFindHow & " * | find """ & tag & """"\r
687         Set connExec = WshShell.Exec(cmd)\r
688     If Err Then\r
689         msgbox "Shell.Exec err: " & cmd\r
690                 Find_Dev_by_Tag = Null\r
691         Exit Function\r
692     End if\r
693 \r
694         devs = split(connExec.StdOut.ReadAll, vbCrLF)\r
695 \r
696         On Error Resume Next \r
697 \r
698         ' verify we have some useful data.\r
699         dim arrSize\r
700         arrSize = 0\r
701         for each dev in devs\r
702                 If Instr(dev,Tag) Then\r
703                         arrSize = arrSize + 1\r
704                 End if\r
705         next\r
706 \r
707         If arrSize = 0 Then\r
708                 Find_Dev_by_Tag = Null\r
709                 Exit Function\r
710         End If\r
711                 \r
712         Find_Dev_by_Tag = devs\r
713 \r
714 End Function\r
715 \r
716 \r
717 Function IsInfiniHost(ID)\r
718     Dim dID\r
719         HCAs = Array("5A44","5A45","5E8C","5E8D","6264","6274","6275","6278",_\r
720                                 "6279","6282")\r
721 \r
722     For each dID in HCAs\r
723         If dID = ID Then\r
724             IsInfiniHost = 1\r
725 'msgbox "match ID " & ID & " dID " & dID\r
726             Exit Function\r
727         End if\r
728         Next\r
729 'msgbox "NO match ID " & ID \r
730     IsInfiniHost = 0\r
731 \r
732 End Function\r
733 \r
734 \r
735 ' Install Qlogic VNIC Driver using devman.exe (aka devcon)\r
736 \r
737 Sub devman_Install_VNIC(WshShell,sInstalldir)\r
738 \r
739         Dim devID, rc\r
740 \r
741     devmanQL = "cmd.exe /c cd /d " & sInstalldir & "qlgcvnic & " & _\r
742                         "..\IBcore\devman.exe "\r
743 \r
744     Err.clear\r
745         devID = "IBA\V00066AP00000030"\r
746         rc = WshShell.Run (devmanQL & "disable " & devID, 0, true)\r
747         rc = WshShell.Run (devmanQL & "update netvnic.inf " & devID,0,true)\r
748         ' Display error number and description if applicable\r
749         If rc <> 0 Then\r
750                 msgbox "Install_VNIC Err(" & rc & ") - devman update qlgcvnic.sys " _\r
751                                 & devID\r
752         Else\r
753                 rc = WshShell.Run (devmanQL & "enable " & devID, 0, true)\r
754         End if\r
755 \r
756 End Sub\r
757         \r
758 \r
759 Function dpinst_Install_VNIC(WshShell,sInstalldir)\r
760         Dim dpinstSRP,cmd,rc\r
761 \r
762         dpinst_Install_VNIC = 0\r
763 \r
764         dpinstVNIC = "cmd.exe /c cd /d " & sInstalldir & _\r
765                                         "qlgcvnic & ..\ibcore\dpinst.exe "\r
766 \r
767         cmd = dpinstVNIC & "/S /F /SA /PATH """ & sInstalldir & "qlgcvnic""" & _\r
768                                 " /SE /SW"\r
769         rc = WshShell.Run (cmd,0,true)\r
770         If (rc AND DPINST_ERR) Then\r
771                 msgbox "ERR: qlgcvnic Install RC(" & rc & ") " & cmd\r
772                 dpinst_Install_VNIC = rc\r
773         End if\r
774 \r
775 End Function\r
776 \r
777 \r
778 ' Install SRP (SCSI RDMA Protocol) Driver\r
779 \r
780 Function devman_Install_SRP(WshShell,sInstalldir)\r
781 \r
782         Dim Devices,devID,rc,found\r
783 \r
784         ' QLogic Virtual FC I/O controller or\r
785         ' InfiniBand SRP Miniport: IBA\C0100C609EP0108 or IBA\CFF00C609EP0108\r
786         ' OFED SRP target: IBA\V000002P00005A44\r
787         ' one driver handles all three.\r
788         SRP_IDS = Array(_\r
789                                 "IBA\V000002P00005A44",_\r
790                                 "IBA\C0100C609EP0108",_\r
791                                 "IBA\CFF00C609EP0108",_\r
792                                 "IBA\V00066AP00000038")\r
793 \r
794     devmanSRP = "cmd.exe /c cd /d " & sInstalldir & "SRP & " & _\r
795                                         "..\IBcore\devman.exe "\r
796         Err.clear\r
797         found = 0\r
798 \r
799         On Error Resume Next\r
800 \r
801         Devices = Find_IBA_Devices(WshShell,sInstalldir) \r
802         If IsNull(Devices) Then\r
803                 msgbox "devman_Install_SRP() missing IBA\* devices?"\r
804                 Exit Function\r
805         End If\r
806 \r
807         For each ID in SRP_IDS\r
808                 For each devID in Devices\r
809                 If Instr(1,devID,ID) = 1 Then\r
810                                 found = 1\r
811                                 rc = WshShell.Run (devmanSRP & "update ib_srp.inf " & ID,0,true)\r
812                                 ' Display error number and description if applicable\r
813                                 If rc <> 0 Then\r
814                                         msgbox "Install_SRP Err(" & rc _\r
815                                                         & ") devman update ib_srp.inf " & ID\r
816                                 End If\r
817                                 Exit For\r
818                         End If\r
819                 Next\r
820 '               One driver handles all SRP devices - install once?\r
821 '               If found = 1 Then\r
822 '                       Exit For\r
823 '               End If\r
824         Next\r
825 \r
826         If found = 0 Then\r
827                 devman_Install_SRP = -1\r
828         Else\r
829                 devman_Install_SRP = 0\r
830         End If\r
831 \r
832 End Function\r
833 \r
834 \r
835 Function dpinst_Install_SRP(WshShell,sInstalldir)\r
836         Dim dpinstSRP,cmd,rc\r
837 \r
838         dpinst_Install_SRP = 0\r
839         dpinstSRP = "cmd.exe /c cd /d " & sInstalldir _\r
840                                 & "SRP & ..\ibcore\dpinst.exe "\r
841         cmd = dpinstSRP & "/S /F /SA /PATH """ & sInstalldir & "SRP""" & " /SE /SW"\r
842         rc = WshShell.Run (cmd,0,true)\r
843         If (rc AND DPINST_ERR) Then\r
844                 msgbox "ERR: SRP Install rc(" & rc & ") " & cmd\r
845                 dpinst_Install_SRP = rc\r
846         End if\r
847 \r
848 End Function\r
849 \r
850 \r
851 Sub devman_Install_IOU(WshShell,sInstalldir)\r
852 \r
853         Dim rc,devman\r
854 \r
855     devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
856 \r
857         On Error Resume Next\r
858 \r
859         dev_list = Find_Dev_by_Tag(WshShell,devman,"find","InfiniBand I/O Unit")\r
860 \r
861         ' if no IB_IOU device found, install ibiou.sys driver\r
862         If IsNull(dev_list) Then\r
863                 rc = WshShell.Run (devman & "update ib_iou.inf IBA\IB_IOU",0,true)\r
864                 If rc <> 0 Then\r
865                         msgbox "Install_IOU Err(" & rc & ")" & _\r
866                                         "devman update ib_iou.inf IBA\IB_IOU"\r
867                 End If\r
868 '       Else\r
869 '               msgbox "IOU driver already loaded [" & dev_list(0) & "]"\r
870         End If\r
871 \r
872 End Sub\r
873 \r
874 \r
875 ' For installer error codes see\r
876 '  http://msdn2.microsoft.com/en-us/library/aa368542(VS.85).aspx \r
877 \r
878 Const ERROR_INSTALL_SOURCE_ABSENT = 1612  ' missing files to install,\r
879                                               ' invalid feature selection.\r
880 Const ERROR_INSTALL_FAILURE       = 1603  ' fatal error during installation\r
881 Const ERROR_FUNCTION_FAILED       = 1627  ' function failed during execution   \r
882 Const ERROR_SUCCESS_REBOOT_REQUIRED = 3010 ' restart required\r
883 \r
884 Const DPINST_ERR = &H80000000\r
885 \r
886 \r
887 Function dpinst_install(WshShell,sInstalldir,need_IPOIB,need_VNIC,need_SRP)\r
888 \r
889         Dim dpinst,dpinstNET,cmd,rc\r
890 \r
891         err.clear\r
892         On Error Resume Next\r
893 \r
894         cmdspec = "cmd.exe /c cd /d " & sInstalldir \r
895         dpinst = cmdspec & "IBcore & dpinst.exe "\r
896         dpinstNET = cmdspec & "net & ..\ibcore\dpinst.exe "\r
897 \r
898         cmd = dpinst & "/S /F /SA /SE /SW"\r
899 \r
900         ' HCA driver install - mlx4 or mthca, dpinst does all .inf files in\r
901         ' the current folder.\r
902 \r
903         rc = WshShell.Run (cmd,0,true)\r
904 \r
905         If (rc AND DPINST_ERR) Then\r
906                 msgbox "dpinst_install - HCA driver Install failed(" & rc & ") " & cmd\r
907                 remove_INF_file WshShell,dpinst,"mthca"\r
908                 remove_INF_file WshShell,dpinst,"mlx4"\r
909                 dpinst_install=ERROR_INSTALL_FAILURE\r
910                 Exit Function\r
911         End if\r
912 \r
913     ' Check/install IPoIB driver\r
914         If need_IPOIB Then\r
915                 cmd = dpinstNET & "/S /F /SA /PATH """ & sInstalldir & "net""" & _\r
916                                 " /SE /SW"\r
917                 rc = WshShell.Run (cmd,0,true)\r
918                 If (rc AND DPINST_ERR) Then\r
919                         msgbox "IPoIB Install rc(" & rc & ") " & cmd\r
920                         dpinst_install=ERROR_INSTALL_FAILURE\r
921                         Exit Function\r
922                 End if\r
923     End If\r
924     \r
925         ' IOU driver is installed (loaded into driver store) by default as the\r
926         ' driver (ibiou.sys) is located in IBcore; side-effect of dpinst.exe.\r
927 \r
928         If need_VNIC Then\r
929                 rc = dpinst_Install_VNIC(WshShell,sInstalldir)\r
930     End If\r
931     \r
932         If need_SRP Then\r
933                 rc = dpinst_Install_SRP(WshShell,sInstalldir)\r
934     End If\r
935     \r
936         dpinst_install = 0\r
937 \r
938 End Function\r
939 \r
940 \r
941 Function devman_install(WshShell,Installdir,have_mthca,have_mlx4,IPOIB,VNIC,SRP)\r
942 \r
943         Dim devman,cmd,Return,rc\r
944 \r
945         ' an HCA driver is 'required' for devman/devcon installs.\r
946     If have_mlx4 = 0 AND have_mthca = 0 Then\r
947         msgbox "devman_install - No HCA Driver Selected to Install?" & _\r
948                "   Aborting Installation."\r
949         ' Force installer cleanup (real magic).\r
950         devman_install=ERROR_INSTALL_SOURCE_ABSENT\r
951         Exit Function\r
952     End If\r
953 \r
954     devman = "cmd.exe /c cd /d " & Installdir & "IBcore & devman.exe "\r
955 \r
956         dev_list = Find_Dev_by_Tag(WshShell,devman,"find","VEN_15B3")\r
957 \r
958         If IsNull(dev_list) Then\r
959                 msgbox "HCA driver install - No HCA devices to install?"\r
960                 devman_install=ERROR_INSTALL_FAILURE\r
961                 Exit Function\r
962         End If\r
963 \r
964     ' Install ConnectX (mlx4) HCA driver?\r
965 \r
966     If have_mlx4 Then\r
967 \r
968         ' install ConnectX/mlx4 bus driver \r
969                 cmd = ""\r
970         For each Dev in dev_list\r
971                         If Dev <> "" Then\r
972                                 mlxdev = Left(Dev,(Instr(dev,"SUBSYS")-2))\r
973                                 devID = Right(mlxdev,4)\r
974                                 If IsInfiniHost( devID ) = 0 Then\r
975                                         ' Mixed HCA types? if not, then Vendor_ID install\r
976                                         If have_mthca = 0 Then\r
977                                                 mlxdev = "PCI\VEN_15B3"\r
978                                         End If\r
979                                         cmd = devman & "update mlx4_bus.inf """ & mlxdev & """"\r
980                                         Return = WshShell.Run (cmd,0,true)\r
981                         If Return = 0 Then\r
982                                 DrvInstalled = true\r
983                                 Exit For\r
984                         End If\r
985                                         ' one time install attempt if not mixed HCA types present.\r
986                                         ' Otherwise, continue with next mlx4 DEV_ID\r
987                                         If have_mthca = 0 Then\r
988                                 Exit For\r
989                                         End If\r
990                                 End if\r
991                         End if\r
992                 Next\r
993 \r
994                 If DrvInstalled <> true Then\r
995             msgbox "mlx4_bus Install failed(" & Return & ") " & cmd\r
996             devman_install=ERROR_INSTALL_FAILURE\r
997             Exit Function\r
998                 End if\r
999 \r
1000                 ' Install ConnectX HCA\r
1001         cmd = devman & "update mlx4_hca.inf MLX4\CONNECTX_HCA"\r
1002         Return = WshShell.Run (cmd,0,true)\r
1003 \r
1004         ' Display error number and description if applicable\r
1005         If Return <> 0 Then\r
1006             msgbox "mlx4_hca Install Err(" & Return & ") " & cmd\r
1007                         remove_INF_file WshShell,devman,"mlx4_"\r
1008             devman_install=ERROR_INSTALL_FAILURE\r
1009             Exit Function\r
1010         End if\r
1011     End If\r
1012 \r
1013     ' InfiniHost (mthca) HCA driver?\r
1014 \r
1015     If have_mthca Then\r
1016                 DrvInstalled = false\r
1017 \r
1018                 cmd = ""\r
1019         For each dev in dev_list\r
1020                         If dev <> "" Then\r
1021                                 idev = Left(dev,(Instr(dev,"SUBSYS")-2))\r
1022                                 devID = Right(idev,4)\r
1023                                 If IsInfiniHost( devID ) = 1 Then\r
1024                                         ' Mixed HCA types? if not, then Vendor_ID install\r
1025                                         If have_mlx4 = 0 Then\r
1026                                                 idev = "PCI\VEN_15B3"\r
1027                                         End If\r
1028                         cmd = devman & "update mthca.inf """ & idev & """"\r
1029                         Return = WshShell.Run (cmd,0,true)\r
1030                         If Return = 0 Then\r
1031                                 DrvInstalled = true\r
1032                                 Exit For\r
1033                         End If\r
1034                                         ' one time install attempt if no mlx4 present\r
1035                                         ' otherwise, continue with next DEV_ID\r
1036                                         If have_mlx4 = 0 Then\r
1037                                 Exit For\r
1038                                         End If\r
1039                                 End if\r
1040                         End if\r
1041         Next\r
1042 \r
1043                 If DrvInstalled <> true Then\r
1044             msgbox "InfiniHost(mthca) Install Err(" & Return & ") " & cmd\r
1045                         remove_INF_file WshShell,devman,"mthca"\r
1046             devman_install=ERROR_INSTALL_FAILURE\r
1047             Exit Function\r
1048                 End if\r
1049     End if\r
1050 \r
1051         ' an HCA driver is 'required'.\r
1052 \r
1053     if DrvInstalled = false Then\r
1054         msgbox "Driver Install - No HCA Driver Selected to Install?" & _\r
1055                "   Aborting Installation."\r
1056         ' Force installer cleanup (real magic).\r
1057         devman_install=ERROR_INSTALL_SOURCE_ABSENT\r
1058         Exit Function\r
1059     End if\r
1060 \r
1061     ' Check/install IPoIB driver\r
1062         If IPOIB Then\r
1063         devmanNET = "cmd.exe /c cd /d " & Installdir & _\r
1064                                         "net & ..\IBcore\devman.exe "\r
1065                 cmd = devmanNET & "update netipoib.inf IBA\IPoIB"\r
1066                 rc = WshShell.Run (cmd,0,true)\r
1067                 If rc <> 0 Then\r
1068                         msgbox "IPoIB Install Err(" & rc & ") " & cmd\r
1069                         DriverUninstall\r
1070             devman_install=ERROR_INSTALL_FAILURE\r
1071             Exit Function\r
1072                 End If\r
1073     End If\r
1074     \r
1075         ' IB I/O Unit driver installed only if required by VNIC or SRP.\r
1076 \r
1077     If VNIC OR SRP Then\r
1078         rc = WshShell.Run (devman & "update ib_iou.inf IBA\IB_IOU",0,true)\r
1079                 If rc <> 0 Then\r
1080                         msgbox "IOU Install Err(" & rc & ") update ib_iou.inf IBA\IB_IOU"\r
1081                         DriverUninstall\r
1082             devman_install=ERROR_INSTALL_FAILURE\r
1083             Exit Function\r
1084                 End if\r
1085     End If\r
1086 \r
1087     ' Install Qlogic VNIC Driver?\r
1088         If VNIC Then\r
1089                 devman_Install_VNIC WshShell,Installdir\r
1090     End if\r
1091         \r
1092     ' Install SRP (SCSI RDMA Protocol) Driver?\r
1093     If SRP Then\r
1094                 For cnt=1 To 3\r
1095                         rc = devman_Install_SRP(WshShell,Installdir)\r
1096                         If rc <> -1 Then\r
1097                                 Exit For\r
1098                         End If\r
1099                         WshShell.popup "Waiting 10 seconds for SRP device(s) to appear",10,_\r
1100                                                 "WinOF - SRP Install"\r
1101                 Next\r
1102                 If rc = -1 Then\r
1103                         msgbox "WinOF: Missing SRP devices?" & vbCrLf _\r
1104                                 & "cd /d " & Installdir & "SRP" & vbCrLf _\r
1105                                 & "..\IBcore\devman find IBA\*" & vbCrLf _\r
1106                                 & "..\IBcore\devman update ib_srp.inf found-SRP-DevID" & vbCrLf\r
1107                 End If\r
1108         End If\r
1109 \r
1110         devman_install = 0\r
1111 \r
1112 End Function\r
1113 \r
1114 \r
1115 \r
1116 ''''''''''' Device Driver Install ''''''''''''\r
1117 \r
1118 Function DriverInstall()\r
1119     Dim PropArray\r
1120         Dim devman, devmanEXE\r
1121     Dim rc, cmd, CheckMode, sInstalldir, fso\r
1122         Dim DrvInstalled, idev, mlxdev, dev, dev_list\r
1123         Dim WLH,need_IPOIB,need_SRP,need_VNIC\r
1124 \r
1125         On Error Resume Next\r
1126 \r
1127     ' Get the value of INSTALLDIR - see WinOF_Setup\r
1128     CheckMode = Session.Property("CustomActionData")\r
1129 \r
1130     If Not CheckMode = "" Then\r
1131         'in defered action this is the way to pass arguments.\r
1132             PropArray = Split(Session.Property("CustomActionData"), ";")\r
1133     Else\r
1134         Redim PropArray(8)\r
1135                 PropArray(0) = Session.Property("INSTALLDIR") \r
1136                 PropArray(1) = Session.Property("SystemFolder") \r
1137         PropArray(2) = Session.Property("System64Folder") \r
1138                 PropArray(3) = Session.Property("WindowsFolder")\r
1139                 PropArray(4) = Session.Property("VersionNT")\r
1140                 PropArray(5) = Session.Property("ADDLOCAL")\r
1141                 PropArray(6) = Session.Property("REMOVE")\r
1142                 PropArray(7) = Session.Property("NODRV")\r
1143     End If\r
1144 \r
1145         ' If cmd-line specified NODRV=1, then do not install drivers.\r
1146         ' Should not get here with NODRV=1 as WIX src files check.\r
1147         ' Be safe.\r
1148 \r
1149         If PropArray(7) <> "" Then\r
1150                 Exit Function\r
1151         End If\r
1152 \r
1153     sInstalldir = PropArray(0)\r
1154         VersionNT       = PropArray(4)\r
1155         InstallThis     = PropArray(5)\r
1156 \r
1157     devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1158 \r
1159     Set WshShell = CreateObject("WScript.Shell")\r
1160     Set fso = CreateObject("Scripting.FileSystemObject")\r
1161         \r
1162     If Not fso.FileExists(sInstalldir & "IBcore\devman.exe") Then\r
1163         msgbox "DriverInstall: missing " & sInstalldir & "IBcore\devman.exe"\r
1164         DriverInstall=ERROR_FUNCTION_FAILED \r
1165         Exit Function\r
1166     End if\r
1167 \r
1168     If Not fso.FileExists(sInstalldir & "IBcore\dpinst.exe") Then\r
1169         msgbox "DriverInstall: missing " & sInstalldir & "IBcore\dpinst.exe"\r
1170         DriverInstall=ERROR_FUNCTION_FAILED \r
1171         Exit Function\r
1172     End if\r
1173 \r
1174     err.clear \r
1175 \r
1176     ' rescan system buses\r
1177     Return = WshShell.Run (devman & "rescan", 0, true)\r
1178                 \r
1179     ' Install HCA (Host Channel Adapter) Driver(s)\r
1180     DrvInstalled = false\r
1181 \r
1182         ' Which HCAs are selected to install?\r
1183         ' Both InfiniHost(mthca) and ConnectX(mlx4) have the same\r
1184         ' Vendor ID VEN_15B3, so a generic by 'Vendor ID' install will not suceed.\r
1185         ' In the case of both InfiniHost and ConnectX (mixed) HCAs present, install\r
1186         ' using VENDOR_ID and DEV_ID.\r
1187 \r
1188         have_mlx4 = 0\r
1189         have_mthca = 0\r
1190 \r
1191         ' msgbox "InstallThis " & InstallThis\r
1192 \r
1193         have_mlx4       = instr(InstallThis,"hca_connectX")\r
1194         have_mthca      = instr(InstallThis,"hca_mthca")\r
1195         need_IPOIB      = instr(InstallThis,"fIPoIB")\r
1196 \r
1197         need_SRP        = instr(InstallThis,"fSRP") _\r
1198                                         AND fso.FileExists(sInstalldir & "SRP\ib_srp.inf")\r
1199 \r
1200         need_VNIC       = instr(InstallThis,"fVNIC") _\r
1201                                         AND fso.FileExists(sInstalldir & "qlgcvnic\netvnic.inf")\r
1202 \r
1203         ' Flag Windows LongHorn Install (aka Vista | Server 2008)\r
1204         If VersionNT >= 600 Then\r
1205                 WLH = 1\r
1206         Else\r
1207                 WLH = 0\r
1208         End if\r
1209 \r
1210     DriverInstall=0\r
1211 \r
1212         ' Use DPINST.EXE for Svr 2008 & Vista Driver Install (Windows LongHorn)\r
1213         ' otherwise use devman.\r
1214 \r
1215         If WLH Then\r
1216             DriverInstall = dpinst_install(WshShell,sInstalldir,need_IPOIB,_\r
1217                                                                                 need_VNIC,need_SRP)\r
1218         Else\r
1219             DriverInstall = devman_install(WshShell,sInstalldir,have_mthca,_\r
1220                                                                                 have_mlx4,need_IPOIB,need_VNIC,need_SRP)\r
1221         End If\r
1222 \r
1223 End Function\r
1224 \r
1225 \r
1226 \r
1227 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\r
1228 \r
1229 ' Find IBA devices using Devcon\r
1230 \r
1231 Function Find_IBA_Devices(WshShell,sInstalldir) \r
1232         Dim dev\r
1233 \r
1234         Set ibaDevicesExec = WshShell.Exec ("cmd.exe /c cd " & sInstalldir & "IBcore & devman.exe findall * | FIND ""IBA""")\r
1235 \r
1236         ' Set ibaDevicesExec = WshShell.Exec ("cmd.exe /c cd " & sInstalldir & "IBcore & devman.exe find IBA\*")\r
1237 \r
1238         ibaDevices = split(ibaDevicesExec.StdOut.ReadAll, vbCrLF)\r
1239 \r
1240         ' Determine the actual array Size - dump nonessential lines from cmd output.\r
1241         dim arrSize\r
1242         arrSize = 0\r
1243         For each dev in ibaDevices\r
1244                 if (Instr(dev,"IBA\") = 1) Then\r
1245                         arrSize = arrSize + 1\r
1246                 End if\r
1247         Next\r
1248         'Creating array of IBA\ devices\r
1249         dim ibaDev()\r
1250         Redim ibaDev(arrSize - 1)\r
1251         index = 0\r
1252         For each dev in ibaDevices\r
1253                 if (Instr(dev,"IBA\") = 1) Then\r
1254                         ibaDev(index) = dev\r
1255                         index = index + 1\r
1256                 End if\r
1257         Next\r
1258 \r
1259         Find_IBA_Devices=ibaDev \r
1260 \r
1261 End Function\r
1262 \r
1263 \r
1264 ' returns an array of all Local Area Connections which\r
1265 ' were created for IPoIB.\r
1266 \r
1267 Function Find_IPOIB_LAC()\r
1268         Dim WinOS,cmd,base,dev\r
1269 \r
1270         Set WshShell = CreateObject("WScript.Shell")\r
1271         base = "cmd.exe /c reg query HKLM\SYSTEM\CurrentControlSet\Control\Network"\r
1272         WinOS = Session.Property("VersionNT")\r
1273 \r
1274         If (WinOS <> 501) Then\r
1275                 ' Win2K3 style\r
1276                 cmd = base & " /f ""IBA\IPOIB"" /s /d | FIND ""Connection"" "\r
1277         Else\r
1278                 ' XP style\r
1279                 cmd = base & " /s | FIND ""}\Connection"" " \r
1280         End if\r
1281 \r
1282         Set ibaDevicesExec = WshShell.Exec ("cmd.exe /C " & cmd)\r
1283 \r
1284         ibaDevices = split(ibaDevicesExec.StdOut.ReadAll, vbCrLF)\r
1285 \r
1286         ' determine the array Size\r
1287         dim arrSize\r
1288         arrSize = 0\r
1289         for each dev in ibaDevices\r
1290                 arrSize = arrSize + 1\r
1291         next\r
1292         'Creating array of Local Area Connections based on IPoIB\r
1293         dim ibaDev()\r
1294         Redim ibaDev(arrSize - 1)\r
1295         index = 0\r
1296 \r
1297         For each dev in ibaDevices\r
1298                 If dev = "" Then\r
1299                 ElseIf WinOS <> 501 then\r
1300                         ' ibaDev(index) = dev\r
1301                         delstr = Left(dev,Len(dev)-Len("\Connection"))\r
1302                         ibaDev(index) = delstr\r
1303                         index = index + 1\r
1304                 Else\r
1305                         ' XP reg.exe format sucks, unable to filter IBA\IPOIB, so we do\r
1306                         ' it here....sigh.\r
1307                         Set rex = WshShell.Exec ("cmd.exe /C reg.exe query " & dev & _\r
1308                                                                         " /v PnpInstanceID | FIND ""IBA\IPOIB"" ")\r
1309                     resp = split(rex.StdOut.ReadAll, vbCrLF)\r
1310                     For each re in resp\r
1311 '                               msgbox "XP dev " & dev\r
1312 '                               msgbox "XP re " & re\r
1313                             if Instr(re,"IPOIB") Then\r
1314                                 delstr = Left(dev,Len(dev)-Len("\Connection"))\r
1315                                     ibaDev(index) = delstr\r
1316                                     index = index + 1\r
1317                      Exit For\r
1318                             End If\r
1319                         next\r
1320                 End if\r
1321         next\r
1322         Find_IPOIB_LAC=ibaDev\r
1323 \r
1324 End Function\r
1325 \r
1326 \r
1327 ' Remove 3rd party (OEM) driver package, identified by the string LookFor.\r
1328 \r
1329 Function remove_INF_file(WshShell,exe,LookFor)\r
1330 \r
1331     Dim cmd,cmdDM,use_dpinst,pfile\r
1332 \r
1333         ' using dpinst.exe[WLH] or devman.exe[wnet/xp]?\r
1334         use_dpinst = Instr(exe,"dpinst")\r
1335 \r
1336         cmd = "cmd.exe /c for /f %i in ('findstr /m /c:""" & LookFor _\r
1337                         & """ %WINDIR%\inf\oem*.inf') do @echo %i"\r
1338 \r
1339     Set infFilesExec = WshShell.Exec ( cmd )\r
1340 \r
1341     InfFiles = infFilesExec.StdOut.ReadAll\r
1342     IFILES = Split(InfFiles,vbCrLf)\r
1343 ' msgbox "remove_INF_File LookFor " & LookFor \r
1344         On Error Resume Next \r
1345     For Each file in IFILES\r
1346         If (file <> "") Then\r
1347                         ' most common is devman.exe \r
1348                 cmd = exe & " -f dp_delete " & file\r
1349                         if use_dpinst then\r
1350                                 cmdDM = cmd\r
1351                                 cmd = exe & " /U """ & file & """ /S /D"\r
1352                         end if\r
1353 ' msgbox cmd \r
1354                 Return = WshShell.Run (cmd, 0, true)\r
1355                         if use_dpinst then\r
1356                                 ' use devman.exe to delete all .inf referenced files\r
1357                                 Return = WshShell.Run (cmdDM, 0, true)\r
1358                         end if\r
1359                         ' make sure the .inf & .pnf files are removed.\r
1360                         pfile = replace(file,".inf",".pnf")\r
1361                         FileDelete file\r
1362                         FileDelete pfile\r
1363         End IF\r
1364     Next\r
1365 \r
1366         remove_INF_file = 0\r
1367 \r
1368 End Function\r
1369 \r
1370 \r
1371 ' Not used - run the specified command during next startup.\r
1372 \r
1373 Function RunAtReboot(name,run_once_cmd)\r
1374         dim key_name\r
1375         key_name = "Software\Microsoft\Windows\CurrentVersion\RunOnce"\r
1376         AddRegStringValue key_name,name,run_once_cmd\r
1377         msgbox "RunAtReboot( " & name & " , " & run_once_cmd & " )"\r
1378     RunAtReboot = 0\r
1379 End Function\r
1380 \r
1381 \r
1382 ' Remove QLogic VNIC instances\r
1383 \r
1384 Sub Uninstall_VNIC(fso,WshShell,devices,sInstalldir,VersionNT)\r
1385 \r
1386         Dim devman,Return,device,dt,sDRIVERS,tool\r
1387 \r
1388         devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1389 \r
1390         If IsNull(devices) Then\r
1391                 ' create a list of IBA\* devices via "devcon find"\r
1392                 devices = Find_IBA_Devices(WshShell,sInstalldir)\r
1393         End If\r
1394 \r
1395         For each devTarget in devices\r
1396             If (Instr(devTarget,"IBA\V00066AP00000030")) Then\r
1397                 device = split(devTarget, ":")\r
1398                 dt = rtrim(device(0))\r
1399                         ' disable instance - double quote complex device name for success.\r
1400                         Return = WshShell.Run (devman & "disable ""@" & dt & """", 0, true)\r
1401                 ' Removing the Qlogic Vnic I/O Unit\r
1402                 Return = WshShell.Run (devman & "remove ""@" & dt & """", 0, true)\r
1403             End if\r
1404         Next\r
1405 \r
1406         If VersionNT >= 600 Then\r
1407                 tool = "cmd.exe /c cd /d " & sInstalldir & "IBcore & dpinst.exe "\r
1408         Else\r
1409                 tool = devman\r
1410         End If\r
1411 \r
1412         remove_INF_file WshShell,tool,"qlgcvnic.sys"\r
1413 \r
1414         sDRIVERS = Session.Property("WindowsFolder") & "system32\drivers\"\r
1415         DriverFileDelete fso,WshShell,sDRIVERS & "vnic.sys"\r
1416         DriverFileDelete fso,WshShell,sDRIVERS & "qlgcvnic.sys"\r
1417 \r
1418 End Sub\r
1419 \r
1420 \r
1421 Sub Uninstall_SRP(fso,WshShell,devices,sInstalldir,VersionNT)\r
1422 \r
1423         Dim devman,devmanRMAT,devmanDAAT,Return,device,sDRIVERS,tool\r
1424 \r
1425         ' QLogic Virtual FC I/O controller or\r
1426         ' InfiniBand SRP Miniport: IBA\C0100C609EP0108 or IBA\CFF00C609EP0108\r
1427         ' one driver handles all three.\r
1428         DID = Array(_\r
1429                         "IBA\V000002P00005A44",_\r
1430                         "IBA\C0100C609EP0108",_\r
1431                         "IBA\CFF00C609EP0108",_\r
1432                         "IBA\V00066AP00000038")\r
1433 \r
1434         devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1435         devmanRMAT = devman & "remove @"\r
1436         devmanDAAT = devman & "disable @"\r
1437 \r
1438         If IsNull(devices) Then\r
1439                 ' create a list of IBA\* devices via "devcon find"\r
1440                 devices = Find_IBA_Devices(WshShell,sInstalldir)\r
1441         End If\r
1442 \r
1443         ' Remove SRP devices\r
1444         '       QLogic Virtual FC I/O controller instance?\r
1445         '       Either: IBA\C0100C609EP0108 or IBA\CFF00C609EP0108\r
1446         '       Linux SRP target: IBA\V000002P00005A44\r
1447         For each ID in DID\r
1448                 For each deviceCan in devices\r
1449                         If Instr(deviceCan,ID) <> 0 Then\r
1450                                 device = split(deviceCan, ":")\r
1451                         dt = rtrim(device(0))\r
1452                                 ' disable the instance\r
1453                                 Return = WshShell.Run (devmanDAAT & dt, 0, true)\r
1454                                 ' Removing SRP device\r
1455                                 Return = WshShell.Run (devmanRMAT & dt, 0, true)\r
1456 'msgbox "Uninstall_SRP() " & devmanRMAT & dt & " rc " & Return\r
1457                         End if\r
1458                 Next\r
1459         Next\r
1460 \r
1461         If VersionNT >= 600 Then\r
1462                 ' use dpinst.exe instead of devman.exe for Windows LongHorn++\r
1463                 tool = replace(devman,"devman","dpinst")\r
1464         Else\r
1465                 tool = devman\r
1466         End If\r
1467 \r
1468         remove_INF_file WshShell,tool,"ibsrp.sys"\r
1469 \r
1470         sDRIVERS = Session.Property("WindowsFolder") & "system32\drivers\"\r
1471         DriverFileDelete fso,WshShell,sDRIVERS & "ibsrp.sys"\r
1472 \r
1473 End Sub\r
1474 \r
1475 \r
1476 Sub RemoveDevice(WshShell,sInstalldir,DeviceTag)\r
1477 \r
1478         dim devices,device,devman,devmanRMAT,devTarget,dt,Return\r
1479 \r
1480         devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1481         devmanRMAT = devman & "remove ""@"\r
1482 \r
1483         devices = Find_Dev_by_Tag(WshShell,devman,"findall",DeviceTag)\r
1484 \r
1485         If Not IsNull(devices) Then\r
1486 \r
1487                 For each devTarget in devices\r
1488                     If (Instr(devTarget,DeviceTag)) Then\r
1489                         device = split(devTarget, ":")\r
1490                         dt = rtrim(device(0))\r
1491                         Return = WshShell.Run (devmanRMAT & dt & """", 0, true)\r
1492                     End if\r
1493                 Next\r
1494 \r
1495         End if\r
1496 \r
1497 End Sub\r
1498 \r
1499 Sub remove_all_HCA_devices(WshShell,sInstalldir)\r
1500 \r
1501         RemoveDevice WshShell,sInstalldir,"MLX4\CONNECTX_HCA"\r
1502         RemoveDevice WshShell,sInstalldir,"PCI\VEN_15B3"\r
1503 \r
1504 End Sub\r
1505 \r
1506 Function Uninstall_IB_Devices(sInstalldir,VersionNT,sRemove)\r
1507 \r
1508         Dim WshShell, fso, devices, cmd, dpinst, devman, devmanRMAT, tool\r
1509 \r
1510         devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1511 \r
1512         devmanRMAT = devman & "remove @"\r
1513         devmanDAAT = devman & "disable @"\r
1514 \r
1515         Set WshShell = CreateObject("WScript.Shell")\r
1516         Set fso = CreateObject("Scripting.FileSystemObject")\r
1517 \r
1518         If (fso.FileExists(sInstalldir & "IBcore\dpinst.exe") = False) Then\r
1519             Exit Function ' no reason to continue without the tool.\r
1520         End if\r
1521 \r
1522         If (fso.FileExists(sInstalldir & "IBcore\devman.exe") = False) Then\r
1523             Exit Function ' no reason to continue without the tool.\r
1524         End if\r
1525 \r
1526         ' create a list of IBA\* devices via "devcon find"\r
1527 \r
1528         devices = Find_IBA_Devices(WshShell,sInstalldir)\r
1529 \r
1530         Uninstall_SRP fso,WshShell,devices,sInstalldir,VersionNT\r
1531 \r
1532         Uninstall_VNIC fso,WshShell,devices,sInstalldir,VersionNT\r
1533 \r
1534         ' remove IB I/O Unit driver\r
1535         For each devTarget in devices\r
1536             If (Instr(devTarget,"InfiniBand I/O Unit")) Then\r
1537                 device = split(devTarget, ":")\r
1538                 dt = rtrim(device(0))\r
1539                         ' double-quote device name to ensure success.\r
1540                         Return = WshShell.Run (devman & "disable ""@" & dt & """", 0, true)\r
1541                 ' Removing the I/O Unit\r
1542                 Return = WshShell.Run (devman & "remove ""@" & dt & """", 0, true)\r
1543             End if\r
1544         Next\r
1545 \r
1546         ' remove IPoIB devices\r
1547 \r
1548         For each devTarget in devices\r
1549             If (Instr(devTarget,"IBA\IPOIB")) Then\r
1550                 device = split(devTarget, " ")\r
1551                 dt = rtrim(device(0))\r
1552                         ' no need to double-quote simple IPoIB device name.\r
1553                         Return = WshShell.Run (devmanDAAT & dt, 0, true)\r
1554                 ' Remove the IPoIB device instance\r
1555                 Return = WshShell.Run (devmanRMAT & dt, 0, true)\r
1556             End if\r
1557         Next\r
1558 \r
1559         remove_all_HCA_devices WshShell,sInstalldir\r
1560 \r
1561         ' Old (CoInstaller version) ibbus GUID - just in case.\r
1562         Return = WshShell.Run (devman & "remove {94F41CED-78EB-407C-B5DF-958040AF0FD8",0,true)\r
1563 \r
1564     ' remove 3rd party driver packages (ibsrp, vnic, ipoib, mthca, ConnectX)\r
1565         ' use dpinst.exe for Server 2008 & Vista as dpinst was used to install.\r
1566 \r
1567         If VersionNT >= 600 Then\r
1568                 tool = "cmd.exe /c cd /d " & sInstalldir & "IBcore & dpinst.exe "\r
1569         Else\r
1570                 tool = devman\r
1571         End If\r
1572 \r
1573         remove_INF_file WshShell,tool,"ibiou"\r
1574         remove_INF_file WshShell,tool,"ipoib"\r
1575         remove_INF_file WshShell,tool,"mthca"\r
1576         remove_INF_file WshShell,tool,"mlx4_"\r
1577     \r
1578         Uninstall_IB_Devices = 0\r
1579 \r
1580 End Function\r
1581 \r
1582 \r
1583 \r
1584 ''''''''''' Driver Uninstall ''''''''''''\r
1585 \r
1586 Sub DriverUninstall()  \r
1587         Dim sInstalldir, WshShell, fso, sVersionNT\r
1588 \r
1589         sInstalldir = Session.Property("INSTALLDIR")\r
1590 \r
1591         Set WshShell = CreateObject("WScript.Shell")\r
1592         Set fso = CreateObject("Scripting.FileSystemObject")\r
1593 \r
1594         ' WSD is not supported on XP and should NOT have been installed.\r
1595         ' otherwise, remove the service: ND (Network Direct) then WinSock Direct.\r
1596 \r
1597         sVersionNT = Session.Property("VersionNT")\r
1598         sRemove = Session.Property("REMOVE")\r
1599         If sRemove = "" Then\r
1600                 sRemove = "ALL"\r
1601         End If\r
1602 \r
1603         If sVersionNT <> 501 AND fso.FileExists(sInstalldir & "installsp.exe") Then\r
1604                 Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir & _\r
1605                                    " & installsp.exe -r", 0, true)\r
1606         End If\r
1607 \r
1608         If fso.FileExists(sInstalldir & "net\ndinstall.exe") Then\r
1609             Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir & _\r
1610                                    " & net\ndinstall.exe -r", 0, true)\r
1611         End If\r
1612         \r
1613         ' stop the openSM service in case it was started.\r
1614         Return = WshShell.Run ("cmd.exe /c sc.exe stop opensm", 0, true)\r
1615 \r
1616         ' delete opensm service from registry\r
1617         Return = WshShell.Run ("cmd.exe /c sc.exe delete opensm", 0, true)\r
1618         If Err Then ShowError\r
1619 \r
1620         Uninstall_IB_Devices sInstalldir,sVersionNT,sRemove\r
1621 \r
1622         ' Remove Service entries from the registry\r
1623 \r
1624         DeleteRegKey "System\CurrentControlSet\Services\ibbus"\r
1625         DeleteRegKey "System\CurrentControlSet\Services\mthca"\r
1626         DeleteRegKey "System\CurrentControlSet\Services\mlx4_bus"\r
1627         DeleteRegKey "System\CurrentControlSet\Services\mlx4_hca"\r
1628         DeleteRegKey "System\CurrentControlSet\Services\ipoib"\r
1629         DeleteRegKey "System\CurrentControlSet\Services\ibiou"\r
1630         DeleteRegKey "System\CurrentControlSet\Services\ibsrp"\r
1631         DeleteRegKey "System\CurrentControlSet\Services\qlgcvnic"\r
1632         DeleteRegKey "System\CurrentControlSet\Services\winverbs"\r
1633 \r
1634         ' Mthca\r
1635         DeleteRegValue "SYSTEM\CurrentControlSet\Control\CoDeviceInstallers" ,_\r
1636                                         "{58517E00-D3CF-40c9-A679-CEE5752F4491}"\r
1637 \r
1638         DeleteRegKey "SYSTEM\CurrentControlSet\Control\Class\{58517E00-D3CF-40C9-A679-CEE5752F4491}" \r
1639 \r
1640         ' Connectx (mlx4)\r
1641         DeleteRegValue "SYSTEM\CurrentControlSet\Control\CoDeviceInstallers" ,_\r
1642                                          "{31B0B28A-26FF-4dca-A6FA-E767C7DFBA20}"      \r
1643 \r
1644         DeleteRegKey "SYSTEM\CurrentControlSet\Control\Class\{31B0B28A-26FF-4dca-A6FA-E767C7DFBA20}"\r
1645 \r
1646         DeleteRegKey "SYSTEM\CurrentControlSet\Control\Class\{714995B2-CD65-4a47-BCFE-95AC73A0D780}"\r
1647         \r
1648         ' In livefish mode, the above does not always work - just in case.\r
1649         ' remove reg entries for ConnectX, mthca, ibbus, mlx4 & ipoib\r
1650         nukem = Array(_\r
1651                         "Control\Class\{58517E00-D3CF-40C9-A679-CEE5752F4491}",_\r
1652                         "Control\Class\{31B0B28A-26FF-4dca-A6FA-E767C7DFBA20}",_\r
1653                         "Control\Class\{714995B2-CD65-4a47-BCFE-95AC73A0D780}",_\r
1654                         "Services\ibbus",_\r
1655                         "Services\mthca",_\r
1656                         "Services\mlx4_bus",_\r
1657                         "Services\mlx4_hca",_\r
1658                         "Services\ipoib",_\r
1659                         "Services\EventLog\System\ipoib",_\r
1660                         "Services\ibiou",_\r
1661                         "Services\qlgcvnic",_\r
1662                         "Services\ibsrp",_\r
1663                         "Services\winmad",_\r
1664                         "Services\winverbs" )\r
1665 \r
1666         base = "reg.exe delete HKLM\SYSTEM\CurrentControlSet\" \r
1667 \r
1668         ' in livefish mode the delete didn't suceed, delete it in another way\r
1669     For each ID in nukem\r
1670                 If ID <> "" Then\r
1671                         Return = WshShell.Run (base & ID & " /f", 0, true)\r
1672                 End if\r
1673         Next\r
1674 \r
1675         ' Cleanup KMDF CoInstaller Driver entries.\r
1676         Return = WshShell.Run (base & "Control\Wdf\Kmdf\kmdflibrary\versions\1\driverservices /v mlx4_bus /f", 0, true)\r
1677         Return = WshShell.Run (base & "Control\Wdf\Kmdf\kmdflibrary\versions\1\driverservices /v winverbs /f", 0, true)\r
1678         Return = WshShell.Run (base & "Control\Wdf\Kmdf\kmdflibrary\versions\1\driverservices /v winmad /f", 0, true)\r
1679 \r
1680 ' Not yet\r
1681 '       Return = WshShell.Run ("reg.exe delete HKLM\Software\Microsoft\Windows\currentVersion\DIFx\DriverStore\WinVerbs_* /f", 0, true)\r
1682 '       Return = WshShell.Run ("reg.exe delete HKLM\Software\Microsoft\Windows\currentVersion\DIFx\DriverStore\ipoib_* /f", 0, true)\r
1683 '\r
1684 \r
1685         ' remove all Local Area Connection which were constructed for IPoIB\r
1686         ' create a list of IBA\IPOIB Local Area Connections via 'reg query'\r
1687         Dim IPOIB_LAC\r
1688         IPOIB_LAC = Find_IPOIB_LAC\r
1689 \r
1690         For each LAC in IPOIB_LAC\r
1691                 If LAC <> "" Then\r
1692                         Return = WshShell.Run ("reg.exe delete " & LAC & " /f", 0, true)\r
1693                         If Err Then ShowErr\r
1694                 End if\r
1695         Next\r
1696 \r
1697         ' remove driver installed files\r
1698         RemoveDriverFiles WshShell\r
1699         \r
1700         Session.Property("REBOOT") = "FORCE"      \r
1701         err.clear \r
1702 End Sub\r
1703 \r
1704 \r
1705 ' Enable WSD if installsp.exe was installed (feature Winsock direct selected).\r
1706 ' For Windows XP, this CustomAction should not be called as WSD is not\r
1707 ' supported on XP.\r
1708 \r
1709 Sub WSDEnable()\r
1710       Dim sInstalldir, WshShell, fso\r
1711 \r
1712       sInstalldir = Session.Property("INSTALLDIR")\r
1713 \r
1714       Set WshShell = CreateObject("WScript.Shell")\r
1715       Set fso = CreateObject("Scripting.FileSystemObject")\r
1716 \r
1717       If fso.FileExists(sInstalldir & "installsp.exe") Then\r
1718           ' install the WinSockdirect service\r
1719           Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir _\r
1720                                  & " & installsp.exe -i", 0, true)\r
1721       End If\r
1722       If Err Then ShowError\r
1723 \r
1724 End Sub\r
1725 \r
1726 \r
1727 ' This sub will only be called if the feature ND start was selected.\r
1728 ' See WIX src file - ND_start\r
1729 \r
1730 Sub ND_StartMeUp()\r
1731       Dim sInstalldir, WshShell, fso\r
1732 \r
1733       sInstalldir = Session.Property("INSTALLDIR")\r
1734 \r
1735       Set WshShell = CreateObject("WScript.Shell")\r
1736       Set fso = CreateObject("Scripting.FileSystemObject")\r
1737 \r
1738     ' Start the Network Direct Service if installed\r
1739 \r
1740     If fso.FileExists(sInstalldir & "net\ndinstall.exe") Then\r
1741         Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir _\r
1742                                & " & net\ndinstall.exe -i", 0, true)\r
1743         If Err Then ShowErr2("ND service install failed")\r
1744     End If\r
1745 \r
1746 End Sub\r
1747 \r
1748 \r
1749 Sub ShowError()\r
1750     If Err.Number = 0 Then\r
1751         Exit Sub\r
1752     End if\r
1753         strMsg = vbCrLf & "Error # " & Err.Number & vbCrLf & _\r
1754                  Err.Description & vbCrLf & vbCrLf\r
1755         msgbox strMsg\r
1756 End Sub\r
1757 \r
1758 \r
1759 Sub ErrMsg(msg)\r
1760     If Err.Number <> 0 Then\r
1761             msgbox msg & vbCrLf & "Err # " & Err.Number & vbCrLf & Err.Description\r
1762         Err.clear\r
1763     End if\r
1764 End Sub\r
1765 \r
1766 Function ShowErr2(msg)\r
1767     If Err.Number <> 0 Then\r
1768             strMsg = vbCrLf & "Err # " & Err.Number & vbCrLf & _\r
1769                      Err.Description & vbCrLf\r
1770             msgbox msg & strMsg\r
1771     End if\r
1772     ShowErr2=Err.Number\r
1773 End Function\r
1774 \r
1775 \r
1776 ' Wix installer now handles this, no longer used although left as example.\r
1777 ' Create OpenSM (Subnet Management) windows service disabled.\r
1778 \r
1779 Sub OpenSM_Install\r
1780     Dim sInstalldir,opensmPath,WshShell,fso,sc\r
1781 \r
1782     sInstalldir = Session.Property("INSTALLDIR")\r
1783     opensmPath = sInstalldir & "opensm.exe"\r
1784 \r
1785     Set fso = CreateObject("Scripting.FileSystemObject")\r
1786     Set WshShell = CreateObject("WScript.Shell")\r
1787     \r
1788     ' opensm.exe is required\r
1789     If Not fso.FileExists(opensmPath) Then\r
1790         Exit Sub\r
1791     End if\r
1792 \r
1793     sc = "sc.exe create opensm binPath= """ &opensmPath _\r
1794                 & " -e --service"" DisplayName= ""InfiniBand Subnet Manager"" "\r
1795 \r
1796     ' Install OpeSM as a 'disabled' Service\r
1797     sc = sc & "start= disabled"\r
1798     Return = WshShell.Run ("cmd.exe /c " & sc, 0, true)\r
1799     sc = "sc.exe description opensm ""Configures and manage the InfiniBand Subnet"" "\r
1800     Return = WshShell.Run ("cmd.exe /c " & sc, 0, true)\r
1801     err.clear\r
1802 \r
1803 End Sub\r
1804 \r
1805 \r
1806 ' CustomAction called by Wix installer to convert disabled OpenSM service to\r
1807 ' to an 'auto' startup at boot. Performs conversion and then starts service.\r
1808 \r
1809 Sub OpenSM_StartMeUp\r
1810     Dim sInstalldir, opensmPath, WshShell, fso\r
1811 \r
1812     sInstalldir = Session.Property("INSTALLDIR")\r
1813     opensmPath = sInstalldir & "opensm.exe"\r
1814 \r
1815     Set fso = CreateObject("Scripting.FileSystemObject")\r
1816     Set WshShell = CreateObject("WScript.Shell")\r
1817     \r
1818     ' opensm.exe is required\r
1819     If Not fso.FileExists(opensmPath) Then\r
1820         Exit Sub\r
1821     End if\r
1822 \r
1823     Return = WshShell.Run ("cmd.exe /c sc.exe config opensm start= auto",0,true)\r
1824     Return = WshShell.Run ("cmd.exe /c sc.exe start opensm", 0, true)\r
1825     Err.clear\r
1826 \r
1827 End Sub\r
1828 \r
1829 \r
1830 ' NOT USED - WIX now handles this\r
1831 ' If not present, then create %SystemDrive%\DAT\dat.conf\r
1832 \r
1833 Function DAPL_setup()\r
1834       Dim sSysDrive, SrcFile, DstFile, WshShell, fso\r
1835 \r
1836       Set WshShell = CreateObject("WScript.Shell")\r
1837       Set fso = CreateObject("Scripting.FileSystemObject")\r
1838 \r
1839       DAPL_setup = 0\r
1840       Err.clear\r
1841 \r
1842       SrcFile = Session.Property("INSTALLDIR") & "dat.conf"\r
1843 \r
1844       If fso.FileExists(SrcFile) Then\r
1845               On Error Resume Next \r
1846           sSysDrive = Session.Property("WindowsVolume")\r
1847           ' sSysDrive = WshShell.ExpandEnvironmentStrings("%SystemDrive%") \r
1848           ' WindowsVolume includes root \, where %SystemDrive% does not.\r
1849           DstFile = sSysDrive & "DAT\dat.conf"\r
1850           If fso.FileExists(DstFile) Then\r
1851               ' Preserve existing %SystemDrive%\DAT\dat.conf\r
1852               Exit Function\r
1853           End if\r
1854           fso.CopyFile SrcFile, DstFile\r
1855       End if\r
1856 End Function\r
1857 \r
1858 \r
1859 Sub ScheduleLocalReboot\r
1860                 \r
1861     Set objWMILocator = CreateObject ("WbemScripting.SWbemLocator") \r
1862       objWMILocator.Security_.Privileges.AddAsString "SeShutdownPrivilege",True \r
1863     Set objWMIServices = objWMILocator.ConnectServer(strComputerName, _\r
1864                         cWMINameSpace, strUserID, strPassword)\r
1865     Set objSystemSet = GetObject(_\r
1866         "winmgmts:{impersonationLevel=impersonate,(Shutdown)}")._\r
1867                                 InstancesOf("Win32_OperatingSystem")\r
1868 \r
1869     ' Forced restart\r
1870     For Each objSystem In objSystemSet\r
1871         objSystem.Win32Shutdown 2+4\r
1872         objSystem.Win32Shutdown 2+4\r
1873         objSystem.Win32Shutdown 2+4\r
1874     Next\r
1875                 \r
1876     'msgbox "Please wait while computer restarts ...",0,"WinOF"\r
1877 \r
1878 End Sub\r
1879 \r
1880 \r
1881 ' Determine if an existing WinOF or openib-window installation is present.\r
1882 ' If previous install exists, determined by registry entry for service/ibbus,\r
1883 ' then uninstall and reboot.\r
1884 ' Called in immediate mode, condition: INSTALL=1\r
1885 \r
1886 Function ChkInstallAndReboot()\r
1887     Const wshYes = 6\r
1888     Const wshNo = 7\r
1889     Const wshYesNoDialog = 4\r
1890     Const wshQuestionMark = 32\r
1891 \r
1892     Dim status ' check if ibbus.sys exists, if not the reboot won't happen\r
1893     Dim fso, originalReboot\r
1894     Set fso = CreateObject("Scripting.FileSystemObject")    \r
1895     status = 0\r
1896     \r
1897     Set WshShell = CreateObject("WScript.Shell")\r
1898     Return = WshShell.Run ("reg.exe query HKLM\SYSTEM\CurrentControlSet\Services\ibbus /v ImagePath", 0, true)\r
1899     If (Return = 0) And (Err.Number = 0) Then\r
1900         Status = Status + 1\r
1901     End if\r
1902     \r
1903     originalReboot = Session.Property("REBOOT")\r
1904 \r
1905     DriverUninstall\r
1906 \r
1907     ' if we can't find registry entry, then no need to uninstall/restart.\r
1908     ' Proceed with installation\r
1909     If status = 0 then\r
1910         ' msgbox "No existing InfiniBand installation detected"\r
1911         Session.Property("REBOOT") = originalReboot \r
1912         Exit Function\r
1913     End if\r
1914         \r
1915     Dim sys_folder, drv_folder\r
1916     ' Idea here is to rename driver files to force a driver\r
1917     ' load failure upon next reboot so ensuing install will\r
1918     ' succeed.\r
1919     sys_folder = Session.Property("WindowsFolder") & "system32"\r
1920     drv_folder = sys_folder & "\drivers"\r
1921         \r
1922     If fso.FileExists(drv_folder & "\ibbus.sys") Then\r
1923         FileMove drv_folder & "\ibbus.sys",drv_folder & "\ibbus.sy1"\r
1924     End if\r
1925     If fso.FileExists(drv_folder & "\mthca.sys") Then\r
1926         FileMove drv_folder & "\mthca.sys",drv_folder & "\mthca.sy1"\r
1927     End if      \r
1928     If fso.FileExists(sys_folder & "\ibinstaller.dll") Then\r
1929         FileMove sys_folder & "\ibinstaller.dll",sys_folder & "\ibinstaller1.dll"\r
1930     End if\r
1931 \r
1932     ' Notify the user an existing non WinOF IB installation was detected and\r
1933     ' the system will be rebooted.\r
1934     dim res\r
1935         \r
1936     res = WshShell.popup("Existing InfiniBand installation has been removed." _\r
1937              & vbCRLF & vbCRLF & "Automatic REBOOT in 10 seconds."_\r
1938              & vbCRLF & "Please re-install WinOF."_\r
1939              ,13,"WinOF - Existing InfiniBand installation Detected")\r
1940  \r
1941     'run_once_cmd = Session.Property("SETUPEXEDIR") & "\setup.exe"\r
1942     'RunAtReboot "WinOF", run_once_cmd\r
1943     \r
1944     ' the _Driver Uninstall call sets reboot=force. The ForceReboot action\r
1945     ' following this CustomAction will fire when reboot is set =force.\r
1946     ' The problem is we need to fail the installation so it cleans up, not\r
1947     ' a partial install, and still reboots - So far IS-12 doesn;t support\r
1948     ' this behavior.\r
1949 \r
1950     ScheduleLocalReboot\r
1951 \r
1952     ' Fail the install so cleanup occurs.\r
1953     ' Upon system restart, WinOF installation needs to be restarted \r
1954     ' consider a run-once invocation.\r
1955 \r
1956         ChkInstallAndReboot = 2 ' will force install cleanup.\r
1957 \r
1958 End Function\r
1959 \r
1960 \r
1961 ' Not Used - idea was to run %SystemRoot%\temp\WinOFcleanup.bat on the next\r
1962 ' reboot to remove driver files which did not get uninstalled (win2K3 only);\r
1963 ' script ran, files persisted on Win2K3? WIX call to invoke this Sub was\r
1964 ' removed.\r
1965 \r
1966 Sub RunOnceCleanup\r
1967   Dim fso, sInstalldir, sTemp, cmd\r
1968   Set fso=CreateObject("Scripting.FileSystemObject") \r
1969 \r
1970   On Error Resume Next\r
1971 \r
1972   sInstalldir = Session.Property("REMOVE")\r
1973   If sInstalldir <> "ALL" Then\r
1974       Exit Sub\r
1975   End if\r
1976 \r
1977   sInstalldir = Session.Property("INSTALLDIR")\r
1978 \r
1979   If Not fso.FileExists(sInstalldir & "WinOFclean.bat") Then\r
1980      Exit Sub\r
1981   End if\r
1982 \r
1983   ' copy WinOFclean.bat to %SystemRoot%\temp for runOnce cmd\r
1984   sTemp = fso.GetSpecialFolder(0) & "\temp\WinOFclean.bat"\r
1985   Err.clear\r
1986   fso.CopyFile sInstalldir & "WinOFclean.bat", sTemp \r
1987   If Err.Number = 0 Then\r
1988       cmd = "cmd.exe /C " & sTemp\r
1989       RunAtReboot "WinOF", cmd\r
1990       ' 2nd cmd to remove previous script.\r
1991       cmd = "cmd.exe /C del /F/Q " & sTemp\r
1992       RunAtReboot "WinOF2", cmd\r
1993   End if\r
1994 \r
1995 End Sub\r
1996 \r
1997 \r
1998 ' WIX has appended [INSTALLDIR] to the system search path via <Environment>.\r
1999 ' Unfortunately WIX does not _Broadcast_ to all top-level windows the registry\r
2000 ' Settings for '%PATH%' have changed. Run nsc to do the broadcast.\r
2001  \r
2002 Sub BcastRegChanged\r
2003     Dim sInstallDir\r
2004     Set WshShell=CreateObject("WScript.Shell")\r
2005 \r
2006     sInstallDir = Session.Property("INSTALLDIR")\r
2007 \r
2008         On Error Resume Next \r
2009     WshShell.Run "%COMSPEC% /c cd /d " & sInstallDir & " & nsc.exe", 0, true\r
2010     Err.clear\r
2011     BcastRegChanged = 0\r
2012 \r
2013 End Sub\r
2014 \r
2015 \r
2016 ' This routine should never be...InstallShield-12 for some reason has\r
2017 ' decided not to completely remove [INSTALLDIR]? Until such a time\r
2018 ' that 'why' is understood, this routine removes [INSTALLDIR]! Sigh...\r
2019 ' nuke some driver files which remain due to devcon device install.\r
2020 ' Immediate execution; called after MsiCleanupOnSuccess (REMOVE="ALL")\r
2021 \r
2022 Sub HammerTime\r
2023     Dim fso, sInstallDir, rc, cmd\r
2024 \r
2025     Set fso=CreateObject("Scripting.FileSystemObject") \r
2026     Set WshShell=CreateObject("WScript.Shell")\r
2027 \r
2028     sInstallDir = Session.Property("INSTALLDIR")\r
2029     If fso.FolderExists(sInstallDir) Then\r
2030         cmd = "cmd.exe /c rmdir /S /Q """ & sInstallDir & """"\r
2031         rc = wshShell.Run(cmd,0,true)\r
2032     End if\r
2033 \r
2034     RemoveFolder "C:\IBSDK"\r
2035 \r
2036     ' WIX does this - SysPathRemove(sInstallDir)\r
2037 \r
2038 End Sub\r
2039 \r
2040 \r
2041 ' NOT USED - deferred action to increment ticks while action is taking place\r
2042 '\r
2043 Function AddProgressInfo( )\r
2044         Const INSTALLMESSAGE_ACTIONSTART = &H08000000\r
2045         Const INSTALLMESSAGE_ACTIONDATA  = &H09000000 \r
2046         Const INSTALLMESSAGE_PROGRESS    = &H0A000000 \r
2047 \r
2048         Set rec = Installer.CreateRecord(3)\r
2049         \r
2050         rec.StringData(1) = "callAddProgressInfo"\r
2051         rec.StringData(2) = "Incrementing the progress bar..."\r
2052         rec.StringData(3) = "Incrementing tick [1] of [2]"\r
2053         \r
2054         'Message INSTALLMESSAGE_ACTIONSTART, rec\r
2055         \r
2056         rec.IntegerData(1) = 1\r
2057         rec.IntegerData(2) = 1\r
2058         rec.IntegerData(3) = 0\r
2059         \r
2060         Message INSTALLMESSAGE_PROGRESS, rec\r
2061         \r
2062         Set progrec = Installer.CreateRecord(3)\r
2063         \r
2064         progrec.IntegerData(1) = 2\r
2065         progrec.IntegerData(2) = 5000\r
2066         progrec.IntegerData(3) = 0\r
2067         \r
2068         rec.IntegerData(2) = 1500000\r
2069         \r
2070         For i = 0 To 5000000 Step 5000\r
2071             rec.IntegerData(1) = i\r
2072             ' action data appears only if a text control subscribes to it\r
2073             ' Message INSTALLMESSAGE_ACTIONDATA, rec\r
2074             Message INSTALLMESSAGE_PROGRESS, progrec\r
2075         Next ' i\r
2076         \r
2077         ' return success to MSI\r
2078         AddProgressInfo = 0\r
2079 End Function\r
2080 \r
2081 \r
2082 ' Called when .msi 'CHANGE' (ADD/REMOVE) installation was selected.\r
2083 ' Currently only handles SRP & VNIC\r
2084 \r
2085 Function InstallChanged\r
2086 \r
2087     Dim rc, sInstallDir, sAddLocal, sRemove, sDRIVERS, NeedReboot, WLH\r
2088     Err.clear\r
2089 \r
2090     sRemove = Session.Property("REMOVE")\r
2091         If sRemove = "ALL" Then\r
2092                 Exit Function\r
2093         End If\r
2094 \r
2095     Set WshShell=CreateObject("WScript.Shell")\r
2096     Set fso = CreateObject("Scripting.FileSystemObject")\r
2097 \r
2098         NeedReboot = 0\r
2099 \r
2100     sInstalldir = Session.Property("INSTALLDIR")\r
2101     sAddLocal = Session.Property("ADDLOCAL")\r
2102 \r
2103         ' Flag Windows LongHorn Install (aka Vista | Server 2008)\r
2104         VersionNT = Session.Property("VersionNT")\r
2105         If VersionNT >= 600 Then\r
2106                 WLH = 1\r
2107         Else\r
2108                 WLH = 0\r
2109         End if\r
2110 \r
2111         On Error Resume Next \r
2112 \r
2113         If (Not IsNull(sAddLocal)) AND (sAddLocal <> "") Then\r
2114                 If Instr(sAddLocal,"fSRP") OR Instr(sAddLocal,"fVNIC") Then\r
2115                         ' IOU driver loaded into driver store when HCA driver installed.\r
2116                         If WLH = 0 Then\r
2117                                 devman_Install_IOU WshShell,sInstalldir\r
2118                         End If\r
2119                 End If\r
2120 \r
2121                 If Instr(sAddLocal,"fSRP") Then\r
2122                 If fso.FileExists(sInstalldir & "SRP\ib_srp.inf") Then\r
2123                                 If WLH Then\r
2124                                         rc = dpinst_Install_SRP(WshShell,sInstalldir)\r
2125                                 Else\r
2126                                         rc = devman_Install_SRP(WshShell,sInstalldir)\r
2127                                 End If\r
2128                         Else\r
2129                         msgbox "ERR: missing " & sInstalldir & "SRP\ib_srp.inf"\r
2130                         End If\r
2131                 End If\r
2132 \r
2133                 If Instr(sAddLocal,"fVNIC") Then\r
2134                 If fso.FileExists(sInstalldir & "qlgcvnic\netvnic.inf") Then\r
2135                                 If WLH Then\r
2136                                         rc = dpinst_Install_VNIC(WshShell,sInstalldir)\r
2137                                 Else\r
2138                                         devman_Install_VNIC WshShell,sInstalldir\r
2139                                 End If\r
2140                         Else\r
2141                                 msgbox "Err: missing " & sInstalldir & "qlgcvnic\netvnic.inf"\r
2142                         End If\r
2143                 End If\r
2144         End If\r
2145 \r
2146         If (Not IsNull(sRemove)) AND (sRemove <> "") Then\r
2147 \r
2148                 If Instr(sRemove,"fSRP") Then\r
2149                         Uninstall_SRP fso,WshShell,Null,sInstalldir,VersionNT\r
2150                         NeedReboot = NeedReboot + 1\r
2151                 End If\r
2152 \r
2153                 If Instr(sRemove,"fVNIC") Then\r
2154                         Uninstall_VNIC fso,WshShell,Null,sInstalldir,VersionNT\r
2155                         NeedReboot = NeedReboot + 1\r
2156                 End If\r
2157         End If\r
2158 \r
2159         If NeedReboot Then\r
2160                 Session.Property("REBOOT") = "FORCE"      \r
2161                 InstallChanged = ERROR_SUCCESS_REBOOT_REQUIRED\r
2162                 ' until forced reboot relly works....\r
2163                 msgbox "A system reboot is required to complete this operation." _\r
2164                                 & vbCrLf & "Please do so at your earliest convinence."\r
2165         End If\r
2166 \r
2167 End Function\r
2168 \r