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