private bool RestartDevice( IntPtr hDevInfo, Native.SP_DEVINFO_DATA devInfoData )
		{
			int szOfPcp;
			IntPtr ptrToPcp;
			int szDevInfoData;
			IntPtr ptrToDevInfoData;
			
			Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS();
			pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER));
			pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE;
			pcp.StateChange = Native.DICS_PROPCHANGE; // for reset
			pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC;
			pcp.HwProfile = 0;
			
			szOfPcp = Marshal.SizeOf(pcp);
			ptrToPcp = Marshal.AllocHGlobal(szOfPcp);
			Marshal.StructureToPtr(pcp, ptrToPcp, true);
			szDevInfoData = Marshal.SizeOf(devInfoData);
			ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData);
			Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true);
			
			bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS)));
			
			if (!rslt1)
				throw new Exception("SetupDiSetClassInstallParams failed " + Native.GetLastError());
			
			bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData);

			if (!rstl2)
				throw new Exception("SetupDiCallClassInstaller failed" + Native.GetLastError());
			
			if (rslt1 && rstl2)
			{
				return true;
			}
			
			
			return false;
		}
		private bool EnableOrDisableDevice(IntPtr hDevInfo, Native.SP_DEVINFO_DATA devInfoData, bool bEnable)
		{
			try
			{
				//Marshalling vars
				int szOfPcp;
				IntPtr ptrToPcp;
				int szDevInfoData;
				IntPtr ptrToDevInfoData;

				Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS();
				if (bEnable)
				{
					pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER));
					pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE;
					pcp.StateChange = Native.DICS_ENABLE;
					pcp.Scope = Native.DICS_FLAG_GLOBAL;
					pcp.HwProfile = 0;
					
					//Marshal the params
					szOfPcp = Marshal.SizeOf(pcp);
					ptrToPcp = Marshal.AllocHGlobal(szOfPcp);
					Marshal.StructureToPtr(pcp, ptrToPcp, true);
					szDevInfoData = Marshal.SizeOf(devInfoData);
					ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData);

					if (Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS))))
					{
						Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData);
					}
					pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER));
					pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE;
					pcp.StateChange = Native.DICS_ENABLE;
					pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC;
					pcp.HwProfile = 0;
				}
				else
				{
					pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER));
					pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE;
					pcp.StateChange = Native.DICS_DISABLE;
					pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC;
					pcp.HwProfile = 0;
				}
				//Marshal the params
				szOfPcp = Marshal.SizeOf(pcp);
				ptrToPcp = Marshal.AllocHGlobal(szOfPcp);
				Marshal.StructureToPtr(pcp, ptrToPcp, true);
				szDevInfoData = Marshal.SizeOf(devInfoData);
				ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData);
				Marshal.StructureToPtr(devInfoData, ptrToDevInfoData,true);

				bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS)));
				bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData);
				if ((!rslt1) || (!rstl2))
				{
					throw new Exception("Unable to change device state!");
					return false;
				}
				else
				{
					return true;
				}
			}
			catch (Exception ex)
			{
				return false;
			}
		}