使用SetupDiCallClassInstaller阻止USB设备需要很长时间

时间:2016-10-12 11:30:41

标签: winapi usb msdn

我使用SetupDiCallClassInstaller函数创建了一个阻止USB设备的应用程序。

但在某些操作系统中,阻塞过程只需1或2秒即可阻止插入的设备。这里阻塞是指禁用USB设备。

在某些操作系统中,阻止USB设备需要30秒到2分钟。

在这里,我分享了我的代码的一部分:

    SP_PROPCHANGE_PARAMS spPropChangeParams;
    spPropChangeParams.StateChange = DICS_DISABLE;
    spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    spPropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE ;
    spPropChangeParams.Scope = DICS_FLAG_GLOBAL ;
    spPropChangeParams.HwProfile = 0; // current hardware profile

    printf("Time Before Blocking Device : %s\n",GetCurrTime());

    if(SetupDiSetClassInstallParams(m_hDevInfo, &m_DeviceInfoData,(SP_CLASSINSTALL_HEADER*)&spPropChangeParams, sizeof(SP_PROPCHANGE_PARAMS))== FALSE )
    {
        printf("Not able to manage the status of the device.SetupDiSetClassInstallParams Failed at ErrorCode - %ld\n",GetLastError());
    }

    else if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,m_hDevInfo, &m_DeviceInfoData))
    {
        DWORD error = GetLastError();
        printf("Not able to manage the status of the device.SetupDiCallClassInstaller API Failed at Errorcode - %ld\n",error);
        {
            if(error == 13)
            {
                for(int i=0;i< RETRY_TIME ;i++)
                {
                    if(SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,m_hDevInfo, &m_DeviceInfoData))
                    {
                        printf("retry succeeded for disabling device\n");
                        break;
                    }
                    printf("retry failed for disabling device\n");  
                    Sleep(20);
                }
            }
        }
    }

    printf("Time After Blocking Device : %s\n",GetCurrTime());
  

OUTPUT是:

     

封锁装置前的时间:18:57:48
  阻止设备后的时间:18:59:18

           

此处,需要1.30分钟才能阻止该设备。

注意:设备被阻止(即)禁用。然后我转到设备管理器,然后启用已禁用的设备。然后再次阻止该设备需要很长时间。

请回复任何澄清。
谢谢和问候,
AK

1 个答案:

答案 0 :(得分:1)

设备管理器是否需要很长时间才能禁用该设备?什么样的USB设备有这样的问题?

术语“禁用设备”并非IMO精确。当您指示系统禁用某个设备时,系统会询问设备是否可以禁用它(以及是否允许执行此类操作)。只有当设备同意被禁用时,系统才会实际禁用它。

如果您遇到特定设备的问题,其驱动程序可能存在错误。我的三星外置SSD硬盘有类似的体验。有时,当它长时间闲置并且可能进入睡眠状态时,要么再次启动它,要么甚至禁用它都是很成问题的。尝试禁用它实际上成功但需要很长时间(几分钟)。当我再次启用设备时,它会开始正常工作。