diff --git a/README b/README
new file mode 100644
index 0000000..d7f9eda
--- /dev/null
+++ b/README
@@ -0,0 +1,74 @@
+'*************************************************************************
+'*
+'* 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.
+'
+' ==================================================
+'
+' 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.
+'*
+'********************************************************************
+'
+' ============================================
\ No newline at end of file
diff --git a/fix_7hdc.vbs b/fix_7hdc.vbs
new file mode 100644
index 0000000..aa4bf5f
--- /dev/null
+++ b/fix_7hdc.vbs
@@ -0,0 +1,1046 @@
+'*************************************************************************
+'*
+'* 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.
+'
+' ==================================================
+'
+' 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.
+'*
+'********************************************************************
+'
+' ============================================
+
+
+'********************************************************************
+' * 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: target Win7 drive"
+ WScript.Echo ""
+ WScript.Echo " /install: 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: 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: (Optional) Location of the output file"
+' WScript.Echo ""
+' WScript.Echo " /class: (Optional) Filter the output by device Clase"
+' WScript.Echo ""
+' WScript.Echo " /provider: (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/
\ No newline at end of file