#CL_Utility
function GetProblematicFunctionForObject([string]$DDOContainerID)
{
$GetProblematicFunctionSource = @"
using System;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;
namespace Microsoft.Windows.Diagnosis
{
 [StructLayout(LayoutKind.Sequential)]
 public struct PropVariant
 {
 #region struct fields
 // The layout of these elements needs to be maintained.
 //
 // NOTE: We could use LayoutKind.Explicit, but we want
 // to maintain that the IntPtr may be 8 bytes on
 // 64-bit architectures, so we'll let the CLR keep
 // us aligned.
 //
 // NOTE: In order to allow x64 compat, we need to allow for
 // expansion of the IntPtr. However, the BLOB struct
 // uses a 4-byte int, followed by an IntPtr, so
 // although the p field catches most pointer values,
 // we need an additional 4-bytes to get the BLOB
 // pointer. The p2 field provides this, as well as
 // the last 4-bytes of an 8-byte value on 32-bit
 // architectures.
 // This is actually a VarEnum value, but the VarEnum type
 // shifts the layout of the struct by 4 bytes instead of the
 // expected 2.
 ushort vt;
 ushort wReserved1;
 ushort wReserved2;
 ushort wReserved3;
 IntPtr p;
 int p2;
 #endregion // struct fields
 #region union members
 sbyte cVal // CHAR cVal;
 {
 get { return (sbyte)GetDataBytes()[0]; }
 }
 byte bVal // UCHAR bVal;
 {
 get { return GetDataBytes()[0]; }
 }
 short iVal // SHORT iVal;
 {
 get { return BitConverter.ToInt16(GetDataBytes(), 0); }
 }
 ushort uiVal // USHORT uiVal;
 {
 get { return BitConverter.ToUInt16(GetDataBytes(), 0); }
 }
 int lVal // LONG lVal;
 {
 get { return BitConverter.ToInt32(GetDataBytes(), 0); }
 }
 uint ulVal // ULONG ulVal;
 {
 get { return BitConverter.ToUInt32(GetDataBytes(), 0); }
 }
 long hVal // LARGE_INTEGER hVal;
 {
 get { return BitConverter.ToInt64(GetDataBytes(), 0); }
 }
 ulong uhVal // ULARGE_INTEGER uhVal;
 {
 get { return BitConverter.ToUInt64(GetDataBytes(), 0); }
 }
 float fltVal // FLOAT fltVal;
 {
 get { return BitConverter.ToSingle(GetDataBytes(), 0); }
 }
 double dblVal // DOUBLE dblVal;
 {
 get { return BitConverter.ToDouble(GetDataBytes(), 0); }
 }
 bool boolVal // VARIANT_BOOL boolVal;
 {
 get { return (iVal == 0 ? false : true); }
 }
 int scode // SCODE scode;
 {
 get { return lVal; }
 }
 decimal cyVal // CY cyVal;
 {
 get { return decimal.FromOACurrency(hVal); }
 }
 DateTime date // DATE date;
 {
 get { return DateTime.FromOADate(dblVal); }
 }
 #endregion // union members
 /// <summary>
 /// Gets a byte array containing the data bits of the struct.
 /// </summary>
 /// <returns>A byte array that is the combined size of the data
bits.</returns>
 private byte[] GetDataBytes()
 {
 byte[] ret = new byte[IntPtr.Size + sizeof(int)];
 if (IntPtr.Size == 4)
 BitConverter.GetBytes(p.ToInt32()).CopyTo(ret, 0);
 else if (IntPtr.Size == 8)
 BitConverter.GetBytes(p.ToInt64()).CopyTo(ret, 0);
 BitConverter.GetBytes(p2).CopyTo(ret, IntPtr.Size);
 return ret;
 }
 /// <summary>
 /// Called to properly clean up the memory referenced by a PropVariant
instance.
 /// </summary>
 [DllImport("ole32.dll")]
 private extern static int PropVariantClear(ref PropVariant pvar);
 /// <summary>
 /// Called to clear the PropVariant's referenced and local memory.
 /// </summary>
 /// <remarks>
 /// You must call Clear to avoid memory leaks.
 /// </remarks>
 public void Clear()
 {
 // Can't pass "this" by ref, so make a copy to call PropVariantClear
with
 PropVariant var = this;
 PropVariantClear(ref var);
 // Since we couldn't pass "this" by ref, we need to clear the member
fields manually
 // NOTE: PropVariantClear already freed heap data for us, so we are
just setting
 // our references to null.
 vt = (ushort)VarEnum.VT_EMPTY;
 wReserved1 = wReserved2 = wReserved3 = 0;
 p = IntPtr.Zero;
 p2 = 0;
 }
 /// <summary>
 /// Gets the variant type.
 /// </summary>
 public VarEnum Type
 {
 get { return (VarEnum)vt; }
 }
 /// <summary>
 /// Gets the variant value.
 /// </summary>
 public object Value
 {
 get
 {
 // TODO: Add support for reference types (ie. VT_REF | VT_I1)
 // TODO: Add support for safe arrays
 switch ((VarEnum)vt)
 {
 case VarEnum.VT_I1:
 return cVal;
 case VarEnum.VT_UI1:
 return bVal;
 case VarEnum.VT_I2:
 return iVal;
 case VarEnum.VT_UI2:
 return uiVal;
 case VarEnum.VT_I4:
 case VarEnum.VT_INT:
 return lVal;
 case VarEnum.VT_UI4:
 case VarEnum.VT_UINT:
 return ulVal;
 case VarEnum.VT_I8:
 return hVal;
 case VarEnum.VT_UI8:
 return uhVal;
 case VarEnum.VT_R4:
 return fltVal;
 case VarEnum.VT_R8:
 return dblVal;
 case VarEnum.VT_BOOL:
 return boolVal;
 case VarEnum.VT_ERROR:
 return scode;
 case VarEnum.VT_CY:
 return cyVal;
 case VarEnum.VT_DATE:
 return date;
 case VarEnum.VT_FILETIME:
 return DateTime.FromFileTime(hVal);
 case VarEnum.VT_BSTR:
 return Marshal.PtrToStringBSTR(p);
 case VarEnum.VT_BLOB:
 byte[] blobData = new byte[lVal];
 IntPtr pBlobData;
 if (IntPtr.Size == 4)
 {
 pBlobData = new IntPtr(p2);
 }
 else if (IntPtr.Size == 8)
 {
 // In this case, we need to derive a pointer at offset
12,
 // because the size of the blob is represented as a 4-
byte int
 // but the pointer is immediately after that.
 pBlobData = new
IntPtr(BitConverter.ToInt64(GetDataBytes(), sizeof(int)));
 }
 else
 throw new NotSupportedException();
 Marshal.Copy(pBlobData, blobData, 0, lVal);
 return blobData;
 case VarEnum.VT_LPSTR:
 return Marshal.PtrToStringAnsi(p);
 case VarEnum.VT_LPWSTR:
 return Marshal.PtrToStringUni(p);
 case VarEnum.VT_UNKNOWN:
 return Marshal.GetObjectForIUnknown(p);
 case VarEnum.VT_DISPATCH:
 return p;
 case VarEnum.VT_CLSID:
 return Marshal.PtrToStructure(p, typeof(Guid));
 case VarEnum.VT_EMPTY:
 return null;
 default:
 throw new NotSupportedException("The type of this variable
is not support ('" + vt.ToString() + "')");
 }
 }
 }
 }
 public class DDOManager
 {
 //
 //Define const and static varialbe
 //
 #region
 public const UInt32 S_OK = 0;
 public const UInt32 CLSCTX_ALL = 23;
 public const UInt32 STGM_READ = 0;
 public static Guid CLSID_FunctionDiscovery = new Guid("C72BE2EC-8E90-452cB29A-AB8FF1C071FC");
 public static Guid IID_IFunctionDiscovery = new Guid("4DF99B70-E148-4432-
B004-4C9EEB535A5E");
 public static Guid IID_IFunctionInstanceCollection = new Guid("F0A3D895-
855C-42A2-948D-2F97D450ECB1");
 public static Guid SID_EnumDeviceFunction = new Guid("13E0E9E2-C3FA-4E3C906E-64502FA4DC95");
 public static Guid SID_EnumInterface = new Guid("40eab0b9-4d7f-4b53-a334-
1581dd9041f4");
 public static PROPERTYKEY PKEY_NAME = new PROPERTYKEY(new Guid("B725F130-
47EF-101A-A5F1-02608C9EEBAC"), 10);
 public static PROPERTYKEY PKEY_DeviceInterface_PrinterName = new
PROPERTYKEY(new Guid("0A7B84EF-0C27-463F-84EF-06C5070001BE"), 10);
 public static PROPERTYKEY PKEY_DeviceInterface_ClassGuid = new
PROPERTYKEY(new Guid("026E516E-B814-414B-83CD-856D6FEF4822"), 4);
 public static PROPERTYKEY PKEY_DeviceInterface_DevicePath = new
PROPERTYKEY(new Guid("53808008-07BB-4661-BC3C-B5953E708560"), 1);
 public static PROPERTYKEY PKEY_Device_InstanceId = new PROPERTYKEY(new
Guid("78C34FC8-104A-4ACA-9EA4-524D52996E57"), 256);
 public static PROPERTYKEY PKEY_Device_ConfigFlags = new PROPERTYKEY(new
Guid("A45C254E-DF1C-4EFD-8020-67D146A850E0"), 12);
 public static PROPERTYKEY PKEY_Device_ProblemCode = new PROPERTYKEY(new
Guid("4340A6C5-93FA-4706-972C-7B648008A5A7"), 3);
 public static PROPERTYKEY PKEY_Device_ContainerId = new PROPERTYKEY(new
Guid("8c7ed206-3f8a-4827-b3ab-ae9e1faefc6c"), 2);
 public static PROPERTYKEY PKEY_Device_DriverInfPath = new PROPERTYKEY(new
Guid("a8b865dd-2e3d-4094-ad97-e593a70c75d6"), 5);
 public static PROPERTYKEY PKEY_Device_Capabilities = new PROPERTYKEY(new
Guid("A45C254E-DF1C-4EFD-8020-67D146A850E0"), 17);
 public static readonly Guid Guid_DeviceType_Printer = new Guid("0ECEF634-
6EF0-472A-8085-5AD023ECBCCD");
 public static readonly Guid ContainerId_Computer = new Guid("{00000000-
0000-0000-ffff-ffffffffffff}");
 public const string FCTN_CATEGORY_DEVQUERYOBJECTS = "Provider\\
Microsoft.Base.DevQueryObjects";
 public const UInt32 RAW_DEVICE_OK_FLAG = 0x40;
 #endregion
 //
 //Define useful enum and struct
 //
 #region
 public enum HardDeviceType
 {
 PNPDevice = 0,
 Printer,
 USB
 };
 public enum SystemVisibilityFlags
 {
 SVF_SYSTEM = 0,
 SVF_USER
 };
 public struct DeviceInfo
 {
 private string deviceName;
 private HardDeviceType type;
 private string deviceID;
 public string DeviceName
 {
 get
 {
 return deviceName;
 }
 set
 {
 deviceName = value;
 }
 }
 public HardDeviceType Type
 {
 get
 {
 return type;
 }
 set
 {
 type = value;
 }
 }
 public string DeviceID
 {
 get
 {
 return deviceID;
 }
 set
 {
 deviceID = value;
 }
 }
 };
 public struct PROPERTYKEY
 {
 public PROPERTYKEY(Guid InputId, UInt32 InputPid)
 {
 fmtid = InputId;
 pid = InputPid;
 }
 Guid fmtid;
 UInt32 pid;
 };
 #endregion
 //
 //P/Invoke Win32 APIs
 //
 #region
 [DllImport("ole32.dll", EntryPoint = "CoCreateInstance", SetLastError =
true)]
 public static extern UInt32 CoCreateInstance(ref Guid guid,
[MarshalAs(UnmanagedType.IUnknown)] object inner, uint context, ref Guid id, ref
IntPtr pointer);
 #endregion
 //
 //P/Invoke COM Interfaces
 //
 #region
 [Guid("4DF99B70-E148-4432-B004-4C9EEB535A5E"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 public interface IFunctionDiscovery
 {
 UInt32 GetInstanceCollection([MarshalAs(UnmanagedType.LPWStr)] string
pszCategory,
 IntPtr pszSubCategory,
 [MarshalAs(UnmanagedType.Bool)]bool fIncludeAllSubCategories,
 ref IntPtr ppIFunctionInstanceCollection);
 UInt32 GetInstance([MarshalAs(UnmanagedType.LPWStr)] ref string
pszFunctionInstanceIdentity,
 ref IntPtr ppIFunctionInstance);
 UInt32 CreateInstanceCollectionQuery([MarshalAs(UnmanagedType.LPWStr)]
string pszCategory,
 [MarshalAs(UnmanagedType.LPWStr)] string pszSubCategory,
 [MarshalAs(UnmanagedType.Bool)] bool fIncludeAllSubCategories,
 IntPtr pIFunctionDiscoveryNotification,
 IntPtr pfdqcQueryContext,
 ref IntPtr ppIFunctionInstanceCollectionQuery);
 UInt32 CreateInstanceQuery([MarshalAs(UnmanagedType.LPWStr)] string
pszFunctionInstanceIdentity,
 IntPtr pIFunctionDiscoveryNotification,
 IntPtr pfdqcQueryContext,
 ref IntPtr ppIFunctionInstanceQuery);
 UInt32 AddInstance(SystemVisibilityFlags enumSystemVisibility,
 [MarshalAs(UnmanagedType.LPWStr)] string pszCategory,
 [MarshalAs(UnmanagedType.LPWStr)] string pszSubCategory,
 [MarshalAs(UnmanagedType.LPWStr)] string pszCategoryIdentity,
 ref IntPtr ppIFunctionInstance);
 UInt32 RemoveInstance(SystemVisibilityFlags enumSystemVisibility,
 [MarshalAs(UnmanagedType.LPWStr)] string pszCategory,
 [MarshalAs(UnmanagedType.LPWStr)] string pszSubCategory,
 [MarshalAs(UnmanagedType.LPWStr)] string pszCategoryIdentity);
 }
 [Guid("F0A3D895-855C-42A2-948D-2F97D450ECB1"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 public interface IFunctionInstanceCollection
 {
 UInt32 GetCount(ref UInt32 pdwCount);
 UInt32 Get([MarshalAs(UnmanagedType.LPWStr)] string
pszInstanceIdentity,
 ref UInt32 pdwIndex,
 ref IntPtr ppIFunctionInstance);
 UInt32 Item(UInt32 dwIndex, ref IntPtr ppIFunctionInstance);
 UInt32 Add(IntPtr pIFunctionInstance);
 UInt32 Remove(UInt32 dwIndex, ref IntPtr ppIFunctionInstance);
 UInt32 Delete(UInt32 dwIndex);
 UInt32 DeleteAll();
 }
 [Guid("6D5140C1-7436-11CE-8034-00AA006009FA"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 public interface IServiceProvider
 {
 UInt32 QueryService(ref Guid guidService, ref Guid riid, ref IntPtr
ppvObject);
 UInt32 QueryService(ref Guid guidService, ref IntPtr pp);
 }
 [Guid("33591C10-0BED-4F02-B0AB-1530D5533EE9"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 public interface IFunctionInstance
 {
 UInt32 QueryService(ref Guid guidService, ref Guid riid, ref IntPtr
ppvObject);
 UInt32 GetID([MarshalAs(UnmanagedType.LPWStr)] ref string
ppszCoMemIdentity);
 UInt32 GetProviderInstanceID([MarshalAs(UnmanagedType.LPWStr)] ref
string ppszCoMemProviderInstanceIdentity);
 UInt32 OpenPropertyStore(UInt32 dwStgAccess, ref IntPtr
ppIPropertyStore);
 UInt32 GetCategory([MarshalAs(UnmanagedType.LPWStr)] ref string
ppszCoMemCategory, [MarshalAs(UnmanagedType.LPWStr)] ref string
ppszCoMemSubCategory);
 }
 [Guid("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 public interface IPropertyStore
 {
 UInt32 GetCount(ref UInt32 cProps);
 UInt32 GetAt(UInt32 iProp, ref PROPERTYKEY pkey);
 UInt32 GetValue(ref PROPERTYKEY key, ref PropVariant pv);
 UInt32 SetValue(ref PROPERTYKEY key, ref PropVariant propvar);
 UInt32 Commit();
 };
 #endregion
 public static bool IsPrinterDevice(IFunctionInstance DeviceDisplayObject,
ref DeviceInfo printerInfo)
 {
 bool isPrinter = false;
 Guid devicTypeID = Guid.Empty;
 UInt32 serviceCount = 0;
 UInt32 deviceFunctionCount = 0;
 IntPtr deviceFICollectionPtr = IntPtr.Zero;
 IntPtr serviceFICollectionPtr = IntPtr.Zero;
 IntPtr deviceFunctionInstancePtr = IntPtr.Zero;
 IntPtr serviceFunctionInstancePtr = IntPtr.Zero;
 IntPtr propertyStorePtr = IntPtr.Zero;
 IFunctionInstanceCollection deviceFICollection = null;
 IFunctionInstanceCollection serviceFICollection = null;
 IFunctionInstance deviceFunctionInstance = null;
 IFunctionInstance serviceFunctionInstance = null;
 IPropertyStore propertyStore = null;
 PropVariant variantData = new PropVariant();
 //
 //Enumerate device function instances
 //
 DeviceDisplayObject.QueryService(ref SID_EnumDeviceFunction, ref
IID_IFunctionInstanceCollection, ref deviceFICollectionPtr);
 deviceFICollection =
(IFunctionInstanceCollection)Marshal.GetObjectForIUnknown(deviceFICollectionPtr);
 deviceFICollection.GetCount(ref deviceFunctionCount);
 for (UInt32 i = 0; i < deviceFunctionCount; i++)
 {
 deviceFICollection.Item(i, ref deviceFunctionInstancePtr);
 if (IntPtr.Zero != deviceFunctionInstancePtr)
 {
 deviceFunctionInstance =
(IFunctionInstance)Marshal.GetObjectForIUnknown(deviceFunctionInstancePtr);
 //
 //Enumerate service for a device function instance
 //
 deviceFunctionInstance.QueryService(ref SID_EnumInterface, ref
IID_IFunctionInstanceCollection, ref serviceFICollectionPtr);
 if (IntPtr.Zero != serviceFICollectionPtr)
 {
 serviceFICollection =
(IFunctionInstanceCollection)Marshal.GetObjectForIUnknown(serviceFICollectionPtr);
 serviceFICollection.GetCount(ref serviceCount);
 for (UInt32 j = 0; j < serviceCount; j++)
 {
 serviceFICollection.Item(j, ref
serviceFunctionInstancePtr);
 if (IntPtr.Zero != serviceFunctionInstancePtr)
 {
 serviceFunctionInstance =
(IFunctionInstance)Marshal.GetObjectForIUnknown(serviceFunctionInstancePtr);

serviceFunctionInstance.OpenPropertyStore(STGM_READ, ref propertyStorePtr);
 if (IntPtr.Zero != propertyStorePtr)
 {
 propertyStore =
(IPropertyStore)Marshal.GetObjectForIUnknown(propertyStorePtr);
 propertyStore.GetValue(ref
PKEY_DeviceInterface_ClassGuid, ref variantData);
 if (VarEnum.VT_CLSID != variantData.Type)
 {
 variantData.Clear();
 Marshal.Release(propertyStorePtr);
 continue;
 }
 devicTypeID = (Guid)variantData.Value;
 variantData.Clear();
 if
(devicTypeID.Equals(Guid_DeviceType_Printer))
 {
 isPrinter = true;
 propertyStore.GetValue(ref
PKEY_DeviceInterface_PrinterName, ref variantData);
 printerInfo.DeviceName =
variantData.Value.ToString();
 printerInfo.Type = HardDeviceType.Printer;
 variantData.Clear();
 Marshal.Release(propertyStorePtr);
 break;
 }
 Marshal.Release(propertyStorePtr);
 }
 Marshal.Release(serviceFunctionInstancePtr);
 }
 }
 Marshal.Release(serviceFICollectionPtr);
 }
 Marshal.Release(deviceFunctionInstancePtr);
 }
 }
 if (IntPtr.Zero != deviceFICollectionPtr)
 {
 Marshal.Release(deviceFICollectionPtr);
 }
 return isPrinter;
 }
 public static ArrayList GetDeviceInfo(IFunctionInstance
deviceDisplayObject)
 {
 // Generate a list of DeviceInfo structs where each element is targeted
 // for one of: Printer TS(max 1 element), PnP TS, or USB TS.
 ArrayList deviceInfoAry = new ArrayList();
 DeviceInfo deviceDataInfo = new DeviceInfo();
 if (IsPrinterDevice(deviceDisplayObject, ref deviceDataInfo))
 {
 deviceInfoAry.Add(deviceDataInfo);
 }
 GetPnpAndUsbDeviceInfo(deviceDisplayObject, deviceInfoAry);
 return deviceInfoAry;
 }
 public static void GetPnpAndUsbDeviceInfo(IFunctionInstance
DeviceDisplayObject, ArrayList DeviceInfoArray)
 {
 UInt32 ResultCode = 0;
 UInt32 FunctionCount = 0;
 // ResultDeviceInfo will store data about a devnode (different devnodes
at different times).
 // When a devnode should be troubleshooted, we'll call
DeviceInfoArray.Add(ResultDeviceInfo).
 // This saves off the current value of ResultDeviceInfo. (Note the
object's value is saved off
 // instead of the object itself being referenced, since the object is a
DeviceInfo, a value type.)
 DeviceInfo ResultDeviceInfo = new DeviceInfo();
 IntPtr FICollectionPtr = IntPtr.Zero;
 IntPtr FunctionInstancePtr = IntPtr.Zero;
 IntPtr PropertyStorePtr = IntPtr.Zero;
 IFunctionInstanceCollection FICollection = null;
 IFunctionInstance FunctionInstance = null;
 IPropertyStore PropertyStore = null;
 PropVariant VariantData = new PropVariant();
 bool NoDriver = false;
 bool RawCapable = false;
 string Category = null;
 string SubCategory = null;
 //
 //Enumerate device function instance for DDO
 //
 DeviceDisplayObject.QueryService(ref SID_EnumDeviceFunction, ref
IID_IFunctionInstanceCollection, ref FICollectionPtr);
 if (IntPtr.Zero != FICollectionPtr)
 {
 FICollection =
(IFunctionInstanceCollection)Marshal.GetObjectForIUnknown(FICollectionPtr);
 ResultCode = FICollection.GetCount(ref FunctionCount);
 for (UInt32 i = 0; i < FunctionCount; i++)
 {
 ResultCode = FICollection.Item(i, ref FunctionInstancePtr);
 if (IntPtr.Zero != FunctionInstancePtr)
 {
 FunctionInstance =
(IFunctionInstance)Marshal.GetObjectForIUnknown(FunctionInstancePtr);
 ResultCode = FunctionInstance.GetCategory(ref Category, ref
SubCategory);
 if (Category != null)
 {
 ResultCode =
FunctionInstance.OpenPropertyStore(STGM_READ, ref PropertyStorePtr);
 if (IntPtr.Zero != PropertyStorePtr)
 {
 PropertyStore =
(IPropertyStore)Marshal.GetObjectForIUnknown(PropertyStorePtr);
 ResultCode = PropertyStore.GetValue(ref PKEY_NAME,
ref VariantData);
 if (VarEnum.VT_EMPTY != VariantData.Type)
 {
 ResultDeviceInfo.DeviceName =
VariantData.Value.ToString();
 VariantData.Clear();
 }
 else
 {
 ResultDeviceInfo.DeviceName = string.Empty;
 }
 ResultCode = PropertyStore.GetValue(ref
PKEY_Device_InstanceId, ref VariantData);
 ResultDeviceInfo.DeviceID =
VariantData.Value.ToString();
 VariantData.Clear();
 // Check if this is a USB devnode relevant to USB
troubleshooter.
 // Include any device whose enumerator is "USB".
This includes:
 // 1. USB root hubs; 2. USB hubs; 3. USB peripheral
devices; 4. USB composite device interfaces
 if (ResultDeviceInfo.DeviceID.StartsWith("USB",
StringComparison.InvariantCultureIgnoreCase))
 {
 // Get container ID.
 ResultCode = PropertyStore.GetValue(ref
PKEY_Device_ContainerId, ref VariantData);
 Guid DeviceContainerId =
(Guid)VariantData.Value;
 VariantData.Clear();
 // If it's an internal (computer container) USB
device,
 // don't include it for the USB
troubleshooter.
 if (!
DeviceContainerId.Equals(ContainerId_Computer))
 {
 ResultDeviceInfo.Type = HardDeviceType.USB;
// which troubleshooter
 DeviceInfoArray.Add(ResultDeviceInfo); //
copies current value into new array element
 }
 }
 ResultCode = PropertyStore.GetValue(ref
PKEY_Device_ProblemCode, ref VariantData);
 if (VariantData.Type == VarEnum.VT_UI4)
 {
 int ConfigManagerErrorCode =
Convert.ToInt32(VariantData.Value);
 VariantData.Clear();
 ResultCode = PropertyStore.GetValue(ref
PKEY_Device_DriverInfPath, ref VariantData);
 NoDriver = (VariantData.Type ==
VarEnum.VT_EMPTY);
 VariantData.Clear();
 // Check to see if the device is RAW capable by
selecting the Device Capabilities
 // flag from the Property Store and examining
the proper bit in the bitfield.
 ResultCode = PropertyStore.GetValue(ref
PKEY_Device_Capabilities, ref VariantData);
 RawCapable = (RAW_DEVICE_OK_FLAG ==
(Convert.ToUInt32(VariantData.Value) & RAW_DEVICE_OK_FLAG));
 VariantData.Clear();
 // If a device is RAW capable and has no driver
then it should be excluded from
 // the device info array.
 if (0 != ConfigManagerErrorCode || (NoDriver &&
!RawCapable))
 {
 ResultDeviceInfo.Type =
HardDeviceType.PNPDevice;
 DeviceInfoArray.Add(ResultDeviceInfo); //
copies current value into new array element
 }
 }
 Marshal.Release(PropertyStorePtr);
 }
 }
 Marshal.Release(FunctionInstancePtr);
 }
 }
 Marshal.Release(FICollectionPtr);
 }
 }
 public static ArrayList DiagnosticDeviceDisplayObject(Guid
TargetContainerID)
 {
 ArrayList ProblemDeviceInfo = null;
 UInt32 ResultCode = 0;
 UInt32 InstanceCount = 0;
 IntPtr FunctionDiscoveryPtr = IntPtr.Zero;
 IntPtr FICollectionPtr = IntPtr.Zero;
 IntPtr FunctionInstancePtr = IntPtr.Zero;
 IntPtr PropertyStorePtr = IntPtr.Zero;
 IFunctionDiscovery FunctionDiscovery = null;
 IFunctionInstanceCollection FICollection = null;
 IFunctionInstance FunctionInstance = null;
 IPropertyStore PropertyStore = null;
 PropVariant VariantData = new PropVariant();
 ResultCode = CoCreateInstance(ref CLSID_FunctionDiscovery, null,
CLSCTX_ALL, ref IID_IFunctionDiscovery, ref FunctionDiscoveryPtr);
 if (IntPtr.Zero != FunctionDiscoveryPtr)
 {
 FunctionDiscovery =
(IFunctionDiscovery)Marshal.GetObjectForIUnknown(FunctionDiscoveryPtr);
 ResultCode =
FunctionDiscovery.GetInstanceCollection(FCTN_CATEGORY_DEVQUERYOBJECTS, IntPtr.Zero,
false, ref FICollectionPtr);
 if (IntPtr.Zero != FICollectionPtr)
 {
 FICollection =
(IFunctionInstanceCollection)Marshal.GetObjectForIUnknown(FICollectionPtr);
 ResultCode = FICollection.GetCount(ref InstanceCount);
 for (UInt32 i = 0; i < InstanceCount; i++)
 {
 ResultCode = FICollection.Item(i, ref FunctionInstancePtr);
 if (IntPtr.Zero != FunctionInstancePtr)
 {
 FunctionInstance =
(IFunctionInstance)Marshal.GetObjectForIUnknown(FunctionInstancePtr);
 ResultCode =
FunctionInstance.OpenPropertyStore(STGM_READ, ref PropertyStorePtr);
 if (IntPtr.Zero != PropertyStorePtr)
 {
 PropertyStore =
(IPropertyStore)Marshal.GetObjectForIUnknown(PropertyStorePtr);
 ResultCode = PropertyStore.GetValue(ref PKEY_NAME,
ref VariantData);
 if (VariantData.Value == null)
 {
 continue;
 }
 string DeviceObjectName =
VariantData.Value.ToString();
 VariantData.Clear();
 ResultCode = PropertyStore.GetValue(ref
PKEY_Device_ContainerId, ref VariantData);
 Guid ContainerID = (Guid)VariantData.Value;
 VariantData.Clear();
 if (TargetContainerID.Equals(ContainerID))
 {
 ProblemDeviceInfo =
GetDeviceInfo(FunctionInstance);
 Marshal.Release(FunctionInstancePtr);
 Marshal.Release(PropertyStorePtr);
 break;
 }
 Marshal.Release(PropertyStorePtr);
 }
 Marshal.Release(FunctionInstancePtr);
 }
 }
 Marshal.Release(FICollectionPtr);
 }
 Marshal.Release(FunctionDiscoveryPtr);
 }
 return ProblemDeviceInfo;
 }
 }
}
"@
 Add-Type -TypeDefinition $GetProblematicFunctionSource
 $DDOManagerObject = [Microsoft.Windows.Diagnosis.DDOManager]
 [Guid]$guidContainer = new-object -TypeName System.Guid($DDOContainerID)
 $DeviceIDArray =
$DDOManagerObject::DiagnosticDeviceDisplayObject($guidContainer)
 return $D 

Javascript Online Compiler

Write, Run & Share Javascript code online using OneCompiler's JS online compiler for free. It's one of the robust, feature-rich online compilers for Javascript language. Getting started with the OneCompiler's Javascript editor is easy and fast. The editor shows sample boilerplate code when you choose language as Javascript and start coding.

About Javascript

Javascript(JS) is a object-oriented programming language which adhere to ECMA Script Standards. Javascript is required to design the behaviour of the web pages.

Key Features

  • Open-source
  • Just-in-time compiled language
  • Embedded along with HTML and makes web pages alive
  • Originally named as LiveScript.
  • Executable in both browser and server which has Javascript engines like V8(chrome), SpiderMonkey(Firefox) etc.

Syntax help

STDIN Example

var readline = require('readline');
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});

rl.on('line', function(line){
    console.log("Hello, " + line);
});

variable declaration

KeywordDescriptionScope
varVar is used to declare variables(old way of declaring variables)Function or global scope
letlet is also used to declare variables(new way)Global or block Scope
constconst is used to declare const values. Once the value is assigned, it can not be modifiedGlobal or block Scope

Backtick Strings

Interpolation

let greetings = `Hello ${name}`

Multi line Strings

const msg = `
hello
world!
`

Arrays

An array is a collection of items or values.

Syntax:

let arrayName = [value1, value2,..etc];
// or
let arrayName = new Array("value1","value2",..etc);

Example:

let mobiles = ["iPhone", "Samsung", "Pixel"];

// accessing an array
console.log(mobiles[0]);

// changing an array element
mobiles[3] = "Nokia";

Arrow functions

Arrow Functions helps developers to write code in concise way, it’s introduced in ES6.
Arrow functions can be written in multiple ways. Below are couple of ways to use arrow function but it can be written in many other ways as well.

Syntax:

() => expression

Example:

const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
const squaresOfEvenNumbers = numbers.filter(ele => ele % 2 == 0)
                                    .map(ele => ele ** 2);
console.log(squaresOfEvenNumbers);

De-structuring

Arrays

let [firstName, lastName] = ['Foo', 'Bar']

Objects

let {firstName, lastName} = {
  firstName: 'Foo',
  lastName: 'Bar'
}

rest(...) operator

 const {
    title,
    firstName,
    lastName,
    ...rest
  } = record;

Spread(...) operator

//Object spread
const post = {
  ...options,
  type: "new"
}
//array spread
const users = [
  ...adminUsers,
  ...normalUsers
]

Functions

function greetings({ name = 'Foo' } = {}) { //Defaulting name to Foo
  console.log(`Hello ${name}!`);
}
 
greet() // Hello Foo
greet({ name: 'Bar' }) // Hi Bar

Loops

1. If:

IF is used to execute a block of code based on a condition.

Syntax

if(condition){
    // code
}

2. If-Else:

Else part is used to execute the block of code when the condition fails.

Syntax

if(condition){
    // code
} else {
    // code
}

3. Switch:

Switch is used to replace nested If-Else statements.

Syntax

switch(condition){
    case 'value1' :
        //code
        [break;]
    case 'value2' :
        //code
        [break;]
    .......
    default :
        //code
        [break;]
}

4. For

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement){  
//code  
} 

5. While

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while (condition) {  
  // code 
}  

6. Do-While

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {  
  // code 
} while (condition); 

Classes

ES6 introduced classes along with OOPS concepts in JS. Class is similar to a function which you can think like kind of template which will get called when ever you initialize class.

Syntax:

class className {
  constructor() { ... } //Mandatory Class method
  method1() { ... }
  method2() { ... }
  ...
}

Example:

class Mobile {
  constructor(model) {
    this.name = model;
  }
}

mbl = new Mobile("iPhone");