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