bb75a0b51129fd4de3841a46c68f5d749f4fd7d7
[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     DriverFileDelete fso,WshShell,sDRIVERS & "winverbs.sys"\r
382     DriverFileDelete fso,WshShell,sSYS32 & "winverbs.dll"\r
383     DriverFileDelete fso,WshShell,sSYS32 & "winverbsd.dll"\r
384     \r
385     ' delete opensm files\r
386     sTemp = fso.GetSpecialFolder(0) & "\temp\"\r
387     ' remove files from %SystemRoot%\temp\r
388     FileDelete(sTemp & "guid2lid")\r
389     FileDelete(sTemp & "opensm-sa.dump")\r
390     FileDelete(sTemp & "osm.log")\r
391     FileDelete(sTemp & "osm-subnet.lst")\r
392     \r
393     ' Delete oem*.inf and oem*.pnf files\r
394     dim  InfFiles, PnfFiles, IFILES, PFILES\r
395     Set infFilesExec = WshShell.Exec ("cmd.exe /c for /f  %i in ('findstr /m Mellanox %WINDIR%\inf\oem*.*') do @echo %i")\r
396     ' Display error number and description if applicable\r
397     If Err Then ShowError\r
398     \r
399     InfFiles = infFilesExec.StdOut.ReadAll\r
400     PnfFiles = Replace(InfFiles,".inf",".pnf")\r
401     \r
402     IFILES = Split(InfFiles,vbCrLf)\r
403     PFILES = Split(PnfFiles,vbCrLf)\r
404     \r
405     For Each file in IFILES\r
406         If (file <> "") Then\r
407             FileDelete(file)\r
408         End IF\r
409     Next\r
410     \r
411     For Each file in PFILES\r
412         If (file <> "") Then\r
413             FileDelete(file)\r
414         End IF\r
415     Next\r
416     \r
417 End Function\r
418 \r
419 \r
420 ''''''''''' Delete registry key ''''''''''''\r
421 \r
422 Function DeleteRegKey(KeyPath)\r
423    Const HKEY_LOCAL_MACHINE = &H80000002\r
424    dim strComputer\r
425    strComputer = "."\r
426    Set objReg=GetObject("winmgmts:" & _\r
427        "{impersonationLevel=impersonate}!\\" & _\r
428        strComputer & "\root\default:StdRegProv")\r
429 \r
430    ' Display error number and description if applicable\r
431    ' If Err Then ShowError\r
432    Return = objReg.DeleteKey(HKEY_LOCAL_MACHINE, KeyPath)\r
433    \r
434 End Function\r
435 \r
436 \r
437 ''''''''''' Delete registry value ''''''''''''\r
438 \r
439 Function DeleteRegValue(strKeyPath, strValueName)\r
440    Const HKEY_LOCAL_MACHINE = &H80000002\r
441    \r
442    dim strComputer\r
443    strComputer = "."\r
444    \r
445    Set objReg=GetObject("winmgmts:" & _\r
446        "{impersonationLevel=impersonate}!\\" & _ \r
447        strComputer & "\root\default:StdRegProv")\r
448 \r
449     \r
450    Return = objReg.DeleteValue(HKEY_LOCAL_MACHINE, strKeyPath, strValueName)\r
451    ' Display error number and description if applicable\r
452    If Err Then ShowError\r
453 '    If (Return = 0) And (Err.Number = 0) Then\r
454 '           WScript.Echo value & "Registry value HKEY_LOCAL_MACHINE," & _\r
455 '             strKeyPath & "," & strValueName & "," & dwValue & " deleted"\r
456 '    Else\r
457 '           WScript.Echo "Registry value not deleted" & VBNewLine & _\r
458 '             "Error = " & Err.Number\r
459 '    End If\r
460 \r
461 End Function\r
462 \r
463 \r
464 \r
465 Function ReadSysPath\r
466 \r
467     Const HKEY_LOCAL_MACHINE = &H80000002\r
468     Dim strComputer, strKeyPath, strValueName, strValue\r
469 \r
470     ReadSysPath = Null  ' assume the worst.\r
471     strComputer = "."\r
472     Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ \r
473                         strComputer & "\root\default:StdRegProv")\r
474  \r
475     strKeyPath="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"\r
476     strValueName = "Path"\r
477     oReg.GetExpandedStringValue HKEY_LOCAL_MACHINE,_\r
478          strKeyPath, strValueName, strValue\r
479 \r
480     If (Err.Number = 0) And (Not IsNull(strValue)) Then\r
481         ReadSysPath = strValue\r
482     End if\r
483 End Function\r
484 \r
485 \r
486 Function WriteSysPath(NewPath)\r
487 \r
488     Const HKEY_LOCAL_MACHINE = &H80000002\r
489     Dim strComputer, strKeyPath, strValueName\r
490 \r
491     strComputer = "."\r
492     Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ \r
493                         strComputer & "\root\default:StdRegProv")\r
494  \r
495     strKeyPath="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"\r
496     strValueName = "Path"\r
497     oReg.SetExpandedStringValue _\r
498          HKEY_LOCAL_MACHINE, strKeyPath, strValueName, NewPath\r
499 \r
500     WriteSysPath = Err.Number\r
501 End Function\r
502 \r
503 \r
504 'Chops the last character off a string if it matches strchar\r
505 Function ChopChar(strString, strChar)\r
506   Dim x\r
507   x = Len(strString)\r
508   if mid(strString, x) = strChar then\r
509     ChopChar = mid(strString, 1, x -1)\r
510   else\r
511     ChopChar = strString\r
512   end if\r
513 End Function\r
514 \r
515 \r
516 ' Add specified path to the system search path registry entry @\r
517 ' 'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path'\r
518 ' Normally the added path is [INSTALLDIR]\r
519 ' Called from a defered exection context (aka, DriverInstall).\r
520 \r
521 Function SysPathAdd(InstallDir)\r
522 \r
523     Dim rc, result, sInstallDir, newPath\r
524 \r
525     ' On Error Resume Next\r
526     sInstallDir = ChopChar(InstallDir,"\")\r
527 \r
528     result = ReadSysPath\r
529     If IsNull(result) Then\r
530         SysPathAdd = ShowErr2("SysPathAdd - RegRead()")\r
531         Exit Function\r
532     End if\r
533 \r
534     ' Is [INSTALLDIR] already set?\r
535     start = instr(result,sInstallDir)\r
536     If start <> 0 Then\r
537         SysPathAdd = 0\r
538         Exit Function\r
539     End if\r
540 \r
541     newPath = result & ";" & sInstallDir\r
542 \r
543     rc = WriteSysPath(newPath)\r
544     If rc <> 0 Then\r
545         SysPathAdd = ShowErr2("SysPathAdd - WriteSysPath()")\r
546     Else\r
547        ' TODO - Notify current windows of updated PATH registry value.\r
548        SysPathAdd = 0\r
549     End if\r
550 \r
551 End Function\r
552 \r
553 \r
554 ' Remove specified path from the system search path.\r
555 \r
556 Function SysPathRemove(InstallDir)\r
557 \r
558     Dim rc, curPath, rKey, sInstallDir, newPath\r
559 \r
560     ' On Error Resume Next\r
561     ' sInstallDir = Session.Property("INSTALLDIR")\r
562 \r
563     sInstallDir = ";" & ChopChar(InstallDir,"\")\r
564 \r
565     curPath = ReadSysPath\r
566     If IsNull(curPath) Then\r
567         SysPathRemove = ShowErr2("SysPathRemove - ReadSysPath() = NULL?")\r
568         Exit Function\r
569     End if\r
570 \r
571     SysPathRemove = 0  ' assume SUCCESS\r
572 \r
573     start = instr(curPath,sInstallDir)\r
574     If start <> 0 Then\r
575         ' INSTALLDIR IS in the system search path\r
576         ' remove INSTALLDIR from system search path\r
577         s0 = Left(curPath,start-1)\r
578         s1 = Right(curPath,Len(curPath) - (start+Len(sInstallDir) - 1))\r
579         NewPath = s0 & s1\r
580         rc = WriteSysPath(NewPath)\r
581         If rc <> 0 Then\r
582             SysPathRemove = ShowErr2("SysPathRemove - WriteSysPath()")\r
583         End if\r
584     End if\r
585 \r
586 End Function\r
587 \r
588 \r
589 \r
590 ' not used\r
591 ''''''''''' Check installation status ''''''''''''\r
592 \r
593 Function install_verify()\r
594    Dim Status\r
595    Dim sInstalldir\r
596    sInstalldir = Session.Property("INSTALLDIR")\r
597    Set WshShell = CreateObject("WScript.Shell")\r
598    Set vstat = WshShell.Exec(sInstalldir & "\bin\vstat.exe")\r
599    install_verify = vstat.ExitCode\r
600 End Function\r
601 \r
602 '-------------------------------------------------------------\r
603 \r
604 ' add registry key\r
605 Function CreateRegKey(KeyPath)\r
606    Const HKEY_LOCAL_MACHINE = &H80000002\r
607    dim strComputer\r
608    strComputer = "."\r
609    Set objReg=GetObject("winmgmts:" & _\r
610        "{impersonationLevel=impersonate}!\\" & _\r
611        strComputer & "\root\default:StdRegProv")\r
612 \r
613    ' Display error number and description if applicable\r
614    If Err Then ShowError\r
615    Return = objReg.CreateKey(HKEY_LOCAL_MACHINE, KeyPath)\r
616    \r
617 End Function\r
618 \r
619 \r
620 \r
621 '--------------------------------------------------------\r
622 \r
623 \r
624 ' Function to add registry DWORD val.\r
625 Function AddRegDWORDValue(strKeyPath, strValueName, dwValue)\r
626     Const HKEY_LOCAL_MACHINE = &H80000002\r
627     strComputer = "."\r
628  \r
629     Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ \r
630                        strComputer & "\root\default:StdRegProv")\r
631     If Err Then ShowError\r
632  \r
633     oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,dwValue\r
634 \r
635     If Err Then ShowError\r
636 \r
637 End Function\r
638 \r
639 '-------------------------------------------------\r
640 \r
641 ' Function to add registry Expanded string val.\r
642 \r
643 Function AddRegExpandValue(strKeyPath, strValueName, dwValue)\r
644     Const HKEY_LOCAL_MACHINE = &H80000002\r
645     strComputer = "."\r
646  \r
647     Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ \r
648             strComputer & "\root\default:StdRegProv")\r
649  \r
650     If Err Then ShowError\r
651     oReg.SetExpandedStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,_\r
652          dwValue\r
653     If Err Then ShowError\r
654 \r
655 End Function\r
656 \r
657 '------------------------------------------------------------------------\r
658 \r
659 \r
660 ' Function to add registry string val.\r
661 \r
662 Function AddRegStringValue(strKeyPath, strValueName, dwValue)\r
663 Const HKEY_LOCAL_MACHINE = &H80000002\r
664 strComputer = "."\r
665  \r
666 Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ \r
667 strComputer & "\root\default:StdRegProv")\r
668  \r
669 If Err Then ShowError\r
670 oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,dwValue\r
671 If Err Then ShowError\r
672 \r
673 End Function\r
674 \r
675 '------------------------------------------------------------------------\r
676 \r
677 ' Return a list of PCI devices using 'devcon find | findall'\r
678 ' sFindHow - stringArg: devcon cmd arg {find | findall}\r
679 \r
680 Function Find_Dev_by_Tag(WshShell,exe,sFindHow,tag)\r
681     Dim cmd\r
682 \r
683         cmd = exe & " " & sFindHow & " * | find """ & tag & """"\r
684         Set connExec = WshShell.Exec(cmd)\r
685     If Err Then\r
686         msgbox "Shell.Exec err: " & cmd\r
687                 Find_Dev_by_Tag = Null\r
688         Exit Function\r
689     End if\r
690 \r
691         devs = split(connExec.StdOut.ReadAll, vbCrLF)\r
692 \r
693         On Error Resume Next \r
694 \r
695         ' verify we have some useful data.\r
696         dim arrSize\r
697         arrSize = 0\r
698         for each dev in devs\r
699                 If Instr(dev,Tag) Then\r
700                         arrSize = arrSize + 1\r
701                 End if\r
702         next\r
703 \r
704         If arrSize = 0 Then\r
705                 Find_Dev_by_Tag = Null\r
706                 Exit Function\r
707         End If\r
708                 \r
709         Find_Dev_by_Tag = devs\r
710 \r
711 End Function\r
712 \r
713 \r
714 Function IsInfiniHost(ID)\r
715     Dim dID\r
716         HCAs = Array("5A44","5A45","5E8C","5E8D","6264","6274","6275","6278",_\r
717                                 "6279","6282")\r
718 \r
719     For each dID in HCAs\r
720         If dID = ID Then\r
721             IsInfiniHost = 1\r
722 'msgbox "match ID " & ID & " dID " & dID\r
723             Exit Function\r
724         End if\r
725         Next\r
726 'msgbox "NO match ID " & ID \r
727     IsInfiniHost = 0\r
728 \r
729 End Function\r
730 \r
731 \r
732 ' Install Qlogic VNIC Driver\r
733 \r
734 Sub Install_VNIC(WshShell,devmanQL)\r
735 \r
736         Dim devID, rc\r
737 \r
738     Err.clear\r
739         devID = "IBA\V00066AP00000030"\r
740         rc = WshShell.Run (devmanQL & "disable " & devID, 0, true)\r
741         rc = WshShell.Run (devmanQL & "update netvnic.inf " & devID,0,true)\r
742         ' Display error number and description if applicable\r
743         If rc <> 0 Then\r
744                 msgbox "Install_VNIC Err(" & rc & ") - update qlgcvnic.sys " & devID\r
745         Else\r
746                 rc = WshShell.Run (devmanQL & "enable " & devID, 0, true)\r
747         End if\r
748 \r
749 End Sub\r
750         \r
751 \r
752 ' Install SRP (SCSI RDMA Protocol) Driver\r
753 \r
754 Sub Install_SRP(WshShell,devmanSRP)\r
755 \r
756         Dim devID, rc\r
757 \r
758         Err.clear\r
759         ' QLogic Virtual FC I/O controller or\r
760         ' InfiniBand SRP Miniport: IBA\C0100C609EP0108 or IBA\CFF00C609EP0108\r
761         ' one driver handles all three.\r
762         devID = "IBA\V00066AP00000038"\r
763         rc = WshShell.Run (devmanSRP & "update ib_srp.inf " & devID,0,true)\r
764         ' Display error number and description if applicable\r
765         If rc <> 0 Then\r
766                 msgbox "Install_SRP Err(" & rc &") devman update ib_srp.inf " & devID\r
767         End If\r
768 \r
769 End Sub\r
770 \r
771 \r
772 Sub Install_IOU(WshShell,devman)\r
773 \r
774         Dim rc\r
775 \r
776         On Error Resume Next\r
777 \r
778         dev_list = Find_Dev_by_Tag(WshShell,devman,"find","IBA\IB_IOU")\r
779 \r
780         ' if no IB_IOU device found, install ibiou.sys driver\r
781         If IsNull(dev_list) Then\r
782                 rc = WshShell.Run (devman & "install ib_iou.inf IBA\IB_IOU",0,true)\r
783                 If rc <> 0 Then\r
784                         msgbox "Install_IOU Err(" & rc & ")" & _\r
785                                         "devman install ib_iou.inf IBA\IB_IOU"\r
786                 End If\r
787 '       Else\r
788 '               msgbox "IOU driver already loaded [" & dev_list(0) & "]"\r
789         End If\r
790 \r
791 End Sub\r
792 \r
793 \r
794 ' For installer error codes see\r
795 '  http://msdn2.microsoft.com/en-us/library/aa368542(VS.85).aspx \r
796 \r
797 Const ERROR_INSTALL_SOURCE_ABSENT = 1612  ' missing files to install,\r
798                                               ' invalid feature selection.\r
799 Const ERROR_INSTALL_FAILURE       = 1603  ' fatal error during installation\r
800 Const ERROR_FUNCTION_FAILED       = 1627  ' function failed during execution   \r
801 Const ERROR_SUCCESS_REBOOT_REQUIRED = 3010 ' restart required\r
802 \r
803 Const DPINST_ERR = &H80000000\r
804 \r
805 \r
806 Function dpinst_install(WshShell,sInstalldir,need_IPOIB)\r
807 \r
808         Dim dpinst,dpinstNET,cmd,RC\r
809 \r
810         err.clear\r
811         On Error Resume Next\r
812 \r
813         dpinst = "cmd.exe /c cd /d " & sInstalldir & "IBcore & dpinst.exe "\r
814         dpinstNET = "cmd.exe /c cd /d " & sInstalldir & "net & ..\ibcore\dpinst.exe "\r
815 \r
816         cmd = dpinst & "/S /F /SA /SE /SW"\r
817 \r
818         ' HCA driver install - mlx4 or mthca, dpinst does all .inf files in\r
819         ' the current folder.\r
820 \r
821         RC = WshShell.Run (cmd,0,true)\r
822 \r
823         If (RC AND DPINST_ERR) Then\r
824                 msgbox "dpinst_install - HCA driver Install failed(" & RC & ") " & cmd\r
825                 remove_INF_file WshShell,dpinst,"mthca"\r
826                 remove_INF_file WshShell,dpinst,"mlx4"\r
827                 dpinst_install=ERROR_INSTALL_FAILURE\r
828                 Exit Function\r
829         End if\r
830 \r
831     ' Check/install IPoIB driver\r
832         If need_IPOIB Then\r
833                 cmd = dpinstNET & "/S /F /SA /PATH """ & sInstalldir & "net""" & _\r
834                                 " /SE /SW"\r
835                 RC = WshShell.Run (cmd,0,true)\r
836                 If (RC AND DPINST_ERR) Then\r
837                         msgbox "IPoIB Install RC(" & RC & ") " & cmd\r
838                         dpinst_install=ERROR_INSTALL_FAILURE\r
839                         Exit Function\r
840                 End if\r
841     End If\r
842     \r
843         dpinst_install = 0\r
844 \r
845 End Function\r
846 \r
847 \r
848 Function devman_install(Wsh,sInstalldir,have_mthca,have_mlx4,IPOIB,IOU)\r
849 \r
850         Dim devman,cmd,Return,RC\r
851 \r
852         ' an HCA driver is 'required' for devman/devcon installs.\r
853     If have_mlx4 = 0 AND have_mthca = 0 Then\r
854         msgbox "devman_install - No HCA Driver Selected to Install?" & _\r
855                "   Aborting Installation."\r
856         ' Force installer cleanup (real magic).\r
857         devman_install=ERROR_INSTALL_SOURCE_ABSENT\r
858         Exit Function\r
859     End If\r
860 \r
861     devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
862 \r
863         dev_list = Find_Dev_by_Tag(Wsh,devman,"find","VEN_15B3")\r
864 \r
865         If IsNull(dev_list) Then\r
866                 msgbox "HCA driver install - No HCA devices to install?"\r
867                 devman_install=ERROR_INSTALL_FAILURE\r
868                 Exit Function\r
869         End If\r
870 \r
871     ' Install ConnectX (mlx4) HCA driver?\r
872 \r
873     If have_mlx4 Then\r
874 \r
875         ' install ConnectX/mlx4 bus driver \r
876                 cmd = ""\r
877         For each Dev in dev_list\r
878                         If Dev <> "" Then\r
879                                 mlxdev = Left(Dev,(Instr(dev,"SUBSYS")-2))\r
880                                 devID = Right(mlxdev,4)\r
881                                 If IsInfiniHost( devID ) = 0 Then\r
882                                         ' Mixed HCA types? if not, then Vendor_ID install\r
883                                         If have_mthca = 0 Then\r
884                                                 mlxdev = "PCI\VEN_15B3"\r
885                                         End If\r
886                                         cmd = devman & "update mlx4_bus.inf """ & mlxdev & """"\r
887                                         Return = Wsh.Run (cmd,0,true)\r
888 ' msgbox "mlx4_bus(" & Return & ") " & cmd\r
889                         If Return = 0 Then\r
890                                 DrvInstalled = true\r
891                                 Exit For\r
892                         End If\r
893                                         ' one time install attempt if not mixed HCA types present.\r
894                                         ' Otherwise, continue with next mlx4 DEV_ID\r
895                                         If have_mthca = 0 Then\r
896                                 Exit For\r
897                                         End If\r
898                                 End if\r
899                         End if\r
900                 Next\r
901 \r
902                 If DrvInstalled <> true Then\r
903             msgbox "mlx4_bus Install failed(" & Return & ") " & cmd\r
904             devman_install=ERROR_INSTALL_FAILURE\r
905             Exit Function\r
906                 End if\r
907 \r
908                 ' Install ConnectX HCA\r
909         cmd = devman & "update mlx4_hca.inf MLX4\CONNECTX_HCA"\r
910         Return = Wsh.Run (cmd,0,true)\r
911 \r
912         ' Display error number and description if applicable\r
913         If Return <> 0 Then\r
914             msgbox "mlx4_hca Install Err(" & Return & ") " & cmd\r
915                         remove_INF_file Wsh,devman,"mlx4_"\r
916             devman_install=ERROR_INSTALL_FAILURE\r
917             Exit Function\r
918         End if\r
919     End If\r
920 \r
921     ' InfiniHost (mthca) HCA driver?\r
922 \r
923     If have_mthca Then\r
924                 DrvInstalled = false\r
925 \r
926                 cmd = ""\r
927         For each dev in dev_list\r
928                         If dev <> "" Then\r
929                                 idev = Left(dev,(Instr(dev,"SUBSYS")-2))\r
930                                 devID = Right(idev,4)\r
931                                 If IsInfiniHost( devID ) = 1 Then\r
932                                         ' Mixed HCA types? if not, then Vendor_ID install\r
933                                         If have_mlx4 = 0 Then\r
934                                                 idev = "PCI\VEN_15B3"\r
935                                         End If\r
936                         cmd = devman & "update mthca.inf """ & idev & """"\r
937                         Return = Wsh.Run (cmd,0,true)\r
938                         If Return = 0 Then\r
939                                 DrvInstalled = true\r
940                                 Exit For\r
941                         End If\r
942                                         ' one time install attempt if no mlx4 present\r
943                                         ' otherwise, continue with next DEV_ID\r
944                                         If have_mlx4 = 0 Then\r
945                                 Exit For\r
946                                         End If\r
947                                 End if\r
948                         End if\r
949         Next\r
950 \r
951                 If DrvInstalled <> true Then\r
952             msgbox "InfiniHost(mthca) Install Err(" & Return & ") " & cmd\r
953                         remove_INF_file Wsh,devman,"mthca"\r
954             devman_install=ERROR_INSTALL_FAILURE\r
955             Exit Function\r
956                 End if\r
957     End if\r
958 \r
959         ' an HCA driver is 'required'.\r
960 \r
961     if DrvInstalled = false Then\r
962         msgbox "Driver Install - No HCA Driver Selected to Install?" & _\r
963                "   Aborting Installation."\r
964         ' Force installer cleanup (real magic).\r
965         devman_install=ERROR_INSTALL_SOURCE_ABSENT\r
966         Exit Function\r
967     End if\r
968 \r
969     ' Check/install IPoIB driver\r
970         If IPOIB Then\r
971         devmanNET = "cmd.exe /c cd /d " & sInstalldir & _\r
972                                         "net & ..\IBcore\devman.exe "\r
973                 cmd = devmanNET & "update netipoib.inf IBA\IPoIB"\r
974                 rc = Wsh.Run (cmd,0,true)\r
975                 If rc <> 0 Then\r
976                         msgbox "IPoIB Install Err(" & rc & ") " & cmd\r
977                         DriverUninstall\r
978             devman_install=ERROR_INSTALL_FAILURE\r
979             Exit Function\r
980                 End If\r
981     End If\r
982     \r
983         ' IB I/O Unit driver installed only if required by VNIC or SRP.\r
984 \r
985     If IOU Then\r
986         rc = Wsh.Run (devman & "install ib_iou.inf IBA\IB_IOU",0,true)\r
987                 If rc <> 0 Then\r
988                         msgbox "IOU Install Err(" & rc & ") install ib_iou.inf IBA\IB_IOU"\r
989                         DriverUninstall\r
990             devman_install=ERROR_INSTALL_FAILURE\r
991             Exit Function\r
992                 End if\r
993     End If\r
994 \r
995         devman_install = 0\r
996 \r
997 End Function\r
998 \r
999 \r
1000 \r
1001 ''''''''''' Device Driver Install ''''''''''''\r
1002 \r
1003 Function DriverInstall()\r
1004     Dim PropArray, devID\r
1005         Dim devman, devmanEXE, devmanQL\r
1006     Dim rc, cmd, CheckMode, sInstalldir, fso\r
1007         Dim DrvInstalled, idev, mlxdev, dev, dev_list\r
1008         Dim need_IPOIB,need_SRP,need_VNIC,need_IOU\r
1009 \r
1010         On Error Resume Next\r
1011 \r
1012     ' Get the value of INSTALLDIR - see WinOF_Setup\r
1013     CheckMode = Session.Property("CustomActionData")\r
1014 \r
1015     If Not CheckMode = "" Then\r
1016         'in defered action this is the way to pass arguments.\r
1017             PropArray = Split(Session.Property("CustomActionData"), ";")\r
1018     Else\r
1019         Redim PropArray(8)\r
1020                 PropArray(0) = Session.Property("INSTALLDIR") \r
1021                 PropArray(1) = Session.Property("SystemFolder") \r
1022         PropArray(2) = Session.Property("System64Folder") \r
1023                 PropArray(3) = Session.Property("WindowsFolder")\r
1024                 PropArray(4) = Session.Property("VersionNT")\r
1025                 PropArray(5) = Session.Property("ADDLOCAL")\r
1026                 PropArray(6) = Session.Property("REMOVE")\r
1027                 PropArray(7) = Session.Property("NODRV")\r
1028     End If\r
1029 \r
1030         ' If cmd-line specified NODRV=1, then do not install drivers.\r
1031         ' Should not get here with NODRV=1 as WIX src files check.\r
1032         ' Be safe.\r
1033 \r
1034         If PropArray(7) <> "" Then\r
1035                 Exit Function\r
1036         End If\r
1037 \r
1038     sInstalldir = PropArray(0)\r
1039         sVersionNT      = PropArray(4)\r
1040         InstallThis     = PropArray(5)\r
1041 \r
1042     devmanEXE = sInstalldir & "IBcore\devman.exe "\r
1043     devmanEXE1 = "..\IBcore\devman.exe "\r
1044     devman =    "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1045     devmanQL =  "cmd.exe /c cd /d " & sInstalldir & "qlgcvnic & " & devmanEXE1\r
1046     devmanSRP = "cmd.exe /c cd /d " & sInstalldir & "SRP & " & devmanEXE1\r
1047     devmanWV = "cmd.exe /c cd /d " & sInstalldir & "winverbs & " & devmanEXE1\r
1048 \r
1049         dpinst = "cmd.exe /c cd /d " & sInstalldir & "IBcore & dpinst.exe "\r
1050         dpinstWV = "cmd.exe /c cd /d " & sInstalldir & "winverbs & ..\IBcore\dpinst.exe "\r
1051 \r
1052     Set WshShell = CreateObject("WScript.Shell")\r
1053     Set fso = CreateObject("Scripting.FileSystemObject")\r
1054         \r
1055     If Not fso.FileExists(devmanEXE) Then\r
1056         msgbox "DriverInstall - missing file WinOF\IBcore\devman.exe"\r
1057         DriverInstall=ERROR_FUNCTION_FAILED \r
1058         Exit Function\r
1059     End if\r
1060 \r
1061     If Not fso.FileExists(sInstalldir & "IBcore\devman.exe") Then\r
1062         msgbox "DriverInstall - missing file WinOF\IBcore\dpinst.exe"\r
1063         DriverInstall=ERROR_FUNCTION_FAILED \r
1064         Exit Function\r
1065     End if\r
1066 \r
1067     err.clear \r
1068 \r
1069     ' rescan system buses\r
1070     Return = WshShell.Run (devman & "rescan", 0, true)\r
1071                 \r
1072     ' Install HCA (Host Channel Adapter) Driver(s)\r
1073     DrvInstalled = false\r
1074 \r
1075         ' Which HCAs are selected to install?\r
1076         ' Both InfiniHost(mthca) and ConnectX(mlx4) have the same\r
1077         ' Vendor ID VEN_15B3, so a generic by 'Vendor ID' install will not suceed.\r
1078         ' In the case of both InfiniHost and ConnectX (mixed) HCAs present, install\r
1079         ' using VENDOR_ID and DEV_ID.\r
1080 \r
1081         have_mlx4 = 0\r
1082         have_mthca = 0\r
1083 \r
1084         ' msgbox "InstallThis " & InstallThis\r
1085 \r
1086         have_mlx4       = instr(InstallThis,"hca_connectX")\r
1087         have_mthca      = instr(InstallThis,"hca_mthca")\r
1088         need_IPOIB      = instr(InstallThis,"fIPoIB")\r
1089 \r
1090         need_SRP        = instr(InstallThis,"fSRP") _\r
1091                                         AND fso.FileExists(sInstalldir & "SRP\ib_srp.inf")\r
1092 \r
1093         need_VNIC       = instr(InstallThis,"fVNIC") _\r
1094                                         AND fso.FileExists(sInstalldir & "qlgcvnic\netvnic.inf")\r
1095 \r
1096         need_IOU        = need_SRP + need_VNIC\r
1097 \r
1098         ' Use DPINST.EXE for Svr 2008 & Vista Driver Install otherwise use devman\r
1099 \r
1100         If sVersionNT >= 600 Then\r
1101             DriverInstall = dpinst_install(WshShell,sInstalldir,need_IPOIB)\r
1102         Else\r
1103             DriverInstall = devman_install(WshShell,sInstalldir,have_mthca,_\r
1104                                                                                 have_mlx4,need_IPOIB,need_IOU)\r
1105         End If\r
1106 \r
1107         If DriverInstall Then\r
1108                 Exit Function\r
1109         End If\r
1110         \r
1111     ' Install Qlogic VNIC Driver\r
1112         If need_VNIC Then\r
1113                 Install_VNIC WshShell,devmanQL\r
1114     End if\r
1115         \r
1116     ' Install SRP (SCSI RDMA Protocol) Driver\r
1117     If need_SRP Then\r
1118                 Install_SRP WshShell,devmanSRP\r
1119         End If\r
1120 \r
1121         If fso.FileExists(sInstalldir & "Xwinverbs\winverbs.inf") Then\r
1122 \r
1123                 ' install, don't start/insert\r
1124                 cmd = dpinstWV & "/S /F /SA /SE /SW /PATH """ & sInstalldir _\r
1125                                 & "winverbs""" \r
1126 \r
1127         Return = WshShell.Run (cmd,0,true)\r
1128 \r
1129         cmd = devmanWV & "classfilter InfinibandController upper +winverbs"\r
1130         Return = WshShell.Run (cmd,0,true)\r
1131         If Return <> 1 Then msgbox "winverbs\winverbs.inf(" & Return & ")"\r
1132 \r
1133         cmd = devmanWV & "disable =InfinibandController"\r
1134         Return = WshShell.Run (cmd,0,true)\r
1135         If Return <> 1 Then msgbox "winverbs\disable(" & Return & ")"\r
1136 \r
1137         cmd = devmanWV & "enable =InfinibandController"\r
1138         Return = WshShell.Run (cmd,0,true)\r
1139         If Return <> 1 Then msgbox "winverbs\enable(" & Return & ")"\r
1140         End If\r
1141 \r
1142     err.clear \r
1143     DriverInstall=0\r
1144 \r
1145 End Function\r
1146 \r
1147 \r
1148 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\r
1149 \r
1150 ' Find IBA devices using Devcon\r
1151 \r
1152 Function Find_IBA_Devices(WshShell,sInstalldir) \r
1153         Dim dev\r
1154 \r
1155         Set ibaDevicesExec = WshShell.Exec ("cmd.exe /c cd " & sInstalldir & "IBcore & devman.exe findall * | FIND ""IBA""")\r
1156         ibaDevices = split(ibaDevicesExec.StdOut.ReadAll, vbCrLF)\r
1157 \r
1158         ' Getting the array Size\r
1159         dim arrSize\r
1160         arrSize = 0\r
1161         for each dev in ibaDevices\r
1162                 if (Instr(dev,"IBA\") = 1) Then\r
1163                         arrSize = arrSize + 1\r
1164                 End if\r
1165         next\r
1166         'Creating array of IBA\ devices\r
1167         dim ibaDev()\r
1168         Redim ibaDev(arrSize - 1)\r
1169         index = 0\r
1170         for each dev in ibaDevices\r
1171                 if (Instr(dev,"IBA\") = 1) Then\r
1172                         ibaDev(index) = dev\r
1173                         index = index + 1\r
1174                 End if\r
1175         next\r
1176 \r
1177         ' Return array of devices\r
1178         Find_IBA_Devices=ibaDev \r
1179 End Function\r
1180 \r
1181 \r
1182 ' returns an array of all Local Area Connections which\r
1183 ' were created for IPoIB.\r
1184 \r
1185 Function Find_IPOIB_LAC()\r
1186         Dim WinOS,cmd,base,dev\r
1187 \r
1188         Set WshShell = CreateObject("WScript.Shell")\r
1189         base = "cmd.exe /c reg query HKLM\SYSTEM\CurrentControlSet\Control\Network"\r
1190         WinOS = Session.Property("VersionNT")\r
1191 \r
1192         If (WinOS <> 501) Then\r
1193                 ' Win2K3 style\r
1194                 cmd = base & " /f ""IBA\IPOIB"" /s /d | FIND ""Connection"" "\r
1195         Else\r
1196                 ' XP style\r
1197                 cmd = base & " /s | FIND ""}\Connection"" " \r
1198         End if\r
1199 \r
1200         Set ibaDevicesExec = WshShell.Exec ("cmd.exe /C " & cmd)\r
1201 \r
1202         ibaDevices = split(ibaDevicesExec.StdOut.ReadAll, vbCrLF)\r
1203 \r
1204         ' determine the array Size\r
1205         dim arrSize\r
1206         arrSize = 0\r
1207         for each dev in ibaDevices\r
1208                 arrSize = arrSize + 1\r
1209         next\r
1210         'Creating array of Local Area Connections based on IPoIB\r
1211         dim ibaDev()\r
1212         Redim ibaDev(arrSize - 1)\r
1213         index = 0\r
1214 \r
1215         For each dev in ibaDevices\r
1216                 If dev = "" Then\r
1217                 ElseIf WinOS <> 501 then\r
1218                         ' ibaDev(index) = dev\r
1219                         delstr = Left(dev,Len(dev)-Len("\Connection"))\r
1220                         ibaDev(index) = delstr\r
1221                         index = index + 1\r
1222                 Else\r
1223                         ' XP reg.exe format sucks, unable to filter IBA\IPOIB, so we do\r
1224                         ' it here....sigh.\r
1225                         Set rex = WshShell.Exec ("cmd.exe /C reg.exe query " & dev & _\r
1226                                                                         " /v PnpInstanceID | FIND ""IBA\IPOIB"" ")\r
1227                     resp = split(rex.StdOut.ReadAll, vbCrLF)\r
1228                     For each re in resp\r
1229 '                               msgbox "XP dev " & dev\r
1230 '                               msgbox "XP re " & re\r
1231                             if Instr(re,"IPOIB") Then\r
1232                                 delstr = Left(dev,Len(dev)-Len("\Connection"))\r
1233                                     ibaDev(index) = delstr\r
1234                                     index = index + 1\r
1235                      Exit For\r
1236                             End If\r
1237                         next\r
1238                 End if\r
1239         next\r
1240         Find_IPOIB_LAC=ibaDev\r
1241 \r
1242 End Function\r
1243 \r
1244 \r
1245 ' Remove 3rd party (OEM) driver package, identified by the string LookFor.\r
1246 \r
1247 Function remove_INF_file(WshShell,exe,LookFor)\r
1248 \r
1249     Dim cmd,cmdDM,use_dpinst,pfile\r
1250 \r
1251         ' using dpinst.exe[WLH] or devman.exe[wnet/xp]?\r
1252         use_dpinst = Instr(exe,"dpinst")\r
1253 \r
1254         cmd = "cmd.exe /c for /f %i in ('findstr /m " & LookFor & _\r
1255                         " %WINDIR%\inf\oem*.inf') do @echo %i"\r
1256 \r
1257     Set infFilesExec = WshShell.Exec ( cmd )\r
1258 \r
1259     InfFiles = infFilesExec.StdOut.ReadAll\r
1260     IFILES = Split(InfFiles,vbCrLf)\r
1261 ' msgbox "remove_INF_File LookFor " & LookFor \r
1262         On Error Resume Next \r
1263     For Each file in IFILES\r
1264         If (file <> "") Then\r
1265                         ' most common is devman.exe \r
1266                 cmd = exe & " -f dp_delete " & file\r
1267                         if use_dpinst then\r
1268                                 cmdDM = cmd\r
1269                                 cmd = exe & " /U """ & file & """ /S /D"\r
1270                         end if\r
1271 ' msgbox cmd \r
1272                 Return = WshShell.Run (cmd, 0, true)\r
1273                         if use_dpinst then\r
1274                                 ' use devman.exe to delete all .inf referenced files\r
1275                                 Return = WshShell.Run (cmdDM, 0, true)\r
1276                         end if\r
1277                         ' make sure the .inf & .pnf files are removed.\r
1278                         pfile = replace(file,".inf",".pnf")\r
1279                         FileDelete file\r
1280                         FileDelete pfile\r
1281         End IF\r
1282     Next\r
1283 \r
1284         remove_INF_file = 0\r
1285 \r
1286 End Function\r
1287 \r
1288 \r
1289 ' Not used - run the specified command during next startup.\r
1290 \r
1291 Function RunAtReboot(name,run_once_cmd)\r
1292         dim key_name\r
1293         key_name = "Software\Microsoft\Windows\CurrentVersion\RunOnce"\r
1294         AddRegStringValue key_name,name,run_once_cmd\r
1295         msgbox "RunAtReboot( " & name & " , " & run_once_cmd & " )"\r
1296     RunAtReboot = 0\r
1297 End Function\r
1298 \r
1299 \r
1300 ' Remove QLogic VNIC instances\r
1301 \r
1302 Sub Uninstall_VNIC(fso,WshShell,devices,sInstalldir)\r
1303 \r
1304         Dim devman,Return,device,dt,sDRIVERS\r
1305 \r
1306         devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1307 \r
1308         If IsNull(devices) Then\r
1309                 ' create a list of IBA\* devices via "devcon find"\r
1310                 devices = Find_IBA_Devices(WshShell,sInstalldir)\r
1311         End If\r
1312 \r
1313         For each devTarget in devices\r
1314             If (Instr(devTarget,"IBA\V00066AP00000030")) Then\r
1315                 device = split(devTarget, ":")\r
1316                 dt = rtrim(device(0))\r
1317                         ' disable instance - double quote complex device name for success.\r
1318                         Return = WshShell.Run (devman & "disable ""@" & dt & """", 0, true)\r
1319                 ' Removing the Qlogic Vnic I/O Unit\r
1320                 Return = WshShell.Run (devman & "remove ""@" & dt & """", 0, true)\r
1321             End if\r
1322         Next\r
1323 \r
1324         remove_INF_file WshShell,devman,"qlgcvnic.sys"\r
1325 \r
1326         sDRIVERS = Session.Property("WindowsFolder") & "system32\drivers\"\r
1327         DriverFileDelete fso,WshShell,sDRIVERS & "vnic.sys"\r
1328         DriverFileDelete fso,WshShell,sDRIVERS & "qlgcvnic.sys"\r
1329 \r
1330 End Sub\r
1331 \r
1332 \r
1333 Sub Uninstall_SRP(fso,WshShell,devices,sInstalldir)\r
1334 \r
1335         Dim devman,devmanRMAT,devmanDAAT,Return,device,sDRIVERS\r
1336 \r
1337         devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1338         devmanRMAT = devman & "remove @"\r
1339         devmanDAAT = devman & "disable @"\r
1340 \r
1341         If IsNull(devices) Then\r
1342                 ' create a list of IBA\* devices via "devcon find"\r
1343                 devices = Find_IBA_Devices(WshShell,sInstalldir)\r
1344         End If\r
1345 \r
1346         ' Remove SRP device - QLogic Virtual FC I/O controller instance?\r
1347         For each deviceCan in devices\r
1348             If (Instr(deviceCan,"IBA\V00066AP00000038")) Then\r
1349                 device = split(deviceCan, " ")\r
1350                           ' disable the instance\r
1351                       Return = WshShell.Run (devmanDAAT & device(0), 0, true)\r
1352                 ' Removing I/O Unit of the SRP\r
1353                 Return = WshShell.Run (devmanRMAT & device(0), 0, true)\r
1354             End if\r
1355         Next\r
1356 \r
1357         ' Removing SRP miniport devices.\r
1358         ' Either: IBA\C0100C609EP0108 or IBA\CFF00C609EP0108\r
1359         For each devTarget in devices\r
1360             If (Instr(devTarget,"00C609EP0108")) Then\r
1361                 device = split(devTarget, " ")\r
1362                           ' disable the instance\r
1363                     Return = WshShell.Run (devmanDAAT & device(0), 0, true)\r
1364                 ' Removing SRP\r
1365                 Return = WshShell.Run (devmanRMAT & device(0), 0, true)\r
1366             End if\r
1367         Next\r
1368 \r
1369         remove_INF_file WshShell,devman,"ibsrp.sys"\r
1370 \r
1371         sDRIVERS = Session.Property("WindowsFolder") & "system32\drivers\"\r
1372         DriverFileDelete fso,WshShell,sDRIVERS & "ibsrp.sys"\r
1373 \r
1374 End Sub\r
1375 \r
1376 \r
1377 Sub RemoveDevice(WshShell,sInstalldir,DeviceTag)\r
1378 \r
1379         dim devices,device,devman,devmanRMAT,devTarget,dt,Return\r
1380 \r
1381         devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1382         devmanRMAT = devman & "remove ""@"\r
1383 \r
1384         devices = Find_Dev_by_Tag(WshShell,devman,"findall",DeviceTag)\r
1385 \r
1386         If Not IsNull(devices) Then\r
1387 \r
1388                 For each devTarget in devices\r
1389                     If (Instr(devTarget,DeviceTag)) Then\r
1390                         device = split(devTarget, ":")\r
1391                         dt = rtrim(device(0))\r
1392                         Return = WshShell.Run (devmanRMAT & dt & """", 0, true)\r
1393                     End if\r
1394                 Next\r
1395 \r
1396         End if\r
1397 \r
1398 End Sub\r
1399 \r
1400 Sub remove_all_HCA_devices(WshShell,sInstalldir)\r
1401 \r
1402         RemoveDevice WshShell,sInstalldir,"MLX4\CONNECTX_HCA"\r
1403         RemoveDevice WshShell,sInstalldir,"PCI\VEN_15B3"\r
1404 \r
1405 End Sub\r
1406 \r
1407 Function Uninstall_IB_Devices(sInstalldir,sVersionNT,sRemove)\r
1408 \r
1409         Dim WshShell, fso, devices, cmd, dpinst, devman, devmanRMAT\r
1410 \r
1411         dpinst = "cmd.exe /c cd /d " & sInstalldir & "IBcore & dpinst.exe "\r
1412         devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
1413 \r
1414         devmanRMAT = devman & "remove @"\r
1415         devmanDAAT = devman & "disable @"\r
1416 \r
1417         Set WshShell = CreateObject("WScript.Shell")\r
1418         Set fso = CreateObject("Scripting.FileSystemObject")\r
1419 \r
1420         If (fso.FileExists(sInstalldir & "IBcore\dpinst.exe") = False) Then\r
1421             Exit Function ' no reason to continue without the tool.\r
1422         End if\r
1423 \r
1424         If (fso.FileExists(sInstalldir & "IBcore\devman.exe") = False) Then\r
1425             Exit Function ' no reason to continue without the tool.\r
1426         End if\r
1427 \r
1428         ' create a list of IBA\* devices via "devcon find"\r
1429 \r
1430         devices = Find_IBA_Devices(WshShell,sInstalldir)\r
1431 \r
1432         Uninstall_SRP fso,WshShell,devices,sInstalldir\r
1433 \r
1434         Uninstall_VNIC fso,WshShell,devices,sInstalldir\r
1435 \r
1436         ' remove any lingering IB I/O Units\r
1437         For each devTarget in devices\r
1438             If (Instr(devTarget,"IBA\IB_IOU")) Then\r
1439                 device = split(devTarget, ":")\r
1440                 dt = rtrim(device(0))\r
1441                         ' double-quote device name to ensure success.\r
1442                         Return = WshShell.Run (devman & "disable ""@" & dt & """", 0, true)\r
1443                 ' Removing the I/O Unit\r
1444                 Return = WshShell.Run (devman & "remove ""@" & dt & """", 0, true)\r
1445             End if\r
1446         Next\r
1447 \r
1448         ' remove IPoIB devices\r
1449 \r
1450         For each devTarget in devices\r
1451             If (Instr(devTarget,"IBA\IPOIB")) Then\r
1452                 device = split(devTarget, " ")\r
1453                 dt = rtrim(device(0))\r
1454                         ' no need to double-quote simple IPoIB device name.\r
1455                         Return = WshShell.Run (devmanDAAT & dt, 0, true)\r
1456                 ' Remove the IPoIB device instance\r
1457                 Return = WshShell.Run (devmanRMAT & dt, 0, true)\r
1458             End if\r
1459         Next\r
1460 \r
1461         remove_all_HCA_devices WshShell,sInstalldir\r
1462 \r
1463         ' Old (CoInstaller version) ibbus GUID - just in case.\r
1464         Return = WshShell.Run (devman & "remove {94F41CED-78EB-407C-B5DF-958040AF0FD8",0,true)\r
1465 \r
1466     ' remove 3rd party driver packages (ibsrp, vnic, ipoib, mthca, Connectx)\r
1467         ' use dpinst.exe for Server 2008 & Vista as dpinst was used to install.\r
1468 \r
1469         If sVersionNT >= 600 Then\r
1470                 remove_INF_file WshShell,dpinst,"ibiou"\r
1471                 remove_INF_file WshShell,dpinst,"ipoib"\r
1472                 remove_INF_file WshShell,dpinst,"winverb"\r
1473                 remove_INF_file WshShell,dpinst,"mthca"\r
1474                 remove_INF_file WshShell,dpinst,"mlx4_"\r
1475         Else\r
1476                 remove_INF_file WshShell,devman,"ibiou"\r
1477                 remove_INF_file WshShell,devman,"ipoib"\r
1478                 remove_INF_file WshShell,devman,"winverb"\r
1479                 remove_INF_file WshShell,devman,"mthca"\r
1480                 remove_INF_file WshShell,devman,"mlx4_"\r
1481         End If\r
1482     \r
1483         Uninstall_IB_Devices = 0\r
1484 \r
1485 End Function\r
1486 \r
1487 \r
1488 \r
1489 ''''''''''' Driver Uninstall ''''''''''''\r
1490 \r
1491 Sub DriverUninstall()  \r
1492         Dim sInstalldir, WshShell, fso, sVersionNT\r
1493 \r
1494         sInstalldir = Session.Property("INSTALLDIR")\r
1495 \r
1496         Set WshShell = CreateObject("WScript.Shell")\r
1497         Set fso = CreateObject("Scripting.FileSystemObject")\r
1498 \r
1499         ' WSD is not supported on XP and should NOT have been installed.\r
1500         ' otherwise, remove the service: ND (Network Direct) then WinSock Direct.\r
1501 \r
1502         sVersionNT = Session.Property("VersionNT")\r
1503         sRemove = Session.Property("REMOVE")\r
1504         If sRemove = "" Then\r
1505                 sRemove = "ALL"\r
1506         End If\r
1507 \r
1508         If sVersionNT <> 501 AND fso.FileExists(sInstalldir & "installsp.exe") Then\r
1509                 Return = WshShell.Run ("cmd.exe /c cd " & sInstalldir & _\r
1510                                    " & installsp.exe -r", 0, true)\r
1511         End If\r
1512 \r
1513         If fso.FileExists(sInstalldir & "net\ndinstall.exe") Then\r
1514             Return = WshShell.Run ("cmd.exe /c cd " & sInstalldir & _\r
1515                                    " & net\ndinstall.exe -r", 0, true)\r
1516         End If\r
1517         \r
1518         ' stop the openSM service in case it was started.\r
1519         Return = WshShell.Run ("cmd.exe /c sc.exe stop opensm", 0, true)\r
1520 \r
1521         ' delete opensm service from registry\r
1522         Return = WshShell.Run ("cmd.exe /c sc.exe delete opensm", 0, true)\r
1523         If Err Then ShowError\r
1524 \r
1525         Uninstall_IB_Devices sInstalldir,sVersionNT,sRemove\r
1526 \r
1527         ' Remove Service entries from the registry\r
1528 \r
1529         DeleteRegKey "System\CurrentControlSet\Services\ibbus"\r
1530         DeleteRegKey "System\CurrentControlSet\Services\mthca"\r
1531         DeleteRegKey "System\CurrentControlSet\Services\mlx4_bus"\r
1532         DeleteRegKey "System\CurrentControlSet\Services\mlx4_hca"\r
1533         DeleteRegKey "System\CurrentControlSet\Services\ipoib"\r
1534         DeleteRegKey "System\CurrentControlSet\Services\ibiou"\r
1535         DeleteRegKey "System\CurrentControlSet\Services\ibsrp"\r
1536         DeleteRegKey "System\CurrentControlSet\Services\qlgcvnic"\r
1537         DeleteRegKey "System\CurrentControlSet\Services\winverbs"\r
1538 \r
1539         ' Mthca\r
1540         DeleteRegValue "SYSTEM\CurrentControlSet\Control\CoDeviceInstallers" ,_\r
1541                                         "{58517E00-D3CF-40c9-A679-CEE5752F4491}"\r
1542 \r
1543         DeleteRegKey "SYSTEM\CurrentControlSet\Control\Class\{58517E00-D3CF-40C9-A679-CEE5752F4491}" \r
1544 \r
1545         ' Connectx (mlx4)\r
1546         DeleteRegValue "SYSTEM\CurrentControlSet\Control\CoDeviceInstallers" ,_\r
1547                                          "{31B0B28A-26FF-4dca-A6FA-E767C7DFBA20}"      \r
1548 \r
1549         DeleteRegKey "SYSTEM\CurrentControlSet\Control\Class\{31B0B28A-26FF-4dca-A6FA-E767C7DFBA20}"\r
1550 \r
1551         DeleteRegKey "SYSTEM\CurrentControlSet\Control\Class\{714995B2-CD65-4a47-BCFE-95AC73A0D780}"\r
1552         \r
1553         ' In livefish mode, the above does not always work - just in case.\r
1554         ' remove reg entries for ConnectX, mthca, ibbus, mlx4 & ipoib\r
1555         nukem = Array(_\r
1556                         "Control\Class\{58517E00-D3CF-40C9-A679-CEE5752F4491}",_\r
1557                         "Control\Class\{31B0B28A-26FF-4dca-A6FA-E767C7DFBA20}",_\r
1558                         "Control\Class\{714995B2-CD65-4a47-BCFE-95AC73A0D780}",_\r
1559                         "Services\ibbus",_\r
1560                         "Services\mthca",_\r
1561                         "Services\mlx4_bus",_\r
1562                         "Services\mlx4_hca",_\r
1563                         "Services\ipoib",_\r
1564                         "Services\EventLog\System\ipoib",_\r
1565                         "Services\ibiou",_\r
1566                         "Services\qlgcvnic",_\r
1567                         "Services\ibsrp",_\r
1568                         "Services\winverbs" )\r
1569 \r
1570         base = "reg.exe delete HKLM\SYSTEM\CurrentControlSet\" \r
1571 \r
1572         ' in livefish mode the delete didn't suceed, delete it in another way\r
1573     For each ID in nukem\r
1574                 If ID <> "" Then\r
1575                         Return = WshShell.Run (base & ID & " /f", 0, true)\r
1576                 End if\r
1577         Next\r
1578 \r
1579         Return = WshShell.Run (base & "Control\Wdf\Kmdf\kmdflibrary\versions\1\driverservices /v mlx4_bus /f", 0, true)\r
1580 \r
1581 ' Not yet\r
1582 '       Return = WshShell.Run ("reg.exe delete HKLM\Software\Microsoft\Windows\currentVersion\DIFx\DriverStore\WinVerbs_* /f", 0, true)\r
1583 '       Return = WshShell.Run ("reg.exe delete HKLM\Software\Microsoft\Windows\currentVersion\DIFx\DriverStore\ipoib_* /f", 0, true)\r
1584 '\r
1585 \r
1586         ' remove all Local Area Connection which were constructed for IPoIB\r
1587         ' create a list of IBA\IPOIB Local Area Connections via 'reg query'\r
1588         Dim IPOIB_LAC\r
1589         IPOIB_LAC = Find_IPOIB_LAC\r
1590 \r
1591         For each LAC in IPOIB_LAC\r
1592                 If LAC <> "" Then\r
1593                         Return = WshShell.Run ("reg.exe delete " & LAC & " /f", 0, true)\r
1594                         If Err Then ShowErr\r
1595                 End if\r
1596         Next\r
1597 \r
1598         ' remove driver installed files\r
1599         RemoveDriverFiles WshShell\r
1600         \r
1601         Session.Property("REBOOT") = "FORCE"      \r
1602         err.clear \r
1603 End Sub\r
1604 \r
1605 \r
1606 ' Enable WSD if installsp.exe was installed (feature Winsock direct selected).\r
1607 ' For Windows XP, this CustomAction should not be called as WSD is not\r
1608 ' supported on XP.\r
1609 \r
1610 Sub WSDEnable()\r
1611       Dim sInstalldir, WshShell, fso\r
1612 \r
1613       sInstalldir = Session.Property("INSTALLDIR")\r
1614 \r
1615       Set WshShell = CreateObject("WScript.Shell")\r
1616       Set fso = CreateObject("Scripting.FileSystemObject")\r
1617 \r
1618       If fso.FileExists(sInstalldir & "installsp.exe") Then\r
1619           ' install the WinSockdirect service\r
1620           Return = WshShell.Run ("cmd.exe /c cd " & sInstalldir _\r
1621                                  & " & installsp.exe -i", 0, true)\r
1622       End If\r
1623       If Err Then ShowError\r
1624 \r
1625 End Sub\r
1626 \r
1627 \r
1628 ' This sub will only be called if the feature ND start was selected.\r
1629 ' See WIX src file - ND_start\r
1630 \r
1631 Sub ND_StartMeUp()\r
1632       Dim sInstalldir, WshShell, fso\r
1633 \r
1634       sInstalldir = Session.Property("INSTALLDIR")\r
1635 \r
1636       Set WshShell = CreateObject("WScript.Shell")\r
1637       Set fso = CreateObject("Scripting.FileSystemObject")\r
1638 \r
1639     ' Start the Network Direct Service if installed\r
1640 \r
1641     If fso.FileExists(sInstalldir & "net\ndinstall.exe") Then\r
1642         Return = WshShell.Run ("cmd.exe /c cd " & sInstalldir _\r
1643                                & " & net\ndinstall.exe -i", 0, true)\r
1644         If Err Then ShowErr2("ND service install failed")\r
1645     End If\r
1646 \r
1647 End Sub\r
1648 \r
1649 \r
1650 Sub ShowError()\r
1651     If Err.Number = 0 Then\r
1652         Exit Sub\r
1653     End if\r
1654         strMsg = vbCrLf & "Error # " & Err.Number & vbCrLf & _\r
1655                  Err.Description & vbCrLf & vbCrLf\r
1656         msgbox strMsg\r
1657 End Sub\r
1658 \r
1659 \r
1660 Sub ErrMsg(msg)\r
1661     If Err.Number <> 0 Then\r
1662             msgbox msg & vbCrLf & "Err # " & Err.Number & vbCrLf & Err.Description\r
1663         Err.clear\r
1664     End if\r
1665 End Sub\r
1666 \r
1667 Function ShowErr2(msg)\r
1668     If Err.Number <> 0 Then\r
1669             strMsg = vbCrLf & "Err # " & Err.Number & vbCrLf & _\r
1670                      Err.Description & vbCrLf\r
1671             msgbox msg & strMsg\r
1672     End if\r
1673     ShowErr2=Err.Number\r
1674 End Function\r
1675 \r
1676 \r
1677 ' Wix installer now handles this, no longer used although left as example.\r
1678 ' Create OpenSM (Subnet Management) windows service disabled.\r
1679 \r
1680 Sub OpenSM_Install\r
1681     Dim sInstalldir,opensmPath,WshShell,fso,sc\r
1682 \r
1683     sInstalldir = Session.Property("INSTALLDIR")\r
1684     opensmPath = sInstalldir & "opensm.exe"\r
1685 \r
1686     Set fso = CreateObject("Scripting.FileSystemObject")\r
1687     Set WshShell = CreateObject("WScript.Shell")\r
1688     \r
1689     ' opensm.exe is required\r
1690     If Not fso.FileExists(opensmPath) Then\r
1691         Exit Sub\r
1692     End if\r
1693 \r
1694     sc = "sc.exe create opensm binPath= """ &opensmPath _\r
1695                 & " -e --service"" DisplayName= ""InfiniBand Subnet Manager"" "\r
1696 \r
1697     ' Install OpeSM as a 'disabled' Service\r
1698     sc = sc & "start= disabled"\r
1699     Return = WshShell.Run ("cmd.exe /c " & sc, 0, true)\r
1700     sc = "sc.exe description opensm ""Configures and manage the InfiniBand Subnet"" "\r
1701     Return = WshShell.Run ("cmd.exe /c " & sc, 0, true)\r
1702     err.clear\r
1703 \r
1704 End Sub\r
1705 \r
1706 \r
1707 ' CustomAction called by Wix installer to convert disabled OpenSM service to\r
1708 ' to an 'auto' startup at boot. Performs conversion and then starts service.\r
1709 \r
1710 Sub OpenSM_StartMeUp\r
1711     Dim sInstalldir, opensmPath, WshShell, fso\r
1712 \r
1713     sInstalldir = Session.Property("INSTALLDIR")\r
1714     opensmPath = sInstalldir & "opensm.exe"\r
1715 \r
1716     Set fso = CreateObject("Scripting.FileSystemObject")\r
1717     Set WshShell = CreateObject("WScript.Shell")\r
1718     \r
1719     ' opensm.exe is required\r
1720     If Not fso.FileExists(opensmPath) Then\r
1721         Exit Sub\r
1722     End if\r
1723 \r
1724     Return = WshShell.Run ("cmd.exe /c sc.exe config opensm start= auto",0,true)\r
1725     Return = WshShell.Run ("cmd.exe /c sc.exe start opensm", 0, true)\r
1726     Err.clear\r
1727 \r
1728 End Sub\r
1729 \r
1730 \r
1731 ' NOT USED - WIX now handles this\r
1732 ' If not present, then create %SystemDrive%\DAT\dat.conf\r
1733 \r
1734 Function DAPL_setup()\r
1735       Dim sSysDrive, SrcFile, DstFile, WshShell, fso\r
1736 \r
1737       Set WshShell = CreateObject("WScript.Shell")\r
1738       Set fso = CreateObject("Scripting.FileSystemObject")\r
1739 \r
1740       DAPL_setup = 0\r
1741       Err.clear\r
1742 \r
1743       SrcFile = Session.Property("INSTALLDIR") & "dat.conf"\r
1744 \r
1745       If fso.FileExists(SrcFile) Then\r
1746               On Error Resume Next \r
1747           sSysDrive = Session.Property("WindowsVolume")\r
1748           ' sSysDrive = WshShell.ExpandEnvironmentStrings("%SystemDrive%") \r
1749           ' WindowsVolume includes root \, where %SystemDrive% does not.\r
1750           DstFile = sSysDrive & "DAT\dat.conf"\r
1751           If fso.FileExists(DstFile) Then\r
1752               ' Preserve existing %SystemDrive%\DAT\dat.conf\r
1753               Exit Function\r
1754           End if\r
1755           fso.CopyFile SrcFile, DstFile\r
1756       End if\r
1757 End Function\r
1758 \r
1759 \r
1760 Sub ScheduleLocalReboot\r
1761                 \r
1762     Set objWMILocator = CreateObject ("WbemScripting.SWbemLocator") \r
1763       objWMILocator.Security_.Privileges.AddAsString "SeShutdownPrivilege",True \r
1764     Set objWMIServices = objWMILocator.ConnectServer(strComputerName, _\r
1765                         cWMINameSpace, strUserID, strPassword)\r
1766     Set objSystemSet = GetObject(_\r
1767         "winmgmts:{impersonationLevel=impersonate,(Shutdown)}")._\r
1768                                 InstancesOf("Win32_OperatingSystem")\r
1769 \r
1770     ' Forced restart\r
1771     For Each objSystem In objSystemSet\r
1772         objSystem.Win32Shutdown 2+4\r
1773         objSystem.Win32Shutdown 2+4\r
1774         objSystem.Win32Shutdown 2+4\r
1775     Next\r
1776                 \r
1777     'msgbox "Please wait while computer restarts ...",0,"WinOF"\r
1778 \r
1779 End Sub\r
1780 \r
1781 \r
1782 ' Determine if an existing WinOF or openib-window installation is present.\r
1783 ' If previous install exists, determined by registry entry for service/ibbus,\r
1784 ' then uninstall and reboot.\r
1785 ' Called in immediate mode, condition: INSTALL=1\r
1786 \r
1787 Function ChkInstallAndReboot()\r
1788     Const wshYes = 6\r
1789     Const wshNo = 7\r
1790     Const wshYesNoDialog = 4\r
1791     Const wshQuestionMark = 32\r
1792 \r
1793     Dim status ' check if ibbus.sys exists, if not the reboot won't happen\r
1794     Dim fso, originalReboot\r
1795     Set fso = CreateObject("Scripting.FileSystemObject")    \r
1796     status = 0\r
1797     \r
1798     Set WshShell = CreateObject("WScript.Shell")\r
1799     Return = WshShell.Run ("reg.exe query HKLM\SYSTEM\CurrentControlSet\Services\ibbus /v ImagePath", 0, true)\r
1800     If (Return = 0) And (Err.Number = 0) Then\r
1801         Status = Status + 1\r
1802     End if\r
1803     \r
1804     originalReboot = Session.Property("REBOOT")\r
1805 \r
1806     DriverUninstall\r
1807 \r
1808     ' if we can't find registry entry, then no need to uninstall/restart.\r
1809     ' Proceed with installation\r
1810     If status = 0 then\r
1811         ' msgbox "No existing InfiniBand installation detected"\r
1812         Session.Property("REBOOT") = originalReboot \r
1813         Exit Function\r
1814     End if\r
1815         \r
1816     Dim sys_folder, drv_folder\r
1817     ' Idea here is to rename driver files to force a driver\r
1818     ' load failure upon next reboot so ensuing install will\r
1819     ' succeed.\r
1820     sys_folder = Session.Property("WindowsFolder") & "system32"\r
1821     drv_folder = sys_folder & "\drivers"\r
1822         \r
1823     If fso.FileExists(drv_folder & "\ibbus.sys") Then\r
1824         FileMove drv_folder & "\ibbus.sys",drv_folder & "\ibbus.sy1"\r
1825     End if\r
1826     If fso.FileExists(drv_folder & "\mthca.sys") Then\r
1827         FileMove drv_folder & "\mthca.sys",drv_folder & "\mthca.sy1"\r
1828     End if      \r
1829     If fso.FileExists(sys_folder & "\ibinstaller.dll") Then\r
1830         FileMove sys_folder & "\ibinstaller.dll",sys_folder & "\ibinstaller1.dll"\r
1831     End if\r
1832 \r
1833     ' Notify the user an existing non WinOF IB installation was detected and\r
1834     ' the system will be rebooted.\r
1835     dim res\r
1836         \r
1837     res = WshShell.Popup("Existing InfiniBand installation has been removed." _\r
1838              & vbCRLF & vbCRLF & "Automatic REBOOT in 10 seconds."_\r
1839              & vbCRLF & "Please re-install WinOF."_\r
1840              ,13,"WinOF - Existing InfiniBand installation Detected")\r
1841  \r
1842     'run_once_cmd = Session.Property("SETUPEXEDIR") & "\setup.exe"\r
1843     'RunAtReboot "WinOF", run_once_cmd\r
1844     \r
1845     ' the _Driver Uninstall call sets reboot=force. The ForceReboot action\r
1846     ' following this CustomAction will fire when reboot is set =force.\r
1847     ' The problem is we need to fail the installation so it cleans up, not\r
1848     ' a partial install, and still reboots - So far IS-12 doesn;t support\r
1849     ' this behavior.\r
1850 \r
1851     ScheduleLocalReboot\r
1852 \r
1853     ' Fail the install so cleanup occurs.\r
1854     ' Upon system restart, WinOF installation needs to be restarted \r
1855     ' consider a run-once invocation.\r
1856 \r
1857         ChkInstallAndReboot = 2 ' will force install cleanup.\r
1858 \r
1859 End Function\r
1860 \r
1861 \r
1862 ' Not Used - idea was to run %SystemRoot%\temp\WinOFcleanup.bat on the next\r
1863 ' reboot to remove driver files which did not get uninstalled (win2K3 only);\r
1864 ' script ran, files persisted on Win2K3? WIX call to invoke this Sub was\r
1865 ' removed.\r
1866 \r
1867 Sub RunOnceCleanup\r
1868   Dim fso, sInstalldir, sTemp, cmd\r
1869   Set fso=CreateObject("Scripting.FileSystemObject") \r
1870 \r
1871   On Error Resume Next\r
1872 \r
1873   sInstalldir = Session.Property("REMOVE")\r
1874   If sInstalldir <> "ALL" Then\r
1875       Exit Sub\r
1876   End if\r
1877 \r
1878   sInstalldir = Session.Property("INSTALLDIR")\r
1879 \r
1880   If Not fso.FileExists(sInstalldir & "WinOFclean.bat") Then\r
1881      Exit Sub\r
1882   End if\r
1883 \r
1884   ' copy WinOFclean.bat to %SystemRoot%\temp for runOnce cmd\r
1885   sTemp = fso.GetSpecialFolder(0) & "\temp\WinOFclean.bat"\r
1886   Err.clear\r
1887   fso.CopyFile sInstalldir & "WinOFclean.bat", sTemp \r
1888   If Err.Number = 0 Then\r
1889       cmd = "cmd.exe /C " & sTemp\r
1890       RunAtReboot "WinOF", cmd\r
1891       ' 2nd cmd to remove previous script.\r
1892       cmd = "cmd.exe /C del /F/Q " & sTemp\r
1893       RunAtReboot "WinOF2", cmd\r
1894   End if\r
1895 \r
1896 End Sub\r
1897 \r
1898 \r
1899 ' WIX has appended [INSTALLDIR] to the system search path via <Environment>.\r
1900 ' Unfortunately WIX does not _Broadcast_ to all top-level windows the registry\r
1901 ' Settings for '%PATH%' have changed. Run nsc to do the broadcast.\r
1902  \r
1903 Sub BcastRegChanged\r
1904     Dim RC, sInstallDir\r
1905     Set WshShell=CreateObject("WScript.Shell")\r
1906 \r
1907     sInstallDir = Session.Property("INSTALLDIR")\r
1908 \r
1909         On Error Resume Next \r
1910     WshShell.Run "%COMSPEC% /c cd " & sInstallDir & " & nsc.exe", 0, true\r
1911     Err.clear\r
1912     BcastRegChanged = 0\r
1913 \r
1914 End Sub\r
1915 \r
1916 \r
1917 ' This routine should never be...InstallShield-12 for some reason has\r
1918 ' decided not to completely remove [INSTALLDIR]? Until such a time\r
1919 ' that 'why' is understood, this routine removes [INSTALLDIR]! Sigh...\r
1920 ' nuke some driver files which remain due to devcon device install.\r
1921 ' Immediate execution; called after MsiCleanupOnSuccess (REMOVE="ALL")\r
1922 \r
1923 Sub HammerTime\r
1924     Dim fso, sInstallDir, RC, cmd\r
1925 \r
1926     Set fso=CreateObject("Scripting.FileSystemObject") \r
1927     Set WshShell=CreateObject("WScript.Shell")\r
1928 \r
1929     sInstallDir = Session.Property("INSTALLDIR")\r
1930     If fso.FolderExists(sInstallDir) Then\r
1931         cmd = "cmd.exe /c rmdir /S /Q """ & sInstallDir & """"\r
1932         RC = wshShell.Run(cmd,0,true)\r
1933     End if\r
1934 \r
1935     RemoveFolder "C:\IBSDK"\r
1936 \r
1937     ' WIX does this - SysPathRemove(sInstallDir)\r
1938 \r
1939 End Sub\r
1940 \r
1941 \r
1942 ' NOT USED - deferred action to increment ticks while action is taking place\r
1943 '\r
1944 Function AddProgressInfo( )\r
1945         Const INSTALLMESSAGE_ACTIONSTART = &H08000000\r
1946         Const INSTALLMESSAGE_ACTIONDATA  = &H09000000 \r
1947         Const INSTALLMESSAGE_PROGRESS    = &H0A000000 \r
1948 \r
1949         Set rec = Installer.CreateRecord(3)\r
1950         \r
1951         rec.StringData(1) = "callAddProgressInfo"\r
1952         rec.StringData(2) = "Incrementing the progress bar..."\r
1953         rec.StringData(3) = "Incrementing tick [1] of [2]"\r
1954         \r
1955         'Message INSTALLMESSAGE_ACTIONSTART, rec\r
1956         \r
1957         rec.IntegerData(1) = 1\r
1958         rec.IntegerData(2) = 1\r
1959         rec.IntegerData(3) = 0\r
1960         \r
1961         Message INSTALLMESSAGE_PROGRESS, rec\r
1962         \r
1963         Set progrec = Installer.CreateRecord(3)\r
1964         \r
1965         progrec.IntegerData(1) = 2\r
1966         progrec.IntegerData(2) = 5000\r
1967         progrec.IntegerData(3) = 0\r
1968         \r
1969         rec.IntegerData(2) = 1500000\r
1970         \r
1971         For i = 0 To 5000000 Step 5000\r
1972             rec.IntegerData(1) = i\r
1973             ' action data appears only if a text control subscribes to it\r
1974             ' Message INSTALLMESSAGE_ACTIONDATA, rec\r
1975             Message INSTALLMESSAGE_PROGRESS, progrec\r
1976         Next ' i\r
1977         \r
1978         ' return success to MSI\r
1979         AddProgressInfo = 0\r
1980 End Function\r
1981 \r
1982 \r
1983 ' Called when .msi 'CHANGE' (ADD/REMOVE) installation was selected.\r
1984 ' Currently only handles SRP & VNIC\r
1985 \r
1986 Function InstallChanged\r
1987 \r
1988     Dim RC, sInstallDir, sAddLocal, sRemove, sDRIVERS, NeedReboot\r
1989     Err.clear\r
1990 \r
1991     sRemove = Session.Property("REMOVE")\r
1992         If sRemove = "ALL" Then\r
1993                 Exit Function\r
1994         End If\r
1995 \r
1996     Set WshShell=CreateObject("WScript.Shell")\r
1997     Set fso = CreateObject("Scripting.FileSystemObject")\r
1998 \r
1999         NeedReboot = 0\r
2000 \r
2001     sInstallDir = Session.Property("INSTALLDIR")\r
2002     sAddLocal = Session.Property("ADDLOCAL")\r
2003 \r
2004     devman =    "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "\r
2005     devmanEXE1 = "..\IBcore\devman.exe "\r
2006     devmanQL =  "cmd.exe /c cd /d " & sInstalldir & "qlgcvnic & " & devmanEXE1\r
2007     devmanSRP = "cmd.exe /c cd /d " & sInstalldir & "SRP & " & devmanEXE1\r
2008 \r
2009         On Error Resume Next \r
2010 \r
2011         If (Not IsNull(sAddLocal)) AND (sAddLocal <> "") Then\r
2012                 If Instr(sAddLocal,"fSRP") OR Instr(sAddLocal,"fVNIC") Then\r
2013                         Install_IOU WshShell,devman\r
2014                 End If\r
2015 \r
2016                 If Instr(sAddLocal,"fSRP") Then\r
2017                 If fso.FileExists(sInstalldir & "SRP\ib_srp.inf") Then\r
2018                                 Install_SRP WshShell,devmanSRP\r
2019                         Else\r
2020                         msgbox "Install_SRP - missing " & sInstalldir & "SRP\ib_srp.inf"\r
2021                         End If\r
2022                 End If\r
2023 \r
2024                 If Instr(sAddLocal,"fVNIC") Then\r
2025                 If fso.FileExists(sInstalldir & "qlgcvnic\netvnic.inf") Then\r
2026                                 Install_VNIC WshShell,devmanQL\r
2027                         Else\r
2028                                 msgbox "Install_VNIC - missing " & sInstalldir & _\r
2029                                                 "qlgcvnic\netvnic.inf"\r
2030                         End If\r
2031                 End If\r
2032         End If\r
2033 \r
2034         If (Not IsNull(sRemove)) AND (sRemove <> "") Then\r
2035 \r
2036                 If Instr(sRemove,"fSRP") Then\r
2037                         Uninstall_SRP fso,WshShell,Null,sInstalldir\r
2038                         NeedReboot = NeedReboot + 1\r
2039                 End If\r
2040 \r
2041                 If Instr(sRemove,"fVNIC") Then\r
2042                         Uninstall_VNIC fso,WshShell,Null,sInstalldir\r
2043                         NeedReboot = NeedReboot + 1\r
2044                 End If\r
2045         End If\r
2046 \r
2047         If NeedReboot Then\r
2048                 Session.Property("REBOOT") = "FORCE"      \r
2049                 InstallChanged = ERROR_SUCCESS_REBOOT_REQUIRED\r
2050                 ' until forced rebot relly works....\r
2051                 msgbox "A system reboot is required to complete this operation." _\r
2052                                 & vbCrLf & "Please do so at your earliest convinence."\r
2053         End If\r
2054 \r
2055 End Function\r
2056 \r