设备可以有忙碌状态的。如果设备被其他进程占用,那么你可能需要等待设备被释放才可以禁用。
至于怎么禁用设备的问题,可以去看Windows DDK的文档。

解决方案 »

  1.   

    替换相应的IRP 派发函数,在Ring0层做 
      

  2.   

    可以考虑将设备的权限改成只有system可以使用,而你的服务在system权限下运行,这可以实现动态修改。
      

  3.   

    楼主的这个问题我也想问,
    不过我想问的是如何指定某个USB或某个网卡等的禁用,对所有USB禁用方法给个邮笨我发给你
      

  4.   

    通过SetupDi中的相关函数获得设备属性,并将获得的设备名与你在设备管理器中看到的设备名比较,相符合即可用SetupDi的禁用函数禁用了
      

  5.   

    SetupDiGetDeviceRegistryProperty(
                hDevInfo,
                &DeviceInfoData,
                SPDRP_DEVICEDESC,
                &DataT,
                (PBYTE)buffer,
                buffersize,
                &buffersize)
    该函数可以获得设备的相关属性
    //SPDRP_DEVICEDESC:根据设备名称 //SPDRP_HARDWAREID:根据硬件设备
      

  6.   

    参考一些代码实现禁用USB口设备
    BOOL GetRegistryProperty( HDEVINFO DeviceInfoSet, 
                            PSP_DEVINFO_DATA DeviceInfoData, 
                            ULONG Property, 
                            PVOID Buffer, 
                            PULONG Length ) 

        while ( !SetupDiGetDeviceRegistryProperty( DeviceInfoSet, 
                                                   DeviceInfoData, 
                                                   Property, 
                                                   NULL, 
                                                   (BYTE *)*(TCHAR **)Buffer, 
                                                   *Length, 
                                                   Length)) 
        { 
            // 长度不够则重新分配缓冲区
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
            { 
                if (*(LPTSTR *)Buffer) 
                    LocalFree(*(LPTSTR *)Buffer);             *(LPTSTR *)Buffer = (PCHAR)LocalAlloc(LPTR,*Length); 
            } 
            else 
            {
                return false; 
            }
        }     return (BOOL)(*(LPTSTR *)Buffer)[0]; 
    } BOOL EnableDevice(DWORD dwDevID, HDEVINFO hDevInfo)
    {
        return StateChange(DICS_ENABLE,dwDevID,hDevInfo);
    }BOOL DisableDevice(DWORD dwDevID, HDEVINFO hDevInfo)
    {
        return StateChange(DICS_DISABLE,dwDevID,hDevInfo);
    }BOOL ControlDevice(DWORD dwDevID, HDEVINFO hDevInfo , BOOL bEnable)
    {
        BOOL bCanDisable;
        bCanDisable = (IsDisableable(dwDevID,hDevInfo) && (!IsDisabled(dwDevID,hDevInfo))); if (bEnable)//Enable NetCard
    {
    if (!bCanDisable)
    {
    return EnableDevice(dwDevID,hDevInfo);
    }
    }
    else //Disable NetCard
    {
    if (bCanDisable )
    {
    return DisableDevice(dwDevID,hDevInfo);
    }
    }    return TRUE;
    }BOOL SetCOMDevState(BOOL bEnable) 
    {
        DWORD Status, Problem; 
        LPTSTR Buffer = NULL; 
        DWORD BufSize = 0; 
    BOOL bResult = FALSE;    // 返回所有设备信息
        HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES);    if (INVALID_HANDLE_VALUE == hDevInfo )        
            return bResult;     SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    //////////////////////////////////////////////////////////////////////////
        // 枚举设备
        //////////////////////////////////////////////////////////////////////////
        for ( DWORD DeviceId=0; 
            SetupDiEnumDeviceInfo( hDevInfo,DeviceId,&DeviceInfoData); 
            DeviceId++) 
        {
    // 获得设备的状态
            if (CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst ,0) != CR_SUCCESS) 
                continue;         // 获取设备类名
            TCHAR szDevName [MAX_PATH] = _T("") ;
            if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS , &Buffer, (PULONG)&BufSize)) 
            {
                lstrcpyn( szDevName, Buffer, MAX_PATH );          
            }        if ( lstrcmp( szDevName, _T("Ports") ) == 0 )            
            {             
                TCHAR szName [MAX_PATH] = _T("") ;
                if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_ENUMERATOR_NAME , &Buffer, (PULONG)&BufSize)) 
                {
                    lstrcpyn( szName, Buffer, MAX_PATH );
                }
                if ( lstrcmp( szName, _T("USB") ) == 0 )                
                { 
                    if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER , &Buffer, (PULONG)&BufSize)) 
                    {
                        lstrcpyn( szName, Buffer, MAX_PATH );

    // 获取设备描述
    if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC , &Buffer, (PULONG)&BufSize)) 
    {
                        
    lstrcpyn( szName, Buffer, MAX_PATH );
    if ( lstrcmp( szName, _T("USB-SERIAL") ) == 0 )//找到平安卡COM口转USB口读写设备           
    {
    bResult = ControlDevice(DeviceId,hDevInfo,bEnable);
    }

                    }
                } 
            } 
        }
        SetupDiDestroyDeviceInfoList(hDevInfo); return bResult;
    } BOOL StateChange( DWORD dwNewState, DWORD dwDevID, HDEVINFO hDevInfo)
    {
        SP_PROPCHANGE_PARAMS PropChangeParams;
        SP_DEVINFO_DATA        DevInfoData = {sizeof(SP_DEVINFO_DATA)};
        SP_DEVINSTALL_PARAMS devParams;    //查询设备信息
        if (!SetupDiEnumDeviceInfo( hDevInfo, dwDevID, &DevInfoData))
        {
            OutputDebugString("SetupDiEnumDeviceInfo FAILED");
            return FALSE;
        }    //设置设备属性变化参数
        PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
        PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        PropChangeParams.Scope = DICS_FLAG_GLOBAL; //使修改的属性保存在所有的硬件属性文件
        PropChangeParams.StateChange = dwNewState;
        PropChangeParams.HwProfile = 0;
        //改变设备属性
        if (!SetupDiSetClassInstallParams( hDevInfo,
                                            &DevInfoData,
                                            (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
                                            sizeof(PropChangeParams)))
        {
            OutputDebugString("SetupDiSetClassInstallParams FAILED");
            return FALSE;
        }
        
        
        PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
        PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        PropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC;//使修改的属性保存在指定的属性文件
        PropChangeParams.StateChange = dwNewState;
        PropChangeParams.HwProfile = 0;    //改变设备属性并调用安装服务
        if (!SetupDiSetClassInstallParams( hDevInfo,
                                           &DevInfoData,
                                           (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
                                           sizeof(PropChangeParams)) ||
            !SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DevInfoData))
        {
            OutputDebugString("SetupDiSetClassInstallParams or SetupDiCallClassInstaller FAILED");
            return TRUE;
        }
        else
        { 
            //判断是否需要重新启动
            devParams.cbSize = sizeof(devParams);
            if (!SetupDiGetDeviceInstallParams( hDevInfo, &DevInfoData, &devParams))
            {
                OutputDebugString("SetupDiGetDeviceInstallParams FAILED");
                return FALSE;
            }        if (devParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT))
            {
                OutputDebugString("Need Restart Computer");
                return TRUE;
            }
            return TRUE;
        }
    }BOOL IsDisableable(DWORD dwDevID, HDEVINFO hDevInfo)
    {
        SP_DEVINFO_DATA DevInfoData = {sizeof(SP_DEVINFO_DATA)};
        DWORD    dwDevStatus,dwProblem;
        if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData))
        {
            OutputDebugString("SetupDiEnumDeviceInfo FAILED");
            return FALSE;
        }
        //查询设备状态
        if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS)
        {
            OutputDebugString("CM_GET_DevNode_Status FAILED");
            return FALSE;
        }
        return ((dwDevStatus & DN_DISABLEABLE) && (dwProblem != CM_PROB_HARDWARE_DISABLED));
    }BOOL IsDisabled(DWORD dwDevID, HDEVINFO hDevInfo)
    {
        SP_DEVINFO_DATA DevInfoData = {sizeof(SP_DEVINFO_DATA)};
        DWORD    dwDevStatus,dwProblem;
        if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData))
        {
            OutputDebugString("SetupDiEnumDeviceInfo FAILED");
            return FALSE;
        }
        //查询设备状态
        if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS)
        {
            OutputDebugString("CM_GET_DevNode_Status FAILED");
            return FALSE;
        }
        return ((dwDevStatus & DN_HAS_PROBLEM) && (dwProblem == CM_PROB_DISABLED));
    }
      

  7.   

    SetCOMDevState(BOOL bEnable) 
    bEnable=FALSE禁用,反之则启用。
      

  8.   

    13楼的方法不错,我已经用于USB转串口的禁用和启用了