快乐小胖兔的一窟

用自己的方式过一生 --- zyq654321

VC知识库BLOG 首页 新随笔 联系 聚合 登录
  23 Posts :: 0 Stories :: 95 Comments :: 2 Trackbacks

公告

Welcome you

留言簿(4)

随笔分类

随笔档案

文章档案

相册

网站联接

BLOG友情链接

搜索

最新评论

阅读排行榜

评论排行榜

        平时写的代码一半不是在windows下运行的,有朋友突然问希望在windows下看到占用DMA通道的设备。呵呵,差点死脑筋去写驱动!看了一下MSDN,发现其实这类小应用写起来也可以很简单的,原因很简单,MS为你提供了很多API。下面这段例子代码就是这个作用,还可以用它举一反做其它的事^_^:

// Author Hercules Zeng
FindDMAChannelOccupants()

{

    GUID    guidDevClass = GUID_NULL;

    TCHAR   tcsDevClassName[MAX_PATH + 1];

    BYTE    pBuffer[512];

    DWORD   nRequireSize = 0;

    DWORD   dwRtn;

    BOOL    bRtn;

    int     nIndex = 0;

    while(true)

    {

        dwRtn = CM_Enumerate_Classes(nIndex++, &guidDevClass, NULL);

        if(dwRtn == CR_NO_SUCH_VALUE)

        {

            break;

        }

        bRtn = SetupDiClassNameFromGuid(&guidDevClass, tcsDevClassName, MAX_PATH, &nRequireSize);

        if(!bRtn)

        {

            continue;

        }

        HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidDevClass, NULL, NULL, DIGCF_PRESENT);

        if(INVALID_HANDLE_VALUE == hDevInfo)

        {

            continue;

        }

 

        //Enumrate

        int nMemberIndex = 0;

        SP_DEVINFO_DATA devInfo_data;

        devInfo_data.cbSize = sizeof(SP_DEVINFO_DATA);

        while(true)

        {

            bRtn = SetupDiEnumDeviceInfo(hDevInfo, nMemberIndex++, &devInfo_data);

            if(!bRtn)

            {

                int nErr = GetLastError();

                break;

            }

            //Valid Device

            if(!SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfo_data, 0, 0, pBuffer, MAX_PATH, &nRequireSize))

                continue;

            // Open configuration

            LOG_CONF  lcLogConf = 0;

            dwRtn = CM_Get_First_Log_Conf(&lcLogConf, devInfo_data.DevInst, ALLOC_LOG_CONF);

            if(CR_SUCCESS != dwRtn)

            {

                if(CR_SUCCESS != CM_Get_First_Log_Conf(&lcLogConf, devInfo_data.DevInst, BOOT_LOG_CONF))

                    continue;

            }

                //

            RES_DES  rdResDes;

            dwRtn = CM_Get_Next_Res_Des(&rdResDes, lcLogConf, ResType_DMA, NULL, NULL);

            if(CR_SUCCESS == dwRtn)

            {

                // check DMA information

                if(CR_SUCCESS == CM_Get_Res_Des_Data_Size(&nRequireSize, rdResDes, NULL))

                {

                    PBYTE pTempBuf;

                    pTempBuf = new BYTE[nRequireSize];

                    memset(pTempBuf, 0, nRequireSize);                 

                    if(CR_SUCCESS == CM_Get_Res_Des_Data(rdResDes, (PVOID)pTempBuf, nRequireSize, NULL))

                    {

                        PDMA_DES pDMA = (PDMA_DES)pTempBuf;

                        // find

                        TCHAR tcsMessage[256];
                        sprintf(tcsMessage, _T("%s [DMA:%d]"), pBuffer, pDMA->DD_Alloc_Chan);
                        MessageBox(tcsMessage);

                    }

                    delete pTempBuf;

                }

 

                // release resource descriptor

                CM_Free_Res_Des_Handle(rdResDes);

            }

       

        }

 

        // Destroy HDEVINFO

        SetupDiDestroyDeviceInfoList(hDevInfo);    

    }

}

备注:  1 附加链接库: SetupAPI.lib
            2  Include文件:  cfgmgr32.h
            3  所需头文件: cfg.h download

posted on 2005-06-22 15:52 HERCULES BLOG 阅读(3731) 评论(4)  编辑 收藏

Feedback

# re: 小例子:检测DMA能道占用设备 2005-06-22 15:55 flyingleaf
谢了先。:)

# re: 小例子:检测占用DMA通道的设备 2005-10-25 10:01 sams_wang
这代码能否在98/me下运行吗?

# re: 小例子:检测占用DMA通道的设备 2006-12-19 16:35 guo
 SetupDiGetClassDevs 执行报997的错误;不知道为什么?

# re: 小例子:检测占用DMA通道的设备 2006-12-19 16:35 guo
 SetupDiGetClassDevs 执行报997的错误;不知道为什么?

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]