# Copyright © 2016, Microsoft Corporation. All rights reserved. # :: ======================================================= :: <# DESCRIPTION: Utils_BlueScreen.ps1 is used as common scripts by Blue Screen Troubleshooter which contains functionalities related to Blue Screen #> #==================================================================================== # Initialize #==================================================================================== Import-LocalizedData -BindingVariable LocalizedStrings -FileName CL_LocalizationData #==================================================================================== # Main #==================================================================================== # List of Known BugChecks by type $knownBugChecks = @{} $knownBugChecks.Add("0x00000124","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557321(v=vs.85).aspx $knownBugChecks.Add("0x00000113","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557253(v=vs.85).aspx $knownBugChecks.Add("0x0000007E","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559239(v=vs.85).aspx $knownBugChecks.Add("0x0000003B","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff558949(v=vs.85).aspx $knownBugChecks.Add("0x0000004E","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559014(v=vs.85).aspx $knownBugChecks.Add("0x0000001E","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557408(v=vs.85).aspx $knownBugChecks.Add("0x000000E1","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff560322(v=vs.85).aspx $knownBugChecks.Add("0x00000139","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/jj569891(v=vs.85).aspx $knownBugChecks.Add("0x000000D1","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff560244(v=vs.85).aspx $knownBugChecks.Add("0x00000133","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/jj154556(v=vs.85).aspx $knownBugChecks.Add("0x00000109","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557228(v=vs.85).aspx $knownBugChecks.Add("0x00000019","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557389(v=vs.85).aspx $knownBugChecks.Add("0x000000C2","ProblemDriver") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff560185(v=vs.85).aspx $knownBugChecks.Add("0x00000050","Malware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559023(v=vs.85).aspx $knownBugChecks.Add("0x0000007A","Malware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559211(v=vs.85).aspx $knownBugChecks.Add("0x000000F7","Malware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff560389(v=vs.85).aspx $knownBugChecks.Add("0xC000021A","Malware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff560177(v=vs.85).aspx $knownBugChecks.Add("0x00000024","DiskFailure") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557433(v=vs.85).aspx #$knownBugChecks.Add("0x0000007A","DiskFailure") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559211(v=vs.85).aspx $knownBugChecks.Add("0x0000007F","MemoryFailure") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559211(v=vs.85).aspx #$knownBugChecks.Add("0x0000007A","MemoryFailure") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559211(v=vs.85).aspx #$knownBugChecks.Add("0x00000109","MemoryFailure") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557389(v=vs.85).aspx $knownBugChecks.Add("0x00000101","BadHardware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557211(v=vs.85).aspx #$knownBugChecks.Add("0x00000124","BadHardware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557321(v=vs.85).aspx #$knownBugChecks.Add("0x0000007F","BadHardware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559211(v=vs.85).aspx #$knownBugChecks.Add("0x00000050","BadHardware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559023(v=vs.85).aspx #$knownBugChecks.Add("0x0000001E","BadHardware") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557408(v=vs.85).aspx #$knownBugChecks.Add("0x00000050","ProblemService") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff559023(v=vs.85).aspx #$knownBugChecks.Add("0x0000001E","ProblemService") #https://msdn.microsoft.com/en-us/library/windows/hardware/ff557408(v=vs.85).aspx #*================================================================================= #Functions to interact with Drivers #*================================================================================= Function Get-DriverSource { <# .DESCRIPTION Function get driver resources of the specific device on 64 bit OS .PARAMETER None .OUTPUTS Returns data type of get driver resources #> $ChangeDriverSource = @" using System; using System.Runtime.InteropServices; namespace Microsoft.Windows.Diagnosis { public static class ChangeDriver { public enum DIOD { None = (0), CANCEL_REMOVE = (0x00000004), // If this flag is specified and the device had been marked for pending removal, the OS cancels the pending removal. INHERIT_CLASSDRVS = (0x00000002) //the resulting device information element inherits the class driver list, if any } public enum DICD { None = (0), GENERATE_ID = (0x00000001), // create unique device instance key INHERIT_CLASSDRVS = (0x00000002) // inherit class driver list } public enum SPDIT { None = (0), SPDIT_COMPATDRIVER = (0x00000002), // Build a list of compatible drivers SPDIT_CLASSDRIVER = (0x00000001) // Build a list of class drivers } public enum DI_FLAGS { DI_FLAGSEX_INSTALLEDDRIVER = (0x04000000), DI_FLAGSEX_ALLOWEXCLUDEDDRVS = (0x00000800) } [StructLayout(LayoutKind.Sequential)] public class SP_DEVINFO_DATA { /// /// Size of the structure, in bytes. /// public Int32 cbSize = Marshal.SizeOf(typeof(SP_DEVINFO_DATA)); /// /// GUID of the device interface class. /// public Guid ClassGuid; /// /// Handle to this device instance. /// public Int32 DevInst; /// /// Reserved; do not use. /// public IntPtr Reserved; } // 64 bit: Pack=4 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack=4)] public class SP_DRVINFO_DATA { public Int32 cbSize; public Int32 DriverType; public IntPtr Reserved; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public String Description; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public String MfgName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public String ProviderName; public System.Runtime.InteropServices.ComTypes.FILETIME DriverDate; public Int64 DriverVersion; } // 64 bit: Pack=8 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)] public class SP_DRVINFO_DETAIL_DATA { public Int32 cbSize; public System.Runtime.InteropServices.ComTypes.FILETIME InfDate; public Int32 CompatIDsOffset; public Int32 CompatIDsLength; public IntPtr Reserved; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string SectionName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string InfFileName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string DrvDescription; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)] public string HardwareID; } // 64 bit: Pack=8 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)] public class SP_DEVINSTALL_PARAMS { public Int32 cbSize; public Int32 Flags; public DI_FLAGS FlagsEx; public IntPtr hwndParent; public IntPtr InstallMsgHandler; public IntPtr InstallMsgHandlerContext; public IntPtr FileQueue; public UIntPtr ClassInstallReserved; public Int32 Reserved; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string DriverPath; } [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiOpenDeviceInfo( IntPtr DeviceInfoSet, string device, IntPtr handleToWindow, DIOD flag, SP_DEVINFO_DATA deviceInfoData ); [DllImport("Setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] public extern static IntPtr SetupDiCreateDeviceInfoList ( IntPtr ClassGuid, IntPtr hwndParent ); [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiBuildDriverInfoList( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SPDIT DriverType ); [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiEnumDriverInfo( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SPDIT DriverType, int MemberIndex, [In, Out] SP_DRVINFO_DATA DriverInfoData ); [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiGetDriverInfoDetail( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SP_DRVINFO_DATA DriverInfoData, [In, Out] SP_DRVINFO_DETAIL_DATA DriverInfoDetailData, int DriverInfoDetailDataSize, out int RequiredSize ); [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiSetDeviceInstallParams( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SP_DEVINSTALL_PARAMS DeviceInstallParams ); [DllImport("Newdev.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool DiInstallDevice( IntPtr hwndParent, IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SP_DRVINFO_DATA DriverInfoData, int Flags, out bool rebootRequired ); [DllImport("Newdev.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool DiRollbackDriver( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, IntPtr hwndParent, int Flags, out bool rebootRequired ); public static int RollBackDriver(string deviceId) { int error = 0; IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero); SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA(); bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData); if (bRet == false) { return Marshal.GetLastWin32Error(); } bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER); if (bRet == false) { return Marshal.GetLastWin32Error(); } bool bReboot = false; bRet = DiRollbackDriver(hDevSet, deviceInfoData, IntPtr.Zero, 0, out bReboot); if (bRet == false) { error = Marshal.GetLastWin32Error(); return error; } else { return 0; } } public static int ForceInstallDriver(string deviceId, string infPath) { int error = 0; IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero); SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA(); bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData); if (bRet == false) { return Marshal.GetLastWin32Error(); } bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER); if (bRet == false) { return Marshal.GetLastWin32Error(); } int driverItr = 0; bool bResult = true; while (bResult) { SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA(); driverInfoData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DATA)); bRet = SetupDiEnumDriverInfo(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER, driverItr, driverInfoData); if (bRet == false) { return Marshal.GetLastWin32Error(); } int requiredSize = 0; SP_DRVINFO_DETAIL_DATA driverInfoDetailData = new SP_DRVINFO_DETAIL_DATA(); driverInfoDetailData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA)); int dataSize = Marshal.SizeOf(driverInfoDetailData); bRet = SetupDiGetDriverInfoDetail(hDevSet, deviceInfoData, driverInfoData, driverInfoDetailData, dataSize, out requiredSize); if (bRet == false) { error = Marshal.GetLastWin32Error(); //122 - ERROR_INSUFFICIENT_BUFFER, expected error if (error != 122) { Marshal.GetLastWin32Error(); } } if (driverInfoDetailData.InfFileName != null && driverInfoDetailData.InfFileName.Contains(infPath)) { bool bReboot = false; bRet = DiInstallDevice(IntPtr.Zero, hDevSet, deviceInfoData, driverInfoData, 0, out bReboot); if (bRet == false) { error = Marshal.GetLastWin32Error(); driverItr++; continue; } else { return 0; } } driverItr++; } return -1; } public static string GetCurrentDriverINF(string deviceId) { string infPath = "ErrorFindingINF"; int error = 0; IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero); SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA(); bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData); if (bRet == false) { error = Marshal.GetLastWin32Error(); return infPath; } // Get Currently Installed Driver SP_DEVINSTALL_PARAMS deviceInstallParams = new SP_DEVINSTALL_PARAMS(); deviceInstallParams.cbSize = Marshal.SizeOf(typeof(SP_DEVINSTALL_PARAMS)); deviceInstallParams.FlagsEx = DI_FLAGS.DI_FLAGSEX_ALLOWEXCLUDEDDRVS | DI_FLAGS.DI_FLAGSEX_INSTALLEDDRIVER; bRet = SetupDiSetDeviceInstallParams(hDevSet, deviceInfoData, deviceInstallParams); if (bRet == false) { error = Marshal.GetLastWin32Error(); return infPath; } bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER); if (bRet == false) { error = Marshal.GetLastWin32Error(); return infPath; } int driverItr = 0; SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA(); driverInfoData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DATA)); bRet = SetupDiEnumDriverInfo(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER, driverItr, driverInfoData); if (bRet == false) { error = Marshal.GetLastWin32Error(); return infPath; } int requiredSize = 0; SP_DRVINFO_DETAIL_DATA driverInfoDetailData = new SP_DRVINFO_DETAIL_DATA(); driverInfoDetailData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA)); int dataSize = Marshal.SizeOf(driverInfoDetailData); // First get the required size bRet = SetupDiGetDriverInfoDetail(hDevSet, deviceInfoData, driverInfoData, driverInfoDetailData, dataSize, out requiredSize); if (bRet == false) { error = Marshal.GetLastWin32Error(); //122 - ERROR_INSUFFICIENT_BUFFER, expected error if (error != 122) { return infPath; } } if (driverInfoDetailData.InfFileName != null) { infPath = driverInfoDetailData.InfFileName; } return infPath; } } } "@ Add-Type -TypeDefinition $ChangeDriverSource $driverSource = [Microsoft.Windows.Diagnosis.ChangeDriver] return $driverSource } Function Get-DriverSource32 { <# .DESCRIPTION Function get driver resources of the specific device on 32 bit OS .PARAMETER None .OUTPUTS Returns data type of get driver resources #> $ChangeDriverSource32 = @" using System; using System.Runtime.InteropServices; namespace Microsoft.Windows.Diagnosis { public static class ChangeDriver32 { public enum DIOD { None = (0), CANCEL_REMOVE = (0x00000004), // If this flag is specified and the device had been marked for pending removal, the OS cancels the pending removal. INHERIT_CLASSDRVS = (0x00000002) //the resulting device information element inherits the class driver list, if any } public enum DICD { None = (0), GENERATE_ID = (0x00000001), // create unique device instance key INHERIT_CLASSDRVS = (0x00000002) // inherit class driver list } public enum SPDIT { None = (0), SPDIT_COMPATDRIVER = (0x00000002), // Build a list of compatible drivers SPDIT_CLASSDRIVER = (0x00000001) // Build a list of class drivers } public enum DI_FLAGS { DI_FLAGSEX_INSTALLEDDRIVER = (0x04000000), DI_FLAGSEX_ALLOWEXCLUDEDDRVS = (0x00000800) } [StructLayout(LayoutKind.Sequential)] public class SP_DEVINFO_DATA { /// /// Size of the structure, in bytes. /// public Int32 cbSize = Marshal.SizeOf(typeof(SP_DEVINFO_DATA)); /// /// GUID of the device interface class. /// public Guid ClassGuid; /// /// Handle to this device instance. /// public Int32 DevInst; /// /// Reserved; do not use. /// public IntPtr Reserved; } // 64 bit: Pack=4 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack=1)] public class SP_DRVINFO_DATA { public Int32 cbSize; public Int32 DriverType; public IntPtr Reserved; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public String Description; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public String MfgName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public String ProviderName; public System.Runtime.InteropServices.ComTypes.FILETIME DriverDate; public Int64 DriverVersion; } // 64 bit: Pack=8 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] public class SP_DRVINFO_DETAIL_DATA { public Int32 cbSize; public System.Runtime.InteropServices.ComTypes.FILETIME InfDate; public Int32 CompatIDsOffset; public Int32 CompatIDsLength; public IntPtr Reserved; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string SectionName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string InfFileName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string DrvDescription; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)] public string HardwareID; } // 64 bit: Pack=8 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)] public class SP_DEVINSTALL_PARAMS { public Int32 cbSize; public Int32 Flags; public DI_FLAGS FlagsEx; public IntPtr hwndParent; public IntPtr InstallMsgHandler; public IntPtr InstallMsgHandlerContext; public IntPtr FileQueue; public UIntPtr ClassInstallReserved; public Int32 Reserved; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string DriverPath; } [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiOpenDeviceInfo( IntPtr DeviceInfoSet, string device, IntPtr handleToWindow, DIOD flag, SP_DEVINFO_DATA deviceInfoData ); [DllImport("Setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] public extern static IntPtr SetupDiCreateDeviceInfoList ( IntPtr ClassGuid, IntPtr hwndParent ); [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiBuildDriverInfoList( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SPDIT DriverType ); [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiEnumDriverInfo( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SPDIT DriverType, int MemberIndex, [In, Out] SP_DRVINFO_DATA DriverInfoData ); [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiGetDriverInfoDetail( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SP_DRVINFO_DATA DriverInfoData, [In, Out] SP_DRVINFO_DETAIL_DATA DriverInfoDetailData, int DriverInfoDetailDataSize, out int RequiredSize ); [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool SetupDiSetDeviceInstallParams( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SP_DEVINSTALL_PARAMS DeviceInstallParams ); [DllImport("Newdev.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool DiInstallDevice( IntPtr hwndParent, IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SP_DRVINFO_DATA DriverInfoData, int Flags, out bool rebootRequired ); [DllImport("Newdev.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool DiRollbackDriver( IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, IntPtr hwndParent, int Flags, out bool rebootRequired ); public static int RollBackDriver(string deviceId) { int error = 0; IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero); SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA(); bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData); if (bRet == false) { return Marshal.GetLastWin32Error(); } bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER); if (bRet == false) { return Marshal.GetLastWin32Error(); } bool bReboot = false; bRet = DiRollbackDriver(hDevSet, deviceInfoData, IntPtr.Zero, 0, out bReboot); if (bRet == false) { error = Marshal.GetLastWin32Error(); return error; } else { return 0; } } public static int ForceInstallDriver(string deviceId, string infPath) { int error = 0; IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero); SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA(); bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData); if (bRet == false) { return Marshal.GetLastWin32Error(); } bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER); if (bRet == false) { return Marshal.GetLastWin32Error(); } int driverItr = 0; bool bResult = true; while (bResult) { SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA(); driverInfoData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DATA)); bRet = SetupDiEnumDriverInfo(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER, driverItr, driverInfoData); if (bRet == false) { return Marshal.GetLastWin32Error(); } int requiredSize = 0; SP_DRVINFO_DETAIL_DATA driverInfoDetailData = new SP_DRVINFO_DETAIL_DATA(); driverInfoDetailData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA)); int dataSize = Marshal.SizeOf(driverInfoDetailData); bRet = SetupDiGetDriverInfoDetail(hDevSet, deviceInfoData, driverInfoData, driverInfoDetailData, dataSize, out requiredSize); if (bRet == false) { error = Marshal.GetLastWin32Error(); //122 - ERROR_INSUFFICIENT_BUFFER, expected error if (error != 122) { Marshal.GetLastWin32Error(); } } if (driverInfoDetailData.InfFileName != null && driverInfoDetailData.InfFileName.Contains(infPath)) { bool bReboot = false; bRet = DiInstallDevice(IntPtr.Zero, hDevSet, deviceInfoData, driverInfoData, 0, out bReboot); if (bRet == false) { error = Marshal.GetLastWin32Error(); driverItr++; continue; } else { return 0; } } driverItr++; } return -1; } public static string GetCurrentDriverINF(string deviceId) { string infPath = "ErrorFindingINF"; int error = 0; IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero); SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA(); bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData); if (bRet == false) { error = Marshal.GetLastWin32Error(); return infPath; } // Get Currently Installed Driver SP_DEVINSTALL_PARAMS deviceInstallParams = new SP_DEVINSTALL_PARAMS(); deviceInstallParams.cbSize = Marshal.SizeOf(typeof(SP_DEVINSTALL_PARAMS)); deviceInstallParams.FlagsEx = DI_FLAGS.DI_FLAGSEX_ALLOWEXCLUDEDDRVS | DI_FLAGS.DI_FLAGSEX_INSTALLEDDRIVER; bRet = SetupDiSetDeviceInstallParams(hDevSet, deviceInfoData, deviceInstallParams); if (bRet == false) { error = Marshal.GetLastWin32Error(); return infPath; } bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER); if (bRet == false) { error = Marshal.GetLastWin32Error(); return infPath; } int driverItr = 0; SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA(); driverInfoData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DATA)); bRet = SetupDiEnumDriverInfo(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER, driverItr, driverInfoData); if (bRet == false) { error = Marshal.GetLastWin32Error(); return infPath; } int requiredSize = 0; SP_DRVINFO_DETAIL_DATA driverInfoDetailData = new SP_DRVINFO_DETAIL_DATA(); driverInfoDetailData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA)); int dataSize = Marshal.SizeOf(driverInfoDetailData); // First get the required size bRet = SetupDiGetDriverInfoDetail(hDevSet, deviceInfoData, driverInfoData, driverInfoDetailData, dataSize, out requiredSize); if (bRet == false) { error = Marshal.GetLastWin32Error(); //122 - ERROR_INSUFFICIENT_BUFFER, expected error if (error != 122) { return infPath; } } if (driverInfoDetailData.InfFileName != null) { infPath = driverInfoDetailData.InfFileName; } return infPath; } } } "@ Add-Type -TypeDefinition $ChangeDriverSource32 $driverSource = [Microsoft.Windows.Diagnosis.ChangeDriver32] return $driverSource } #*================================================================================= #Get BugCheck Type #*================================================================================= function Get-BugCheckType() { <# .DESCRIPTION: Checks STOP/BugCheck Codes in knownIssues List and returns Type .INPUTS: String errorcode .OUTPUTS: String type #> param([String]$errorcode) $type = "Unknown" if($knownBugChecks.ContainsKey($errorcode)){ $type = $knownBugChecks[$errorcode] } $type } #*================================================================================= #Arm Compression code #*================================================================================= Function GetARMCompression() { $str = @' using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Diagnostics; using System.IO.Compression; namespace Compressions { public class OutputDataPackage { string fileName; ZipArchive z; FileStream fileStream; ZipArchiveEntry zae; public string FileName { get { return fileName; } } public OutputDataPackage() { string dt = String.Format("{0:yyyy-MM-dd_hh-mm-ss}", DateTime.Now); string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); fileName = filePath +@"\RoamingLog"+dt+".zip"; fileStream = new FileStream(fileName, FileMode.Create); z = new ZipArchive(fileStream, ZipArchiveMode.Create); } public OutputDataPackage(string outputPackagePath) { DateTime dt = DateTime.Now; this.fileName = outputPackagePath; fileStream = new FileStream(this.fileName, FileMode.Create); z = new ZipArchive(fileStream, ZipArchiveMode.Create); } public OutputDataPackage(string outputPackagePath,bool overwrite) { if(overwrite) { DateTime dt = DateTime.Now; this.fileName = outputPackagePath; fileStream = new FileStream(this.fileName, FileMode.Create); z = new ZipArchive(fileStream, ZipArchiveMode.Create); } else { DateTime dt = DateTime.Now; this.fileName = outputPackagePath; fileStream = new FileStream(this.fileName, FileMode.OpenOrCreate); z = new ZipArchive(fileStream, ZipArchiveMode.Update); } } // Add a file to the package using the specified path on disk and path in package // Example call: "outputPackage.AddFile("temp.txt", new Uri("/temp.txt", UriKind.RelativeOrAbsolute));" // public void AddFile(String pathOnDisk, String pathInZip) { zae = z.CreateEntry(pathInZip, CompressionLevel.Fastest); FileStream fs = new FileStream(pathOnDisk, FileMode.Open, FileAccess.Read); using (Stream s = zae.Open()) { fs.CopyTo(s); } fs.Close(); } // Saves the package out public void Close() { z.Dispose(); } } } '@ add-type $str -ReferencedAssemblies "System.IO.Compression" } #*================================================================================= #ARM-Zip #Params $srcdir,$destDir - Works on all Win 8 including ARM #*================================================================================= Function ARM-Zip() { param([string]$srcdir,$destDir) GetARMCompression $obj = new-object Compressions.OutputDataPackage($destDir) get-childitem $srcdir -force -recurse -ea SilentlyContinue|?{!([system.io.directory]::Exists($_.FullName))}|%{ $relativepath = [system.io.path]::GetFullPath($_.FullName).SubString([system.io.path]::GetFullPath($srcdir).Length + 1); $obj.AddFile($_.FullName.ToString(),$relativepath.ToString() -as [system.uri]) 2>$null } $obj.Close() } #*================================================================================= #Get-SizeFormat #*================================================================================= function Get-SizeFormat () { param($length) if($length -gt 1gb) { $use=1gb;$ext="GB" } elseif($length -gt 1mb) { $use=1mb;$ext="MB" } else { $use=1kb;$ext="KB" } $size = [math]::Round($length/$use,2) $size=$size.ToString()+"$ext" return $size } #*================================================================================= #CreateObjHelper #*================================================================================= function CreateObjHelper() { param($file) $fileobj = new-Object psobject $f = new-object System.IO.fileinfo($file) $filename = $f.Name $sizeinbytes = $f.Length $size = Get-SizeFormat $sizeinbytes Add-Member -InputObject $fileobj -MemberType noteproperty -Name Path -Value $file Add-Member -InputObject $fileobj -MemberType noteproperty -Name Name -Value $filename Add-Member -InputObject $fileobj -MemberType noteproperty -Name Size -Value $size return $fileobj } #*================================================================================= # CreateObj #*================================================================================= function CreateObj() { param($files) $fileobjs = @() #write-diagprogress -activity $Strings_CL_fileCollection.ID_CollectFileProgressActivity foreach ($file in $files) { if($file) { ### $paths = gci $file -recurse -force -ea SilentlyContinue ### | % { $_.fullname } if ( -not ( test-path $file ) ) { continue } & { $paths = gci $file -recurse -force -ea SilentlyContinue } ### CATCH NullReference and IndexOutOfRange, etc trap [Exception] { continue } if([System.IO.file]::exists($file) -and $paths -eq $null) { $fileobjs += (CreateObjHelper $file) } foreach($path in $paths) { $path.fullname if($path) { write-diagprogress -activity $Strings_CL_fileCollection.ID_CollectFileProgressActivity -status $path $fileobjs += (CreateObjHelper $path) } } } } return $fileobjs } #*================================================================================= # CopyTOMSDT # Work around for clicking the Zip file error on the result page #parameters $filepath,$title #*================================================================================= Function CopyToCABAndReport() { param([string]$filepath,[string]$title = "Collected File",[string]$context = "TS_Main") $fileobjs = (CreateObj (Get-ChildItem $filepath -ea silentlycontinue|%{$_.fullname} )) Update-DiagReport -file ($fileobjs.path) -id $context -name $title -description ($fileobjs.size) -Verbosity Informational } #*================================================================================= # ispostbackOnWin #*================================================================================= function ispostbackOnWin($packName) { <# DESCRIPTION ispostbackOnWin check whether package is postback. ARGUMENTS: packName : String value containing ID of pack RETURNS: $result : Boolean value $true if package running in postback or $false #> [string] $path1 = (Get-Location -PSProvider FileSystem).ProviderPath [string] $path1 = join-path $path1 "\$packName" if(test-path $path1){ return $true } "once" > $path1 return $false }