| '*************************************************************************␊ |
| '*␊ |
| '* File: Fix_7hdc.vbs␊ |
| '* Created: 2011-01-03 by cdob␊ |
| '* Version: 0.11␊ |
| '*␊ |
| '* http://www.911cd.net/forums//index.php?showtopic=24245␊ |
| '*␊ |
| '* Purpose:␊ |
| '* enable installed, but disabled mass storage drivers, e.g. msahci.sys␊ |
| '* install additional mass storage drivers␊ |
| '*␊ |
| '* Runtime environment:␊ |
| '* Windows 7 installation DVD / USB␊ |
| '* relating PE␊ |
| '*␊ |
| '* used external applications (default integrated at runtime environment)␊ |
| '* reg.exe, dism.exe, notepad.exe␊ |
| '*␊ |
| '*************************************************************************␊ |
| ␊ |
| ' ------------------------------------------------------------------------␊ |
| '␊ |
| ' based on PNPDriverMatch.vbs␊ |
| ' http://technet.microsoft.com/en-us/magazine/2006.05.utilityspotlight.aspx␊ |
| '␊ |
| ' I agree that Microsoft has no warranty, obligations or liability␊ |
| ' for any Sample Application Files.␊ |
| '␊ |
| '<header original file> ==================================================␊ |
| '␊ |
| ' Windows Script Host Sample Script␊ |
| '␊ |
| ' ------------------------------------------------------------------------␊ |
| ' Copyright (C) 2006 Microsoft Corporation␊ |
| '␊ |
| ' You have a royalty-free right to use, modify, reproduce and distribute␊ |
| ' the Sample Application Files (and/or any modified version) in any way␊ |
| ' you find useful, provided that you agree that Microsoft has no warranty,␊ |
| ' obligations or liability for any Sample Application Files.␊ |
| ' ------------------------------------------------------------------------␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* File: PNPDriverMatch.vbs␊ |
| '* Created: 03/06/2006␊ |
| '* Version: 1.0.2␊ |
| '*␊ |
| '* Main Function: VBScipt to examine a folder of Plug & Play drivers,␊ |
| '* find INF files that have PNP IDs found on the computer,␊ |
| '* and optionally copy the matching drivers folders to a␊ |
| '* specified destination folder.␊ |
| '*␊ |
| '* Usage: cscript PNPDriverMatch.vbs /folder:folder path␊ |
| '* [/dest:folder path] [/log:log file path]␊ |
| '* [/class:class filter] [/provider:provider filter]␊ |
| '* [/excludeclass] [/excludeprovider] [/q] [/?]␊ |
| '*␊ |
| '* Copyright (C) 2006 Microsoft Corporation␊ |
| '*␊ |
| '*␊ |
| '* Revisions:␊ |
| '*␊ |
| '* 1.0.0 - 06/22/2005 - Created.␊ |
| '* 1.0.1 - 03/06/2006 - Updated RegularExpression class. Changed␊ |
| '* Expang_objDriverFolderDictStringVariables function to use␊ |
| '* updated MatchText method of the␊ |
| '* RegularExpression class␊ |
| '* 1.0.2 - 03/22/2006 - Added EscapeXmlMarkup method to RegularExpression␊ |
| '* class.␊ |
| '*␊ |
| '********************************************************************␊ |
| '␊ |
| '</header original file> ============================================␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| ' * Declare Variables␊ |
| '********************************************************************␊ |
| ␊ |
| Option Explicit␊ |
| 'On Error Resume Next␊ |
| ␊ |
| Dim arrArguments()␊ |
| ␊ |
| Dim blnQuiet␊ |
| Dim blnExcludeProvider␊ |
| Dim blnExcludeClass␊ |
| Dim blnClassOutput␊ |
| Dim blnProviderOutput␊ |
| Dim blnEnableDrivers␊ |
| Dim blnInstallDrivers␊ |
| Dim blnRestore␊ |
| Dim blnGuiMode␊ |
| ␊ |
| Dim colItems␊ |
| Dim colComputerSystem␊ |
| ␊ |
| Dim g_objWshShell␊ |
| Dim g_objWshNetwork␊ |
| Dim g_objFSO␊ |
| Dim g_objINI␊ |
| Dim g_objRegExp␊ |
| Dim g_objWMIDefault␊ |
| Dim g_objRegistry␊ |
| Dim g_objWMIService␊ |
| Dim g_objPnpIdDict␊ |
| Dim g_objInfFileDict␊ |
| Dim g_objFileDict␊ |
| Dim g_objDriverFolderDict␊ |
| Dim g_objComputerSystem␊ |
| Dim g_objInfDismFileDict␊ |
| Dim g_objShellApp␊ |
| Dim objFolderItem␊ |
| Dim objFolder ␊ |
| ␊ |
| Dim i␊ |
| Dim intOpMode␊ |
| ␊ |
| Dim Key␊ |
| ␊ |
| Dim lRC␊ |
| ␊ |
| Dim objComputerSystem␊ |
| Dim objItem␊ |
| Dim objPNPFolder␊ |
| ␊ |
| Dim refLogFile␊ |
| ␊ |
| Dim strQuote␊ |
| Dim strComputer␊ |
| Dim strComputerName␊ |
| Dim strPNPFolder␊ |
| Dim strTargetDrive␊ |
| Dim strSearchFile␊ |
| Dim strPNPDeviceID␊ |
| Dim strDriver␊ |
| Dim strClass␊ |
| Dim strClassFilter␊ |
| Dim strProviderName␊ |
| Dim strProviderFilter␊ |
| Dim strLogFile␊ |
| Dim strOptionsMessage␊ |
| Dim strDriverParentFolder␊ |
| Dim strDriverRelativePath␊ |
| Dim strDriverDestFolder␊ |
| Dim strDriverDestParentFolder␊ |
| ␊ |
| ' Define constants␊ |
| Const CONST_ERROR = 0␊ |
| Const CONST_WSCRIPT = 1␊ |
| Const CONST_CSCRIPT = 2␊ |
| Const CONST_SHOW_USAGE = 3␊ |
| Const CONST_PROCEED = 4␊ |
| Const CONST_STRING_NOT_FOUND = -1␊ |
| Const CONST_FOR_READING = 1␊ |
| Const CONST_FOR_WRITING = 2␊ |
| Const CONST_FOR_APPENDING = 8␊ |
| Const CONST_Success = 0␊ |
| Const CONST_Failure = 1␊ |
| ␊ |
| Const wbemFlagReturnImmediately = &h10␊ |
| Const wbemFlagForwardOnly = &h20␊ |
| Const strEnumKey = "SYSTEM\CurrentControlSet\Enum\"␊ |
| Const strClassKey = "SYSTEM\CurrentControlSet\Control\Class\"␊ |
| Const strServicesKey = "SYSTEM\CurrentControlSet\Services\"␊ |
| ␊ |
| Const HKEY_CLASSES_ROOT = &H80000000␊ |
| Const HKEY_CURRENT_USER = &H80000001␊ |
| Const HKEY_LOCAL_MACHINE = &H80000002␊ |
| Const HKEY_USERS = &H80000003␊ |
| Const HKEY_CURRENT_CONFIG = &H80000005␊ |
| Const HKEY_DYN_DATA = &H80000006␊ |
| ␊ |
| Const REG_SZ = 1␊ |
| Const REG_EXPAND_SZ = 2␊ |
| Const REG_BINARY = 3␊ |
| Const REG_DWORD = 4␊ |
| Const REG_MULTI_SZ = 7␊ |
| ␊ |
| Const DICTIONARY_COMPAREMODE_BINARY = 0␊ |
| Const DICTIONARY_COMPAREMODE_TEXT = 1␊ |
| Const DICTIONARY_COMPAREMODE_DATABASE = 2␊ |
| ␊ |
| strQuote = chr(34)␊ |
| ␊ |
| ␊ |
| '***** Initialize variables␊ |
| strComputer = "."␊ |
| strTargetDrive = ""␊ |
| strSearchFile = ""␊ |
| strProviderFilter = ""␊ |
| strClassFilter = ""␊ |
| blnExcludeProvider = False␊ |
| blnExcludeClass = False␊ |
| blnEnableDrivers = False␊ |
| blnInstallDrivers = False␊ |
| blnRestore = False␊ |
| blnGuiMode = False␊ |
| ␊ |
| '********************************************************************␊ |
| ' * Create Objects␊ |
| '********************************************************************␊ |
| ␊ |
| ␊ |
| Set g_objFSO = CreateObject("Scripting.FileSystemObject")␊ |
| Set g_objWshShell = CreateObject("Wscript.Shell")␊ |
| Set g_objWshNetwork = CreateObject("Wscript.Network")␊ |
| Set g_objShellApp = CreateObject("Shell.Application")␊ |
| ␊ |
| Set g_objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")␊ |
| Set g_objWMIDefault = GetObject("winmgmts:\\" & strComputer & "\root\Default")␊ |
| Set g_objRegistry = g_objWMIDefault.Get ("StdRegProv")␊ |
| ␊ |
| Set g_objPnpIdDict = CreateObject("Scripting.Dictionary")␊ |
| g_objPnpIdDict.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| ␊ |
| Set g_objInfFileDict = CreateObject("Scripting.Dictionary")␊ |
| g_objInfFileDict.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| ␊ |
| Set g_objDriverFolderDict = CreateObject("Scripting.Dictionary")␊ |
| g_objDriverFolderDict.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| ␊ |
| 'my addon␊ |
| 'Set g_objFileDict = CreateObject("Scripting.Dictionary")␊ |
| 'g_objFileDict.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| ␊ |
| Set g_objInfDismFileDict = CreateObject("Scripting.Dictionary")␊ |
| g_objInfDismFileDict.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| ␊ |
| ␊ |
| 'added␊ |
| Dim dHwid, inf_count, objDiskDrives, objDrive␊ |
| Set g_objDriverFolderDict = CreateObject("Scripting.Dictionary")␊ |
| 'g_objDriverFolderDict.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| Set dHwid = CreateObject("Scripting.Dictionary")␊ |
| dHWid.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| inf_count = 0␊ |
| ␊ |
| 'strPNPFolder = g_objFSO.GetParentFolderName(WScript.ScriptFullName) & "\" & g_objWshShell.Environment("Process").Item("PROCESSOR_ARCHITECTURE")␊ |
| strPNPFolder = g_objFSO.GetParentFolderName(WScript.ScriptFullName) & "\" & g_objWshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%")␊ |
| ␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| ' * Check script host exe and parse command line␊ |
| '********************************************************************␊ |
| If Wscript.arguments.count = 0 Then␊ |
| blnQuiet = True␊ |
| Else ␊ |
| 'Get the command line arguments␊ |
| For i = 0 to Wscript.arguments.count - 1␊ |
| ReDim Preserve arrArguments(i)␊ |
| arrArguments(i) = Wscript.arguments.item(i)␊ |
| Next␊ |
| ␊ |
| 'Parse the command line␊ |
| Err.Clear()␊ |
| intOpMode = intParseCmdLine(arrArguments, strPNPFolder, strTargetDrive, strSearchFile, strLogFile, strClassFilter, strProviderFilter, blnExcludeClass, blnExcludeProvider, blnQuiet, blnEnableDrivers, blnInstallDrivers, blnRestore, strOptionsMessage)␊ |
| ␊ |
| If Err.Number Then␊ |
| Wscript.Echo "Error 0X" & CStr(Hex(Err.Number)) & " occurred in parsing the command line."␊ |
| If Err.Description <> "" Then␊ |
| Wscript.Echo "Error description: " & Err.Description & "."␊ |
| End If␊ |
| WScript.quit␊ |
| End If␊ |
| ␊ |
| Select Case intOpMode␊ |
| Case CONST_SHOW_USAGE␊ |
| Call ShowUsage()␊ |
| WScript.quit␊ |
| Case CONST_PROCEED␊ |
| 'Do nothing.␊ |
| Case CONST_ERROR␊ |
| WScript.quit␊ |
| Case Else␊ |
| Wscript.Echo "Error occurred in passing parameters."␊ |
| End Select␊ |
| ␊ |
| WScript.Echo strOptionsMessage␊ |
| End If␊ |
| ␊ |
| '********************************************************************␊ |
| '* Main Script␊ |
| '********************************************************************␊ |
| 'no command line mode set: enable gui mode␊ |
| If not blnEnableDrivers And not blnInstallDrivers Then␊ |
| 'Wscript.Echo "no command line mode set: enable gui mode"␊ |
| blnGuiMode = True␊ |
| blnEnableDrivers = True␊ |
| blnInstallDrivers = True␊ |
| 'enable logging␊ |
| If strLogFile = "" Then strLogFile = g_objFSO.GetSpecialFolder(2) & "\fix_7hdc-" & g_objFSO.GetTempName & ".log"␊ |
| End If␊ |
| ␊ |
| '***** Open Log File␊ |
| If strLogFile <> "" Then␊ |
| Err.Clear()␊ |
| Set refLogFile = g_objFSO.OpenTextFile(strLogFile, CONST_FOR_WRITING, True)␊ |
| If Err.Number Then␊ |
| Wscript.Echo "Error 0X" & CStr(Hex(Err.Number)) & " occurred when opening the log file."␊ |
| If Err.Description <> "" Then␊ |
| Wscript.Echo "Error description: " & Err.Description & "."␊ |
| End If␊ |
| WScript.quit␊ |
| End If␊ |
| ␊ |
| AppendLog(strOptionsMessage)␊ |
| End If␊ |
| ␊ |
| Print(Now)␊ |
| Print("Computer System:")␊ |
| Set colComputerSystem = g_objWMIService.ExecQuery("Select * from Win32_ComputerSystem",,48)␊ |
| For Each objComputerSystem in colComputerSystem␊ |
| Print("Manufacturer: " & objComputerSystem.Manufacturer)␊ |
| Print("Model: " & objComputerSystem.Model)␊ |
| Next␊ |
| Print("")␊ |
| ␊ |
| 'search target disk drive, use first match␊ |
| If strTargetDrive = "" And strSearchFile <> "" Then␊ |
| For Each objDrive in g_objFSO.Drives␊ |
| If objDrive.IsReady And strTargetDrive = "" Then ␊ |
| If g_objFSO.FileExists(objDrive & strSearchFile) Then ␊ |
| strTargetDrive = objDrive␊ |
| Print("found windows drive: " & strTargetDrive)␊ |
| End If␊ |
| End If␊ |
| Next␊ |
| End If␊ |
| ␊ |
| 'debug␊ |
| If strLogFile <> "" Then␊ |
| AppendLog("")␊ |
| AppendLog("strTargetDrive: " & strTargetDrive)␊ |
| AppendLog("strSearchFile: " & strSearchFile)␊ |
| AppendLog("blnEnableDrivers: " & blnEnableDrivers)␊ |
| AppendLog("blnInstallDrivers: " & blnInstallDrivers)␊ |
| AppendLog("blnRestore " & blnRestore)␊ |
| AppendLog("")␊ |
| End If␊ |
| ␊ |
| ␊ |
| If blnEnableDrivers Then␊ |
| If strTargetDrive = "" Then␊ |
| Set objFolder = g_objShellApp.BrowseForFolder(0, "Mode: Enable drivers." & vbCr & vbCr & "Select a Win 7 drive:", 1, &H11)␊ |
| If not objFolder Is Nothing Then␊ |
| Set objFolderItem = objFolder.Self␊ |
| strTargetDrive = objFolderItem.Path␊ |
| Print("strTargetDrive: " & strTargetDrive)␊ |
| End If␊ |
| End If␊ |
| ␊ |
| If g_objFSO.FolderExists(strTargetDrive & "\windows\system32\config") Then ␊ |
| EnableDrivers␊ |
| Else␊ |
| Wscript.Echo "Error: " & strTargetDrive & "\windows\system32\config not found"␊ |
| If blnGuiMode Then g_objWshShell.Run "notepad.exe " & chr(34) & strLogFile & chr(34), 1, False ␊ |
| Wscript.Quit␊ |
| End If␊ |
| End If␊ |
| ␊ |
| If blnInstallDrivers Then␊ |
| 'Print ("Install mode")␊ |
| If strTargetDrive = "" Then␊ |
| Set objFolder = g_objShellApp.BrowseForFolder(0, "Mode: Install drivers." & vbCr & vbCr & "Select a Win 7 drive:", 1, &H11)␊ |
| If objFolder Is Nothing Then␊ |
| Wscript.Echo "no drive selected"␊ |
| If blnGuiMode Then g_objWshShell.Run "notepad.exe " & chr(34) & strLogFile & chr(34), 1, False␊ |
| WScript.Quit␊ |
| End If␊ |
| Set objFolderItem = objFolder.Self␊ |
| strTargetDrive = objFolderItem.Path␊ |
| Print("strTargetDrive: " & strTargetDrive)␊ |
| End If␊ |
| ␊ |
| If not g_objFSO.FolderExists(strTargetDrive & "\windows\system32\config") Then␊ |
| Wscript.Echo "Error: " & strTargetDrive & "\windows\system32\config not found"␊ |
| If blnGuiMode Then g_objWshShell.Run "notepad.exe " & chr(34) & strLogFile & chr(34), 1, False␊ |
| WScript.Quit␊ |
| End If␊ |
| ␊ |
| If not g_objFSO.FolderExists(strPNPFolder) Or blnGuiMode Then␊ |
| Set objFolder = g_objShellApp.BrowseForFolder(0, "Select a driver folder:", 1, &H11)␊ |
| If objFolder Is Nothing Then␊ |
| Wscript.Echo "no drive selected"␊ |
| If blnGuiMode Then g_objWshShell.Run "notepad.exe " & chr(34) & strLogFile & chr(34), 1, False␊ |
| WScript.Quit␊ |
| End If␊ |
| Set objFolderItem = objFolder.Self␊ |
| strPNPFolder = objFolderItem.Path␊ |
| Print("strPNPFolder: " & strPNPFolder)␊ |
| End If␊ |
| ␊ |
| If not g_objFSO.FolderExists(strPNPFolder) Then␊ |
| WScript.Echo "The PNP folder path '" & strPNPFolder & "' does not exist." & vbCr & _␊ |
| "Please check the input and try again."␊ |
| WScript.Quit␊ |
| End If␊ |
| ␊ |
| InstallDrivers␊ |
| End If␊ |
| ␊ |
| If blnRestore Then␊ |
| 'todo 2525␊ |
| End If␊ |
| ␊ |
| ␊ |
| If strLogFile <> "" Then refLogFile.Close()␊ |
| If blnGuiMode Then g_objWshShell.Run "notepad.exe " & chr(34) & strLogFile & chr(34), 1, False␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Function intChkProgram()␊ |
| '*␊ |
| '* Purpose: Determines which program is used to run this script.␊ |
| '*␊ |
| '* Input: None␊ |
| '*␊ |
| '* Returns: intChkProgram is set to one of CONST_ERROR, CONST_WSCRIPT,␊ |
| '* and CONST_CSCRIPT.␊ |
| '*␊ |
| '********************************************************************␊ |
| Private Function intChkProgram()␊ |
| ␊ |
| ON ERROR RESUME NEXT␊ |
| ␊ |
| Dim i␊ |
| Dim j␊ |
| Dim strFullName␊ |
| Dim strCommand␊ |
| ␊ |
| 'strFullName should be something like C:\WINDOWS\COMMAND\CSCRIPT.EXE␊ |
| strFullName = WScript.FullName␊ |
| If Err.Number Then␊ |
| Wscript.Echo "Error 0x" & CStr(Hex(Err.Number)) & " occurred."␊ |
| If Err.Description <> "" Then␊ |
| Wscript.Echo "Error description: " & Err.Description & "."␊ |
| End If␊ |
| intChkProgram = CONST_ERROR␊ |
| Exit Function␊ |
| End If␊ |
| ␊ |
| i = InStr(1, strFullName, ".exe", 1)␊ |
| If i = 0 Then␊ |
| intChkProgram = CONST_ERROR␊ |
| Exit Function␊ |
| Else␊ |
| j = InStrRev(strFullName, "\", i, 1)␊ |
| If j = 0 Then␊ |
| intChkProgram = CONST_ERROR␊ |
| Exit Function␊ |
| Else␊ |
| strCommand = Mid(strFullName, j+1, i-j-1)␊ |
| Select Case LCase(strCommand)␊ |
| Case "cscript"␊ |
| intChkProgram = CONST_CSCRIPT␊ |
| Case "wscript"␊ |
| intChkProgram = CONST_WSCRIPT␊ |
| Case Else 'should never happen␊ |
| Wscript.Echo "An unexpected program is used to run this script."␊ |
| Wscript.Echo "Only CScript.Exe or WScript.Exe can be used to run this script."␊ |
| intChkProgram = CONST_ERROR␊ |
| End Select␊ |
| End If␊ |
| End If␊ |
| ␊ |
| End Function␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Function intParseCmdLine()␊ |
| '*␊ |
| '* Purpose: Parses the command line.␊ |
| '*␊ |
| '* Input: arrArguments an array containing input from the command line␊ |
| '*␊ |
| '* Output: strPNPFolder Path to Plug & Play top folder␊ |
| '* strLogFile Output file␊ |
| '* strClassFilter Device Class used to filter output␊ |
| '* strProviderFilter Device Provider used to filter output␊ |
| '* blnExcludeClass Exclude filtered Class items from output␊ |
| '* blnExcludeProvider Exclude filtered Provider items from output␊ |
| '* blnQuiet Specifies whether to suppress messages␊ |
| '* strOptionsMessage String containing options selected␊ |
| '*␊ |
| '* Returns: intParseCmdLine is set to one of CONST_ERROR, CONST_SHOW_USAGE,␊ |
| '* and CONST_PROCEED.␊ |
| '*␊ |
| '********************************************************************␊ |
| Private Function intParseCmdLine(arrArguments, strPNPFolder, strTargetDrive, strSearchFile, strLogFile, strClassFilter, strProviderFilter, blnExcludeClass, blnExcludeProvider, blnQuiet, blnEnableDrivers, blnInstallDrivers, blnRestore, strOptionsMessage)␊ |
| ␊ |
| ON ERROR RESUME NEXT␊ |
| ␊ |
| Dim i␊ |
| Dim strFlag␊ |
| Dim strSwitchValue␊ |
| ␊ |
| strFlag = arrArguments(0)␊ |
| Err.Clear()␊ |
| ␊ |
| 'Help is needed␊ |
| If (strFlag = "") OR (strFlag="help") OR (strFlag="/h") OR (strFlag="\h") OR (strFlag="-h") _␊ |
| OR (strFlag = "\?") OR (strFlag = "/?") OR (strFlag = "?") OR (strFlag="h") Then␊ |
| intParseCmdLine = CONST_SHOW_USAGE␊ |
| Exit Function␊ |
| End If␊ |
| ␊ |
| strOptionsMessage = strOptionsMessage & "Fix_7hdc.vbs" & VbCrLf␊ |
| strOptionsMessage = strOptionsMessage & "" & VbCrLf␊ |
| strOptionsMessage = strOptionsMessage & "Command Line Options:" & vbCrLf␊ |
| strOptionsMessage = strOptionsMessage & "---------------------------------------" & VbCrLf␊ |
| ␊ |
| For i = 0 to UBound(arrArguments)␊ |
| strFlag = Left(arrArguments(i), InStr(1, arrArguments(i), ":")-1)␊ |
| If Err.Number Then 'An error occurs if there is no : in the string␊ |
| Err.Clear␊ |
| If LCase(arrArguments(i)) = "/q" Then␊ |
| blnQuiet = True␊ |
| strOptionsMessage = strOptionsMessage & "Supress Console Log Output: " & blnQuiet & VbCrLf␊ |
| Elseif LCase(arrArguments(i)) = "/search" Then␊ |
| strSearchFile = "\windows\system32\winload.exe"␊ |
| strOptionsMessage = strOptionsMessage & "Search folder: " & strSearchFile & VbCrLf␊ |
| Elseif LCase(arrArguments(i)) = "/enable" Then␊ |
| blnEnableDrivers = True␊ |
| strOptionsMessage = strOptionsMessage & "Enable, disalbed drivers." & VbCrLf␊ |
| Elseif LCase(arrArguments(i)) = "/install" Then␊ |
| blnInstallDrivers = True␊ |
| strOptionsMessage = strOptionsMessage & "Install Plug & Play drivers." & VbCrLf␊ |
| Elseif LCase(arrArguments(i)) = "/restore" Then␊ |
| blnRestore = True␊ |
| strOptionsMessage = strOptionsMessage & "restore mode" & VbCrLf␊ |
| Elseif LCase(arrArguments(i)) = "/excludeclass" Then␊ |
| blnExcludeClass = True␊ |
| strOptionsMessage = strOptionsMessage & "Output file excludes specified filtered Class: " & blnExcludeClass & VbCrLf␊ |
| Elseif LCase(arrArguments(i)) = "/excludeprovider" Then␊ |
| blnInstallDrivers = True␊ |
| strOptionsMessage = strOptionsMessage & "Output file excludes specified filtered Provider: " & blnExcludeProvider & VbCrLf␊ |
| Else␊ |
| Wscript.Echo arrArguments(i) & " is not recognized as a valid input.."␊ |
| intParseCmdLine = CONST_ERROR␊ |
| Exit Function␊ |
| End If␊ |
| Else␊ |
| strSwitchValue = Right(arrArguments(i), Len(arrArguments(i))-(Len(strFlag)+1))␊ |
| Select Case LCase(strFlag)␊ |
| Case "/install"␊ |
| strPNPFolder = strSwitchValue␊ |
| blnInstallDrivers = True␊ |
| strOptionsMessage = strOptionsMessage & "Plug & Play drivers top folder: " & strPNPFolder & VbCrLf␊ |
| Case "/target"␊ |
| strTargetDrive = strSwitchValue␊ |
| strOptionsMessage = strOptionsMessage & "Target drive: " & strTargetDrive & VbCrLf␊ |
| Case "/search"␊ |
| strSearchFile = strSwitchValue␊ |
| strOptionsMessage = strOptionsMessage & "Search folder: " & strSearchFile & VbCrLf␊ |
| Case "/log"␊ |
| strLogFile = strSwitchValue␊ |
| strOptionsMessage = strOptionsMessage & "Output log file name: " & strLogFile & vbCrLf␊ |
| Case "/class"␊ |
| strClassFilter = strSwitchValue␊ |
| strOptionsMessage = strOptionsMessage & "Device Class filter: " & strClassFilter & vbCrLf␊ |
| Case "/provider"␊ |
| strProviderFilter = strSwitchValue␊ |
| strOptionsMessage = strOptionsMessage & "Device Provider filter: " & strProviderFilter & VbCrLf␊ |
| Case else␊ |
| Wscript.Echo "Invalid flag " & strFlag & "."␊ |
| Wscript.Echo "Please check the input and try again."␊ |
| intParseCmdLine = CONST_ERROR␊ |
| Exit Function␊ |
| End Select␊ |
| End If␊ |
| Next␊ |
| ␊ |
| strOptionsMessage = strOptionsMessage & vbCrLf␊ |
| ␊ |
| intParseCmdLine = CONST_PROCEED␊ |
| ␊ |
| End Function␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Sub MassStorageHardwareIdsDict()␊ |
| '*␊ |
| '* Purpose: Output the properties of an item from the Win32_PnPEntity␊ |
| '* collection as well as associated Enum and Service Registry␊ |
| '* information.␊ |
| '*␊ |
| '* Input: objItem Item from the Win32_PnPEntity collection␊ |
| '* objPnpIdDict PNP ID dictionary (ByRef)␊ |
| '* blnAllHardwareID return all HardwareID (testing only, don't use)␊ |
| '*␊ |
| '* Dependencies: objRegistry WMI StdRegProv object␊ |
| '*␊ |
| '********************************************************************␊ |
| Sub MassStorageHardwareIdsDict(objItem, ByRef objPnpIdDict, blnAllHardwareID)␊ |
| ␊ |
| Dim arrHardwareID␊ |
| Dim arrCompatibleIDs␊ |
| Dim i␊ |
| Dim lRC␊ |
| Dim blnMassStorageID␊ |
| Dim blnGenericID␊ |
| ␊ |
| 'select mass storage controllers␊ |
| blnMassStorageID = blnAllHardwareID␊ |
| objPnpIdDict.RemoveAll␊ |
| ␊ |
| 'Print("MassStorageHardwareIdsDict: " & strEnumKey & " "& objItem.PNPDeviceID)␊ |
| ␊ |
| 'HardwareID␊ |
| lRC = g_objRegistry.GetMultiStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "HardwareID", arrHardwareID)␊ |
| If IsArray(arrHardwareID) Then␊ |
| For i = LBound(arrHardwareID) To UBound(arrHardwareID)␊ |
| If arrHardwareID(i) <> "" Then objPnpIdDict.Add arrHardwareID(i), arrHardwareID(i)␊ |
| 'special case nvrd32.inf␊ |
| If UCASE(Left(arrHardwareID(i), 11)) = "SCSI\NVIDIA" Then blnMassStorageID = True␊ |
| If UCASE(Left(arrHardwareID(i), 11)) = "*_NVRAIDBUS" Then blnMassStorageID = True␊ |
| If UCASE(Left(arrHardwareID(i), 7)) = "*NVRAID" Then blnMassStorageID = True␊ |
| Next␊ |
| End If␊ |
| 'CompatibleIDs␊ |
| lRC = g_objRegistry.GetMultiStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "CompatibleIDs", arrCompatibleIDs)␊ |
| If IsArray(arrCompatibleIDs) Then␊ |
| For i = LBound(arrCompatibleIDs) To UBound(arrCompatibleIDs)␊ |
| blnGenericID = False␊ |
| If UCASE(Left(arrCompatibleIDs(i),8)) = "PCI\VEN_" Then IF Mid(arrCompatibleIDs(i),13,5) <> "&DEV_" Then blnGenericID = True␊ |
| 'If UCASE(Left(arrCompatibleIDs(i),7)) = "PCI\CC_" Then blnGenericID = True␊ |
| ␊ |
| If not blnGenericID And arrCompatibleIDs(i) <> "" Then␊ |
| If not objPnpIdDict.Exists(arrCompatibleIDs(i)) Then objPnpIdDict.Add arrCompatibleIDs(i), arrCompatibleIDs(i)␊ |
| End If␊ |
| ␊ |
| If UCASE(Left(arrCompatibleIDs(i),9)) = "PCI\CC_01" Then blnMassStorageID = True␊ |
| If UCASE(arrCompatibleIDs(i)) = "*PNP0600" Then blnMassStorageID = True␊ |
| Next␊ |
| End If␊ |
| ␊ |
| If not blnMassStorageID Then objPnpIdDict.RemoveAll␊ |
| End Sub␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Function AppendLog()␊ |
| '*␊ |
| '* Purpose: Appends a message to the log file␊ |
| '*␊ |
| '* Input: strlInput String writen to log file␊ |
| '*␊ |
| '* Output: strMessage is appended to the log file.␊ |
| '*␊ |
| '********************************************************************␊ |
| Function AppendLog(ByRef strlInput)␊ |
| refLogFile.Writeline strlInput␊ |
| End Function␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Sub Print()␊ |
| '*␊ |
| '* Purpose: Prints a message on screen if blnQuiet = False.␊ |
| '* Prints a message to the log file if strLogFile <> "".␊ |
| '*␊ |
| '* Input: strMessage the string to print␊ |
| '*␊ |
| '* Output: strMessage is printed on screen if blnQuiet = False.␊ |
| '* strMessage is printed to the log file if strLogFile <> "".␊ |
| '*␊ |
| '********************************************************************␊ |
| Sub Print(ByRef strMessage)␊ |
| If Not blnQuiet Then␊ |
| Wscript.Echo strMessage␊ |
| End If␊ |
| If strLogFile <> "" Then␊ |
| AppendLog(strMessage)␊ |
| End If␊ |
| End Sub␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Function IsWinNT()␊ |
| '*␊ |
| '* Purpose: Tests for Windows NT/2000/XP/2003␊ |
| '*␊ |
| '* Dependencies: g_objWshShell WshShell object␊ |
| '*␊ |
| '* Returns: True on Windows NT/2000/XP/2003, False otherwise␊ |
| '*␊ |
| '********************************************************************␊ |
| Function IsWinNT␊ |
| Dim strlOS␊ |
| strlOS = g_objWshShell.Environment("Process").Item("OS")␊ |
| IsWinNT = CBool(strlOS = "Windows_NT")␊ |
| End Function␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Sub ShowUsage()␊ |
| '*␊ |
| '* Purpose: Shows the correct usage to the user.␊ |
| '*␊ |
| '* Input: None␊ |
| '*␊ |
| '* Output: Help messages are displayed on screen.␊ |
| '*␊ |
| '********************************************************************␊ |
| ␊ |
| Sub ShowUsage()␊ |
| WScript.Echo "Adjust mass storage controller driver at offline system"␊ |
| WScript.Echo "Fix for some Stop 0x0000007B Errors"␊ |
| WScript.Echo ""␊ |
| WScript.Echo "Enable installed, but disabled mass storage drivers, e.g. msahci.sys"␊ |
| WScript.Echo "Install mass storage drivers, dism.exe is used"␊ |
| WScript.Echo ""␊ |
| WScript.Echo "Usage: cscript Fix_7hdc.vbs [options]"␊ |
| WScript.Echo ""␊ |
| WScript.Echo "Options:"␊ |
| WScript.Echo ""␊ |
| WScript.Echo " /enable enable, installed but disabled MassStorage drivers"␊ |
| WScript.Echo ""␊ |
| WScript.Echo " /target:<drive> target Win7 drive"␊ |
| WScript.Echo ""␊ |
| WScript.Echo " /install:<folder> Path to the folder that will be the top of the Plug"␊ |
| WScript.Echo " & Play folder tree."␊ |
| WScript.Echo " default folder " & strPNPFolder␊ |
| WScript.Echo ""␊ |
| WScript.Echo " /search:<file> search flag file to find target Win7_drive"␊ |
| WScript.Echo " (default: \windows\system32\winload.exe)"␊ |
| WScript.Echo ""␊ |
| WScript.Echo " /restore restore registry system file"␊ |
| WScript.Echo ""␊ |
| WScript.Echo " /log:<file> (Optional) Location of the output file"␊ |
| ' WScript.Echo ""␊ |
| ' WScript.Echo " /class:<class> (Optional) Filter the output by device Clase"␊ |
| ' WScript.Echo ""␊ |
| ' WScript.Echo " /provider:<vendor> (Optional) Filter the output by driver Provider"␊ |
| ' WScript.Echo ""␊ |
| ' Wscript.echo " /excludeclass (Optional) Filtering excludes Class filtered items"␊ |
| ' WScript.Echo " from output. Default filtering in inclusive"␊ |
| ' WScript.Echo " (only the filtered items are output)."␊ |
| ' WScript.Echo ""␊ |
| ' Wscript.echo " /excludeprovider (Optional) Filtering excludes Provider filtered items"␊ |
| ' WScript.Echo " from output. Default filtering in inclusive"␊ |
| ' WScript.Echo " (only the filtered items are output)."␊ |
| WScript.Echo ""␊ |
| Wscript.echo " /q (Optional) Suppresses all data output to the console."␊ |
| WScript.Echo ""␊ |
| WScript.Echo " /? (Optional) Displays this help text."␊ |
| WScript.Echo ""␊ |
| WScript.Echo "Examples:"␊ |
| WScript.Echo "Fix_7hdc.vbs /enable /search"␊ |
| WScript.Echo "Fix_7hdc.vbs /enable /search:\users"␊ |
| WScript.Echo "Fix_7hdc.vbs /enable /install:F:\x86 /search"␊ |
| WScript.Echo "Fix_7hdc.vbs /install:D:\amd64 /target:C:"␊ |
| WScript.Echo "Fix_7hdc.vbs /install /search:\label.txt"␊ |
| WScript.Echo "Fix_7hdc.vbs /restore /target:C:"␊ |
| End Sub␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Sub EnableDrivers()␊ |
| '*␊ |
| '* Purpose: Endable disabled mass storage drivers at offline windows␊ |
| '*␊ |
| '*␊ |
| '* Dependencies: g_objFSO FileSystem object␊ |
| '*␊ |
| '********************************************************************␊ |
| Sub EnableDrivers()␊ |
| Dim blnFoundCDDB␊ |
| Dim strClassKey␊ |
| Dim strRegistyFile␊ |
| Dim strService␊ |
| Dim strDeviceDesc␊ |
| Dim l_objPnpIdDict␊ |
| Dim strControlSet␊ |
| Dim strLoadedEnumKey␊ |
| Dim strLoadedClassKey␊ |
| Dim strLoadedCDDBKey␊ |
| Dim strLoadedServicesKey␊ |
| Dim strLoadedService␊ |
| Dim strLoadedCDDBService␊ |
| Dim strStartService␊ |
| ␊ |
| Set l_objPnpIdDict = CreateObject("Scripting.Dictionary")␊ |
| l_objPnpIdDict.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| ␊ |
| strRegistyFile=strTargetDrive & "\windows\system32\config\SYSTEM"␊ |
| Print("")␊ |
| Print ("Enable mode")␊ |
| Print("")␊ |
| g_objFSO.CopyFile strRegistyFile , strRegistyFile & g_objFSO.GetTempName & ".sav", True␊ |
| Print("load registy file " & strRegistyFile)␊ |
| g_objWshShell.Run "reg.exe UNLOAD HKLM\loaded_SYSTEM", &H20000000, True␊ |
| g_objWshShell.Run "reg.exe LOAD HKLM\loaded_SYSTEM " & strQuote & strRegistyFile & strQuote, &H20000000, True␊ |
| ␊ |
| lRC = g_objRegistry.GetDwordValue(HKEY_LOCAL_MACHINE, "loaded_SYSTEM\Select", "Current", strControlSet)␊ |
| strControlSet = "ControlSet" & Left("000",3-Len(strControlSet)) & strControlSet␊ |
| strLoadedEnumKey = "loaded_SYSTEM\" & strControlSet & "\Enum\"␊ |
| strLoadedClassKey = "loaded_SYSTEM\" & strControlSet & "\Control\Class\"␊ |
| strLoadedCDDBKey = "loaded_SYSTEM\" & strControlSet & "\Control\CriticalDeviceDatabase\"␊ |
| strLoadedServicesKey = "loaded_SYSTEM\" & strControlSet & "\Services\"␊ |
| ␊ |
| 'Print strLoadedEnumKey␊ |
| 'Print strLoadedClassKey␊ |
| 'Print strLoadedCDDBKey␊ |
| 'Print strLoadedServicesKey␊ |
| ␊ |
| 'Print g_objWshShell.Environment("Process").Item("COMSPEC") ␊ |
| 'objReg.SetStringValue HKEY_USERS,strKeyPath1,"Wallpaper","C:\WINDOWS\Web\Wallpaper\kiosk.bmp"␊ |
| ␉'objReg.SetStringValue HKEY_USERS,strKeyPath1,"OriginalWallpaper","C:\WINDOWS\Web\Wallpaper\kiosk.bmp"␊ |
| 'objReg.SetStringValue HKEY_USERS,strKeyPath2,"Background","26 98 4"␊ |
| ␊ |
| Print("")␊ |
| Print("========================================================")␊ |
| Print(" Enable existing Mass Storage drivers in system")␊ |
| Print("========================================================")␊ |
| ␊ |
| ␊ |
| Set colItems = g_objWMIService.ExecQuery("SELECT * FROM Win32_PnPEntity", "WQL", _␊ |
| wbemFlagReturnImmediately + wbemFlagForwardOnly)␊ |
| For Each objItem In colItems␊ |
| MassStorageHardwareIdsDict objItem, l_objPnpIdDict, False␊ |
| ␊ |
| If l_objPnpIdDict.Count > 0 Then ␊ |
| lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "DeviceDesc", strDeviceDesc)␊ |
| lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "Service", strService)␊ |
| lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strLoadedEnumKey & objItem.PNPDeviceID, "Service", strLoadedService)␊ |
| lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "Class", strClass)␊ |
| Print("")␊ |
| Print(objItem.PNPDeviceID)␊ |
| 'Print(strDeviceDesc & " ")␊ |
| 'Print(strEnumKey & " " & strService & " " & strClass)␊ |
| 'Print(strLoadedEnumKey & " " & strLoadedService)␊ |
| End If␊ |
| ␊ |
| blnFoundCDDB = False␊ |
| For Each Key In l_objPnpIdDict.Keys␊ |
| 'Print(Key & " " & strLoadedCDDBKey & Replace(Key,"\","#") )␊ |
| lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strLoadedCDDBKey & Replace(Key,"\","#"), "Service", strLoadedCDDBService)␊ |
| If not blnFoundCDDB And not IsNull(strLoadedCDDBService) Then␊ |
| 'Print("offline Registry CDDB: " & Key & " " & strLoadedCDDBService)␊ |
| lRC = g_objRegistry.GetDWordValue(HKEY_LOCAL_MACHINE, strLoadedServicesKey & strLoadedCDDBService, "Start", strStartService)␊ |
| If Not IsNull(strStartService) Then ␊ |
| Print("offline Registry CDDB: " & Key & " " & strLoadedCDDBService)␊ |
| If strStartService = 0 Then␊ |
| Print("Start already " & strStartService & " no change")␊ |
| blnFoundCDDB = True␊ |
| Else␊ |
| Print(strLoadedServicesKey & strLoadedCDDBService)␊ |
| Print("Start set " & strStartService & " change to 0")␊ |
| lRC = g_objRegistry.SetDWordValue(HKEY_LOCAL_MACHINE, strLoadedServicesKey & strLoadedCDDBService,"Start",&H0)␊ |
| if lRC <> 0 then Print("Error: setting failed. result: " & lRC )␊ |
| blnFoundCDDB = True␊ |
| End If␊ |
| End If␊ |
| End If␊ |
| ␊ |
| If not blnFoundCDDB Then␊ |
| ␊ |
| '''''''''blnFoundCDDB = True␊ |
| End If␊ |
| Next␊ |
| Next␊ |
| ␊ |
| Print("")␊ |
| Print("unload registy file " & strRegistyFile)␊ |
| g_objWshShell.Run "reg.exe UNLOAD HKLM\loaded_SYSTEM", &H20000000, True␊ |
| End Sub 'EnableDrivers()␊ |
| '********************************************************************␊ |
| ␊ |
| ␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Sub InstallDrivers()␊ |
| '*␊ |
| '* Purpose: Install mass storage drivers at offline windows␊ |
| '*␊ |
| '*␊ |
| '* Dependencies: g_objFSO FileSystem object␊ |
| '*␊ |
| '********************************************************************␊ |
| Sub InstallDrivers()␊ |
| Dim m␊ |
| Dim blnFoung_objDriverFolderDictFile␊ |
| Dim strService␊ |
| Dim strDismRun␊ |
| Dim l_objPnpIdDict␊ |
| Set l_objPnpIdDict = CreateObject("Scripting.Dictionary")␊ |
| l_objPnpIdDict.CompareMode = DICTIONARY_COMPAREMODE_TEXT␊ |
| ␊ |
| ␊ |
| Print("Sub: Install drivers: " & strPNPFolder)␊ |
| ␊ |
| Print("")␊ |
| Print("==========================================")␊ |
| Print(Now & " : parse inf files")␊ |
| Print("==========================================")␊ |
| ␊ |
| MakeInfFileList g_objFSO.GetFolder(strPNPFolder)␊ |
| GetHWID␊ |
| ␊ |
| Print("")␊ |
| Print("========================================================")␊ |
| Print(" Mass Storage Plug and Play Devices in system")␊ |
| Print("========================================================")␊ |
| ␊ |
| Set colItems = g_objWMIService.ExecQuery("SELECT * FROM Win32_PnPEntity", "WQL", _␊ |
| wbemFlagReturnImmediately + wbemFlagForwardOnly)␊ |
| For Each objItem In colItems␊ |
| 'strPNPDeviceID = objItem.PNPDeviceID␊ |
| 'lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "Driver", strDriver)␊ |
| 'lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strClassKey & strDriver, "ProviderName", strProviderName)␊ |
| 'lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "Class", strClass)␊ |
| ␊ |
| blnFoung_objDriverFolderDictFile = False␊ |
| MassStorageHardwareIdsDict objItem, l_objPnpIdDict, False␊ |
| ␊ |
| For Each Key In l_objPnpIdDict.Keys␊ |
| If dHwid.Exists(Key) Then␊ |
| Print (Key & Space(abs(45 - Len(Key))) & dHwid.Item(Key))␊ |
| Else␊ |
| Print(Key)␊ |
| End If␊ |
| If not blnFoung_objDriverFolderDictFile And dHwid.Exists(Key) Then␊ |
| 'lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "Driver", strDriver)␊ |
| lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "Service", strService)␊ |
| 'lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strClassKey & strDriver, "ProviderName", strProviderName)␊ |
| lRC = g_objRegistry.GetStringValue(HKEY_LOCAL_MACHINE, strEnumKey & objItem.PNPDeviceID, "Class", strClass)␊ |
| Print("current service: " & strService & " " & strClass)␊ |
| blnFoung_objDriverFolderDictFile = True␊ |
| g_objInfDismFileDict.Add Key, dHwid.Item(Key)␊ |
| End If␊ |
| Next␊ |
| Next␊ |
| ␊ |
| Print("")␊ |
| Print("==========================================")␊ |
| Print("Unique inf files relating Mass Storage IDs")␊ |
| Print("==========================================")␊ |
| ␊ |
| m = &H20000000␊ |
| If blnGuiMode Then m = 1␊ |
| ␊ |
| For Each Key in g_objInfDismFileDict.Keys␊ |
| Print(g_objInfDismFileDict.Item(Key) & " " & Key)␊ |
| 'dism continues if log file writing fails␊ |
| strDismRun = "dism.exe /Image:" & strTargetDrive _ ␊ |
| & "\ /Add-Driver /Driver:" & strQuote & g_objInfDismFileDict.Item(Key) & strQuote _ ␊ |
| & " /LogLevel:4 /LogPath:" _␊ |
| & g_objFSO.GetParentFolderName(WScript.ScriptFullName) & "\dism.offline.log"␊ |
| Print(strDismRun)␊ |
| g_objWshShell.Run strDismRun, m, True␊ |
| Print("")␊ |
| Next␊ |
| ␊ |
| If g_objFSO.FileExists(strTargetDrive & "\windows\inf\setupapi.offline.log") Then Print("compare setup log file " & strTargetDrive & "\windows\inf\setupapi.offline.log")␊ |
| End Sub␊ |
| '********************************************************************␊ |
| ␊ |
| ␊ |
| '======================================================================================␊ |
| 'based on ListHWID.vbs by RogueSpear http://forum.driverpacks.net/viewtopic.php?id=3148 ␊ |
| 'edited by cdob␊ |
| '␊ |
| '********************************************************************␊ |
| '*␊ |
| '* Sub MakeInfFileList()␊ |
| '*␊ |
| '* Purpose: Recurses the subfolders of the a folder␊ |
| '* to find folder containing *.inf files␊ |
| '*␊ |
| '* Input: objToplFolder Folder object to recurse␊ |
| '*␊ |
| '* Dependencies: g_objFSO FileSystem object␊ |
| '*␊ |
| '* Restrictions: list created by HardwareID␊ |
| '* last read files goes in, double driver conflicts not resolved␊ |
| '* todo: use ranking compare http://support.microsoft.com/kb/279112 ␊ |
| '*␊ |
| '********************************************************************␊ |
| Sub MakeInfFileList(objToplFolder)␊ |
| Dim Subfolder, a, aFiles, strFile␊ |
| For Each Subfolder in objToplFolder.SubFolders␊ |
| Set a = g_objFSO.GetFolder(Subfolder.Path)␊ |
| Set aFiles = a.Files␊ |
| For Each strFile In aFiles␊ |
| If LCase(Right(strFile,4)) = ".inf" Then␊ |
| inf_count = inf_count + 1␊ |
| g_objDriverFolderDict.Add inf_count, strFile␊ |
| End If␊ |
| Next ␊ |
| MakeInfFileList Subfolder␊ |
| Next␊ |
| End Sub␊ |
| ␊ |
| Sub GetHWID␊ |
| Dim regEx, Match, Matches, strFileName, strFile, objFile, line, strHardwareID, strCSV, z␊ |
| z = 0␊ |
| ␊ |
| Set regEx = New RegExp␊ |
| regEx.IgnoreCase = True␊ |
| 'regEx.Pattern = "[A-Z0-9]{2,}(?!PARAMS)\\[A-Z0-9_]{2,}_[A-F0-9]{2,}(&[A-Z_]{2,}_[A-F0-9]{2,}(&[A-Z]{2,}_[A-F0-9]{2,}(&[A-Z]{2,}_[A-F0-9]{2,})?)?)?"␊ |
| regEx.Pattern = ",\s*?[A-Z0-9]{2,}\\[A-Z0-9_]{2,}_[A-F0-9]{2,}(&[A-Z_]{2,}_[A-F0-9]{2,}(&[A-Z]{2,}_[A-F0-9]{2,}(&[A-Z]{2,}_[A-F0-9]{2,})?)?)?"␊ |
| ␊ |
| For each strFileName in g_objDriverFolderDict.Items␊ |
| 'Print("GetHWID: Set strFile " & strFileName)␊ |
| 'unicode .inf file␊ |
| Set strFile = g_objFSO.OpenTextFile(strFileName, 1, False, -2)␊ |
| ␊ |
| Do While strFile.AtEndOfStream = False␊ |
| line = strFile.ReadLine␊ |
| If Left(line, 1) <> ";" Then␊ |
| Set Matches = regEx.Execute(line)␊ |
| For Each Match In Matches␊ |
| 'On Error Resume Next␊ |
| strHardwareID = Trim(Right(Ucase(Match.Value),Len(Match.Value)-1))␊ |
| If dHwid.Exists(strHardwareID) Then␊ |
| z = z + 1␊ |
| dHwid.Item(strHardwareID) = strFileName␊ |
| Else␊ |
| dHwid.Add strHardwareID, strFileName␊ |
| End If␊ |
| Next␊ |
| End If␊ |
| Loop␊ |
| strFile.Close()␊ |
| Next␊ |
| ␊ |
| Print(Now & " : Found " & dHwid.Count & " HWIDs")␊ |
| Print(Now & " : Found " & z & " duplicate HWIDs")␊ |
| End Sub␊ |
| ␊ |
| ␊ |
| '======================================================================================␊ |
| 'Sort directory?␊ |
| 'http://support.microsoft.com/kb/246067/ |