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