如何获取设备树关系图?

fly4free 2009-11-19 10:13:33
用 CM_GetParent 可以得到 结点句柄

而这样的 父节点,子节点,兄弟节点的关系,类似设备管理器的显示结果,但设备管理器显示的关系数并不是我想要的。。

最近我要根据盘符来判断是否是U盘,根据父节点的实例ID,可以判断出其是不是USB设备的

不过有些时候,判断不出来,有的盘符是usb的,但其父结点的实例id 是以 ide什么的开头。。。而不是usb..开头

所以我想使用一个类似USBView似的工具 或代码 ,显示当前系统中 的 设备关系。。。

哪位大侠知道?
...全文
359 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfz 2009-11-21
  • 打赏
  • 举报
回复
呵呵,你可以参照ms 的devcon
fly4free 2009-11-20
  • 打赏
  • 举报
回复
晕了,溜了一遍,自己发现问题了:
我只枚举了 GUID_DEVINTERFACE_DISK,

还需要 GUID_DEVINTERFACE_CDROM

依稀记得,有的U盘还可能产生A盘符, 也许记错了
也试试 GUID_DEVINTERFACE_FLOPPY 吧
fly4free 2009-11-20
  • 打赏
  • 举报
回复
我知道有IOCTL,我也知道有SetupDiXXX函数,
但是,设备之间的是用什么联系的啊?我之前就发过一个帖子,你也没说用啥联系的。

发IOCTL,返回信息 ,用哪一个IOCTL了,返回什么信息啊?
我发一个 IOCTL ,能返回所属U盘的InstanceId吗?还是什么?

我的问题就在于,我用了SetupDiXXX + CM_GetParent 等函数,可是那个移动硬盘的其中一个光盘盘符就是获取不到,只能获取到另外一个安全区盘符。。




BOOL IsUsbStorageSetupDi(LPCTSTR drvDeviceName)
{
// drvDeviceName 参数形式如: "\\\\.\\X:"
BOOL bRet = TRUE;
BOOL bDeviceFound = FALSE;
BOOL bFunRet;
//TCHAR szHubDevicePath[MAX_PATH];
TCHAR szHubPath[MAX_PATH];
TCHAR szInstanceID[MAX_DEVICE_ID_LEN];
TCHAR DevIdBuffer[512];

DWORD dwSdn;
DWORD dwRetFuncCode;
DWORD dwRequireSize = 1024 + sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
DWORD dwCurSn;

int nDevIndex = 0;
int strIndex1 = 0;
int strIndex2 = 0;
HDEVINFO hDevInfo = NULL;
SP_DEVICE_INTERFACE_DATA sia;
SP_DEVINFO_DATA da;
PSP_DEVICE_INTERFACE_DETAIL_DATA sddia = NULL;
DEVNODE dnParent;

dwRetFuncCode = GetDeviceNumber(drvDeviceName, &dwSdn);
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_DISK,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );

sia.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
da.cbSize = sizeof(SP_DEVINFO_DATA);

sddia = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc(GPTR, dwRequireSize);
sddia->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);


for ( nDevIndex = 0;
SetupDiEnumDeviceInterfaces(hDevInfo, NULL,(LPCGUID)&GUID_DEVINTERFACE_DISK, nDevIndex, &sia);
nDevIndex ++)
{
bFunRet = SetupDiGetDeviceInterfaceDetail(hDevInfo, &sia, sddia, dwRequireSize, &dwRequireSize, &da);
dwRetFuncCode = GetLastError();
//对于那个光盘盘符,DevicePath开头的不是"usb",是"ide..."什么的
//而一般U盘的是"USB\\....."或者"usbstor"??
GetDeviceNumber(sddia->DevicePath, &dwCurSn);
if(dwSdn == dwCurSn) //对于那个光盘盘符,通过设备路径获得的DeviceNumber与之前获得的不同……
{
CM_Get_Parent(&dnParent, da.DevInst, 0);
CM_Get_Device_ID(dnParent, DevIdBuffer, 512, 0);
StringCchCopy(szInstanceID, 512, DevIdBuffer);

memset(DevIdBuffer, 0, sizeof(DevIdBuffer));
CM_Get_Parent(&dnParent, dnParent, 0);
CM_Get_Device_ID(dnParent, DevIdBuffer, 512, 0);
StringCchCopy(szHubPath, 512, DevIdBuffer);
bDeviceFound = TRUE;
break;
}
}

GlobalFree(sddia);
SetupDiDestroyDeviceInfoList(hDevInfo);

if (!bDeviceFound) //对于那个光盘盘符, bDeviceFound 的结果就是FALSE,根本就没到下面的判断....
{
return FALSE;
}
//_tcsstr()
strIndex1 = lastIndexOfStr(szInstanceID, _T("USB\\"));
strIndex2 = lastIndexOfStr(szHubPath, _T("USB\\"));

if ( strIndex1 < 0 || strIndex1 > 3 || strIndex2 < 0 || strIndex2 > 3)
{
return FALSE;
}
return TRUE;
}
MoXiaoRab 2009-11-20
  • 打赏
  • 举报
回复
其实我觉得SetupAPI就够你用了,这个需求
MoXiaoRab 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fly4free 的回复:]
我要判断哪一个盘符是属于哪一个U盘的,你说需要不?
[/Quote]
发IOCTL,返回信息
dfz 2009-11-20
  • 打赏
  • 举报
回复
Device Installation Functions:SetupDiGetDeviceRegistryProperty() etc
fly4free 2009-11-20
  • 打赏
  • 举报
回复
我要判断哪一个盘符是属于哪一个U盘的,你说需要不?
myshinji 2009-11-20
  • 打赏
  • 举报
回复
驱动太高深了。

我只是想明白,系统的设备关系是啥?

明明是移动设备产生的盘符,为什么判断的却不是 BusType_USB (具体的忘了)
但是 USB设备删除列表里却能正确识别。?

谢谢。
togoblime 2009-11-20
  • 打赏
  • 举报
回复
为什么要根据父节点判断设备类型呢?GetDriveType不行吗
参考下面的源代码
http://www.codeproject.com/KB/tree/DeviceTree.aspx
MoXiaoRab 2009-11-19
  • 打赏
  • 举报
回复
有驱动搜索设备堆栈
设备树(device tree)机制是Linux内核从linux-3.x版本开始引进的一种机制,目的是解决内核源码的arch/arm目录下代码混乱的问题:随着ARM生态的快速发展,在内核源码的arch/arm目录下,存放着几十种arm芯片和几百个开发板相关的源文件,很多开发板和处理器的中断、寄存器等相关硬件资源都在这个目录下以.c或.h的文件格式定义。而对于内核来说,与这些硬件耦合,会导致内核代码混乱不堪,每个开发板上运行的内核镜像都必须单独编译配置,无法通用。什么时候Linux内核能像Windows镜像那样,无论你的电脑什么配置,一个Windows安装包,都可以直接下载安装运行呢?设备树机制,实现了Linux内核和硬件平台的解耦:每个硬件平台的硬件资源使用一个设备树文件(xxx.dts)来描述,而不是在arch/arm下以.c 或 .h 文件来定义。Linux内核是一个通用的内核,在启动过程中,在通过解析设备树中的硬件资源来初始化某个具体的平台。 引入设备树后,很多和内核驱动开发的工作也发生了变化:以往驱动工程师关注的头文件宏定义、寄存器定义,现在这些基本上不用关注,关注的重点则转向了如何根据硬件平台去配置和修改设备树文件。很多驱动的编程接口也发生了变化,开始慢慢使用device tree提供的编程接口去开发驱动。本期课程主要面向嵌入式开发人员,分享Linux下驱动开发所需要的设备树知识和必备技能

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧