平时写的代码一半不是在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