5069|11

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教一个问题,关于控制PCI插槽是否工作 [复制链接]

现在有3个PCI插槽,都插了硬件,请问如何通过软件来实现其中一个硬件工作而另两个不工作?

最新回复

是否可以用winio读到设备的中断然后再通过赋值停掉它呢?  详情 回复 发表于 2009-6-18 22:39
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
禁用设备?应该回有相应的IRP和API。
可惜我不知道,帮楼主顶下。
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是否可用通过设备的电源管理来做?
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
传说中的SetupAPI
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 
我觉得应该是PNP的工作吧?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
一种方法是通过函数禁用其余两个硬件,第二种方法是只打开要处理的硬件的中断,其余的不打开使能
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
这是一些代码,实现禁用USB口设备的功能,你可以修改一下改为用来控制你的PCI设备
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));
}
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

8
 
这个当然可以实现。加载驱动后,关闭功能就是了。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 
如果我用winio来做的话,具体应该怎么做呢?
 
 
 

回复

97

帖子

0

TA的资源

一粒金砂(中级)

10
 
引用 5 楼 lishu2002 的回复:
一种方法是通过函数禁用其余两个硬件,第二种方法是只打开要处理的硬件的中断,其余的不打开使能

我是用winio做的,如果是用第二种方法,如何关闭其他的中断呢,给他们的中断赋值赋什么?NULL吗?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
具体设备的中断都有专门的寄存器吧,如果没有专门的开关中断寄存器,可以考虑用第一种方法,上面都已经有代码了,稍微改动一下就可以了
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
是否可以用winio读到设备的中断然后再通过赋值停掉它呢?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表