private bool TryReEnableDevice(string deviceInstanceId)
{
try
{
bool success;
Guid hidGuid = new Guid();
NativeMethods.HidD_GetHidGuid(ref hidGuid);
IntPtr deviceInfoSet = NativeMethods.SetupDiGetClassDevs(ref hidGuid, deviceInstanceId, 0,
NativeMethods.DIGCF_PRESENT | NativeMethods.DIGCF_DEVICEINTERFACE);
NativeMethods.SP_DEVINFO_DATA deviceInfoData = new NativeMethods.SP_DEVINFO_DATA();
deviceInfoData.cbSize = Marshal.SizeOf(deviceInfoData);
success = NativeMethods.SetupDiEnumDeviceInfo(deviceInfoSet, 0, ref deviceInfoData);
success = NativeMethods.SetupDiEnumDeviceInfo(deviceInfoSet, 1,
ref deviceInfoData); // Checks that we have a unique device
NativeMethods.SP_PROPCHANGE_PARAMS propChangeParams = new NativeMethods.SP_PROPCHANGE_PARAMS();
propChangeParams.classInstallHeader.cbSize = Marshal.SizeOf(propChangeParams.classInstallHeader);
propChangeParams.classInstallHeader.installFunction = NativeMethods.DIF_PROPERTYCHANGE;
propChangeParams.stateChange = NativeMethods.DICS_DISABLE;
propChangeParams.scope = NativeMethods.DICS_FLAG_GLOBAL;
propChangeParams.hwProfile = 0;
success = NativeMethods.SetupDiSetClassInstallParams(deviceInfoSet, ref deviceInfoData,
ref propChangeParams, Marshal.SizeOf(propChangeParams));
if (!success)
{
return(false);
}
success = NativeMethods.SetupDiCallClassInstaller(NativeMethods.DIF_PROPERTYCHANGE, deviceInfoSet,
ref deviceInfoData);
if (!success)
{
return(false);
}
propChangeParams.stateChange = NativeMethods.DICS_ENABLE;
success = NativeMethods.SetupDiSetClassInstallParams(deviceInfoSet, ref deviceInfoData,
ref propChangeParams, Marshal.SizeOf(propChangeParams));
if (!success)
{
return(false);
}
success = NativeMethods.SetupDiCallClassInstaller(NativeMethods.DIF_PROPERTYCHANGE, deviceInfoSet,
ref deviceInfoData);
if (!success)
{
return(false);
}
NativeMethods.SetupDiDestroyDeviceInfoList(deviceInfoSet);
return(true);
}
catch
{
return(false);
}
}