如:就是在设备管理器里面点击板卡属性中的位置信息,
如位置: PCI slot5(PCI 总线0、设备19、功能0)具体操作:
我的电脑-》属性-》硬件-》设备管理器-》声音,视频和游戏控制器-》某某驱动-》属性-》常规 可以看见如下信息:
设备类型:声音,视频和游戏控制器
制造商: DVB-T
位置: PCI slot5(PCI 总线0、设备19、功能0) 我现在就是想要获取该驱动的这个“位置: PCI slot5(PCI 总线0、设备19、功能0)”信息,好在我的应用程序里面显示出来,这应该有API函数可以获取吧,但怎么样具体操作,我不知道。可以给点例子,或者指点我一下吗,谢谢了!
如位置: PCI slot5(PCI 总线0、设备19、功能0)具体操作:
我的电脑-》属性-》硬件-》设备管理器-》声音,视频和游戏控制器-》某某驱动-》属性-》常规 可以看见如下信息:
设备类型:声音,视频和游戏控制器
制造商: DVB-T
位置: PCI slot5(PCI 总线0、设备19、功能0) 我现在就是想要获取该驱动的这个“位置: PCI slot5(PCI 总线0、设备19、功能0)”信息,好在我的应用程序里面显示出来,这应该有API函数可以获取吧,但怎么样具体操作,我不知道。可以给点例子,或者指点我一下吗,谢谢了!
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
VOID PrintWin32Error(DWORD dwError)
{
LPVOID lpMsgBuf; FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&lpMsgBuf,
0,
NULL
); if (lpMsgBuf)
{
::MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK);
LocalFree(lpMsgBuf);
}
}
int main(int argc, char *argv[], char *envp[])
{
HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
DWORD dwErrCode = 0; //
// Create a HDEVINFO with all present devices.
//
hDevInfo = SetupDiGetClassDevs(
(LPGUID)&GUID_DEVCLASS_DISPLAY,
0,
0,
DIGCF_PRESENT
);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
dwErrCode = GetLastError();
PrintWin32Error(dwErrCode);
return 1;
} //
// Enumerate through all devices.
//
printf("All Port Device List:\n"); LPTSTR pBuffer = NULL;
DWORD dwBufferSize = 0x40; pBuffer = (char*)LocalAlloc(LPTR, dwBufferSize);
if (!pBuffer)
{
dwErrCode = GetLastError();
PrintWin32Error(dwErrCode);
return 2;
} DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
{
DWORD PropertyRegDataType; //
// Call function with NULL to begin with, then use the returned buffer
// size to allocate the buffer. Keep calling until success or an unknown
// failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_LOCATION_INFORMATION,
&PropertyRegDataType,
(PBYTE)pBuffer,
dwBufferSize,
NULL))
{
dwErrCode = GetLastError();
if (dwErrCode == ERROR_INSUFFICIENT_BUFFER)
{
//
// Increase the buffer size.
//
dwBufferSize += 0x20;
pBuffer = (char*)LocalReAlloc(pBuffer, dwBufferSize, LMEM_MOVEABLE);
}
else if (dwErrCode == ERROR_NO_MORE_ITEMS)
{ // No more device
break;
}
else
{ // Some error occur!
PrintWin32Error(dwErrCode); if (pBuffer)
{
LocalFree(pBuffer);
} // Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
return 3;
}
} printf("%s\n", pBuffer);
} if (pBuffer)
{
LocalFree(pBuffer);
} // Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CDeviceTreeCtrl message handlers
int CDeviceTreeCtrl::EnumDeviceClasses(int index, TCHAR* DeviceClassName, TCHAR* DeviceClassDesc, BOOL* DevicePresent, int* ClassImage)
{
int nResult = -1;
GUID ClassGuid = {0};
BOOL resNam = FALSE;
ULONG RequiredSize = MAX_DEV_LEN;
TCHAR* name = new TCHAR[MAX_DEV_LEN];
HDEVINFO NewDeviceInfoSet = NULL;
nResult = CM_Enumerate_Classes(index, &ClassGuid, 0);
*DevicePresent = FALSE;
//incorrect device class:
if(nResult == CR_INVALID_DATA)
{
return -2;
}
//device class is absent
if(nResult == CR_NO_SUCH_VALUE)
{
return -1;
}
//bad param. - fatal error
if(nResult != CR_SUCCESS)
{
return -3;
} resNam = SetupDiClassNameFromGuid(&ClassGuid, name, RequiredSize, &RequiredSize);
if(RequiredSize > 0)
{
delete[] name;
name = new TCHAR[RequiredSize];
resNam = SetupDiClassNameFromGuid(&ClassGuid, name, RequiredSize, &RequiredSize);
} SetupDiGetClassImageIndex(&m_ImageListData, &ClassGuid, ClassImage);
NewDeviceInfoSet = SetupDiGetClassDevs(&ClassGuid, 0, NULL, DIGCF_PRESENT); if(NewDeviceInfoSet == INVALID_HANDLE_VALUE)
{
*DevicePresent = FALSE;
_tcscpy(DeviceClassName, name); delete[] name;
name = NULL;
return 0;
} HKEY KeyClass = SetupDiOpenClassRegKeyEx(&ClassGuid,
MAXIMUM_ALLOWED,
DIOCR_INSTALLER,
NULL,
0); if(KeyClass == INVALID_HANDLE_VALUE)
{
*DevicePresent = FALSE;
_tcscpy(DeviceClassName, name); delete[] name;
name = NULL;
return 0;
}
else
{
long dwSize = MAX_DEV_LEN;
int res = RegQueryValue(KeyClass, NULL, DeviceClassDesc, &dwSize); if (res != ERROR_SUCCESS)
_tcscpy(DeviceClassDesc, _T(""));
}
SetupDiDestroyDeviceInfoList(NewDeviceInfoSet); _tcscpy(DeviceClassName, name);
*DevicePresent = TRUE; RegCloseKey(KeyClass);
delete [] name;
name = NULL;
return 0;
}
int CDeviceTreeCtrl::EnumDevices(int index, TCHAR* DeviceClassName, TCHAR* DeviceName)
{
GUID* guids = new GUID[1];
ULONG RequiredSize = 0;
HDEVINFO NewDeviceInfoSet = NULL;
SP_DEVINFO_DATA DeviceInfoData = {0}; BOOL res = SetupDiClassGuidsFromName(DeviceClassName, &guids[0], RequiredSize, &RequiredSize); if (RequiredSize==0)
{
//incorrect class name:
_tcscpy(DeviceName, _T(""));
return -2;
} if(!res)
{
delete [] guids;
guids = new GUID[RequiredSize];
res = SetupDiClassGuidsFromName(DeviceClassName, &guids[0],
RequiredSize, &RequiredSize); if (!res || RequiredSize==0)
{
//incorrect class name:
_tcscpy(DeviceName, _T(""));
return -2;
}
} //get device info set for our device class
NewDeviceInfoSet = SetupDiGetClassDevs(&guids[0], 0, NULL, DIGCF_PRESENT);
if(NewDeviceInfoSet == INVALID_HANDLE_VALUE)
if(!res)
{
//device information is unavailable:
_tcscpy(DeviceName, _T(""));
return -3;
} DeviceInfoData.cbSize = 28;
//is devices exist for class
DeviceInfoData.DevInst = 0;
ZeroMemory(&DeviceInfoData.ClassGuid, sizeof(GUID));
DeviceInfoData.Reserved = 0; res = SetupDiEnumDeviceInfo(NewDeviceInfoSet, index, &DeviceInfoData); if (!res)
{
//no such device:
SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
_tcscpy(DeviceName, _T(""));
return -1;
}
if (!SetupDiGetDeviceRegistryProperty(NewDeviceInfoSet, &DeviceInfoData,
SPDRP_FRIENDLYNAME, 0, (BYTE*) DeviceName,
MAX_DEV_LEN, NULL))
{
res = SetupDiGetDeviceRegistryProperty(NewDeviceInfoSet, &DeviceInfoData,
SPDRP_DEVICEDESC, 0, (BYTE*) DeviceName,
MAX_DEV_LEN, NULL);
if (!res)
{
//incorrect device name:
SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
_tcscpy(DeviceName, _T(""));
return -4;
}
}
return 0;
}
void CDeviceTreeCtrl::EnumDevices()
{
DeleteAllItems();
//Set Image List
m_ImageListData.cbSize = sizeof(m_ImageListData);
SetupDiGetClassImageList(&m_ImageListData); m_ImageList.Attach(m_ImageListData.ImageList);
CBitmap myComputer;
myComputer.LoadBitmap(IDB_BITMAP_COMPUTER);
COLORREF colormask = RGB(255, 0, 255);
m_ImageList.Add(&myComputer, colormask);
SetImageList(&m_ImageList, TVSIL_NORMAL);
HTREEITEM hRoot, hDeviceClasses;
TCHAR ComputerName[MAX_PATH];
DWORD dwSize = MAX_PATH;
GetComputerName(ComputerName, &dwSize); int ComputerImage = m_ImageList.GetImageCount() - 1;
hRoot = InsertItem(ComputerName, ComputerImage, ComputerImage);
TCHAR classes[MAX_DEV_LEN] = {0};
TCHAR classesDesc[MAX_DEV_LEN] = {0}; BOOL DevExist = FALSE;
int index = 0;
int DeviceImage;
int res = EnumDeviceClasses(index , classes, classesDesc, &DevExist, &DeviceImage);
while (res != -1)
{
if (res >= -1 && DevExist)
{
//Add New Device Entry to Tree
if (_tcsicmp(classesDesc, _T(""))==0)
hDeviceClasses = InsertItem((LPCTSTR) classes,
DeviceImage, DeviceImage, hRoot);
else
hDeviceClasses = InsertItem((LPCTSTR) classesDesc,
DeviceImage, DeviceImage, hRoot);
//loop for enumerating devices of specefic class!
int result, DevIndex = 0;
TCHAR DeviceName[MAX_DEV_LEN] = _T("");
result = EnumDevices(DevIndex, classes, DeviceName);
while (result != -1)
{
if (result == 0)
InsertItem(DeviceName, DeviceImage, DeviceImage, hDeviceClasses);
DevIndex++;
result = EnumDevices(DevIndex, classes, DeviceName);
} if (GetChildItem(hDeviceClasses)==NULL)
DeleteItem(hDeviceClasses);
else
SortChildren(hDeviceClasses); } index++;
res = EnumDeviceClasses(index, classes, classesDesc, &DevExist, &DeviceImage);
} Expand(hRoot, TVE_EXPAND);
SortChildren(hRoot);
}
现在我还有一个问题,就是我想获取我的设备的serial number,例如:就是在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\enum\pci\ven_1022&dev_1100&subsys\3&13c0b05&0&c0 的“3&13c0b05&0&c0”这个名字,他也被叫做serial number,根据我们的卡在不同的查槽他的名字是会改变的,我原来想得到的 “PCI slot5(PCI 总线0、设备19、功能0)”信息正是在他里面的键:location information 里,上面大家给的方法其实也就是从这里获取信息的,对吧!但我想获取serial number“3&13c0b05&0&c0”,(可能在同一个设备名字下有多个,原因我也说了),我原来是用“setupDiGetDeviceInterfaceDetail”来获取设备的完整路径,那么在路径的里面,就有我要的serial number,但是这个方法好臃肿,我想,我都可以在serial number这个目录里面获取location information ,应该有很快的方法获取这个serial number名字,我也想了些办法,效果不好,各位高手,拜托你们啦!
help!!!!!!!