Windows设备禁用

时间:2013-12-18 14:27:34

标签: c++ windows-7 device-manager

我正在尝试从我的应用中禁用网络摄像头。它将设备管理器中的设备状态从禁用更改为启用但设备仍处于活动状态,并且当我尝试关闭设备属性窗口时。它要求重新启动系统以实现更改。通过代码我们可以在没有系统重启的情况下完成任务。

int main(int argc, void * argv[])
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
SP_PROPCHANGE_PARAMS params; // params to set in order to enable/disable the device

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,0, 0,DIGCF_PRESENT | DIGCF_ALLCLASSES );

if (hDevInfo == INVALID_HANDLE_VALUE)
{
    // Insert error handling here.
    return 1;
}

// Enumerate through all devices in Set.

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)
{
      wchar_t  szPhysical[MAX_PATH] = {0};
      const char *sstt ="\\Device\\00000079";

      while (!SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,0L,(PBYTE)szPhysical,2048,0)){}

      if(szPhysical[0]==sstt[0])
        if(szPhysical[1]==sstt[1])
        if(szPhysical[2]==sstt[2])
        if(szPhysical[3]==sstt[3])
        if(szPhysical[4]==sstt[4])
        if(szPhysical[5]==sstt[5])
        if(szPhysical[6]==sstt[6])
        if(szPhysical[7]==sstt[7])
        if(szPhysical[8]==sstt[8])
        if(szPhysical[9]==sstt[9])
        if(szPhysical[10]==sstt[10])
        if(szPhysical[11]==sstt[11])
        if(szPhysical[12]==sstt[12])
        if(szPhysical[13]==sstt[13])
        if(szPhysical[14]==sstt[14])
        if(szPhysical[15]==sstt[15]){

        printf("disabling...\n");
        // init the structure
        params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
        params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        params.HwProfile = 0;
        params.Scope = DICS_FLAG_CONFIGSPECIFIC;
        params.StateChange = DICS_DISABLE;
        // prepare operation
        if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData,&params.ClassInstallHeader, sizeof(params)))
        {
            printf("Error while preparing params !\n");
            break;
        }
        // launch op
        if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData))
        {
            printf("Error while calling OP ! Return code is %x\n", GetLastError());
            continue;
        }
        printf("done.\n\n");

    }

}

if ( GetLastError()!=NO_ERROR &&GetLastError()!=ERROR_NO_MORE_ITEMS )
{
    // Insert error handling here.
    return 1;
}

//  Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;

}

任何帮助表示赞赏

感谢

2 个答案:

答案 0 :(得分:2)

我得到了解决方案 进程具有硬件开放的句柄,并加载了dll,s等,这就是它需要重启的原因。必须退出已连接到设备的进程以避免在禁用设备之前重新启动

答案 1 :(得分:0)

我没有代表评论,否则我会有,因为这肯定不是一个完整的答案。你看过WMI界面了吗?例如,Win32_SystemDriver类可能会执行您想要的操作 - 它具有“禁用”方法。