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