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