akaryqin
驱动牛犊
驱动牛犊
  • 注册日期2009-06-01
  • 最后登录2010-04-29
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3660回复:7

有没有办法得到系统使用中某类设备的设备路径

楼主#
更多 发布于:2010-04-22 14:10
我知道如果已知一个设备接口GUID的话,可以使用下面函数得到设备路径,
从而可以打开设备进行查询或者其它操作。
---------------------------------------
      SetupDiGetClassDevs
      SetupDiEnumDeviceInterfaces
      SetupDiGetDeviceInterfaceDetail
---------------------------------------
可是我想要的是对某类设备,比如显卡,不论是什么品牌、什么型号,
都可以得到它的设备路径,所以现在就不知道怎么得到设备接口GUID了。
我试过使用设备类GUID中"Display"的GUID{4D36E968-E325-11CE-BFC1-08002BE10318},
但是使用SetupDiEnumDeviceInterfaces得不到正确结果。

不知道哪位可以帮忙?
不管是在应用层实现,还是在驱动中实现(最好是NT式驱动)都可以。

谢谢了。
weilking
驱动牛犊
驱动牛犊
  • 注册日期2009-02-18
  • 最后登录2016-04-18
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-04-25 14:02
参照武安和WDM驱动那本书里,关于GUID接口打开设备句柄的例子
记得是DriverWorks有个devinf.h文件调用下
里面CDeviceInterfaceClass和CDeviceInterface两个类能解决你的问题
akaryqin
驱动牛犊
驱动牛犊
  • 注册日期2009-06-01
  • 最后登录2010-04-29
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-04-26 08:47
谢谢!
我先试试。
akaryqin
驱动牛犊
驱动牛犊
  • 注册日期2009-06-01
  • 最后登录2010-04-29
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-04-26 09:15
weilking老兄说的是DriverWorks下面的devintf.h吧。
我觉得还是不行啊,CDeviceInterfaceClass初始化的时候,
还是需要提供一个GUID,现在问题是我想得到显卡的GUID,
但并不一定是什么显卡,所以也不知道GUID了。
如果我知道GUID,也就可以用上面我说的三个函数得到我想要的内容了。
还是说我理解的不对,请weilking老兄详细说一下。
谢谢!
weilking
驱动牛犊
驱动牛犊
  • 注册日期2009-02-18
  • 最后登录2016-04-18
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-04-26 13:59
原来没明白你的意思,你是想知道设备的GUID?
如果是的话,用SetupDiGetClassDevs,问朋友说做USB的时候用过这个枚举设备

The SetupDiGetClassDevs function retrieves a device information set that contains all devices of a specified class.

Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
5楼#
发布于:2010-04-26 21:28
GUID是可选参数,不设置就能搜索系统中的所有设备。但你还是要判断,这个设备到底是不是你要的设备。如果你自己都不明白,那你的问题有点怪。
另外,你应该用SetupDiEnumDevice而不是SetupDiEnumDeviceInterfaces。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
akaryqin
驱动牛犊
驱动牛犊
  • 注册日期2009-06-01
  • 最后登录2010-04-29
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-04-27 09:01
谢谢weilking和张书爱玉兄弟们的回复!

我要找到是类似于“\\?\pci#ven_10de&dev_0421&subsys_00007377&rev_a1#4&c556e70&0&0008#{5b45201d-f2f2-4f3b-85bb-
30ff1f953599}”这样的设备路径,好像这个路径必须是由SetupDiGetDeviceInterfaceDetail函数来得到的。
我知道并且试过使用SetupDiGetClassDevs函数和SetupDiEnumDeviceInfo函数两个结合可以枚举系统中的所有设备或者某类设备的部分信息,但是从这两个函数中我没有找到可以得到上面那样设备路径的方法。并且虽然SetupDiEnumDeviceInfo函数可以得到一个GUID,但那是Class GUID,而不是Interface GUID,使用这个GUID不能从SetupDiEnumDeviceInterfaces和SetupDiGetDeviceInterfaceDetail函数中得到上面的那种设备路径。
不知道我所说的有没有什么问题?
akaryqin
驱动牛犊
驱动牛犊
  • 注册日期2009-06-01
  • 最后登录2010-04-29
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-04-27 16:03
暂时解决吧。
我在winddk的各个头文件中找到了一些INTERFACE GUID,我只试了一下显卡对应的GUID,可以使用上面的三个函数得到设备路径。
其它的没有GUID没有试,有兴趣的人可以试一下。

DEFINE_GUID(GUID_DEVINTERFACE_DISPLAY_ADAPTER,        0x5b45201d, 0xf2f2, 0x4f3b, 0x85, 0xbb, 0x30, 0xff, 0x1f, 0x95, 0x35, 0x99);
DEFINE_GUID(GUID_DEVINTERFACE_DISK,                   0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_CDROM,                  0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,              0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_TAPE,                   0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,          0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,                 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,          0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,                 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,              0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,            0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_COMPORT,                0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73);
DEFINE_GUID(GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, 0x4D36E978L, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18);
DEFINE_GUID(GUID_DEVINTERFACE_HID,                    0x4D1E55B2L, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30);
DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB,                0xf18a0e88L, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8);
DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,             0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
DEFINE_GUID(GUID_DEVINTERFACE_USB_HOST_CONTROLLER,    0x3abf6f2dL, 0x71c4, 0x462a, 0x8a, 0x92, 0x1e, 0x68, 0x61, 0xe6, 0xaf, 0x27);
DEFINE_GUID(GUID_USB_WMI_STD_DATA,                    0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2);
DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION,            0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2);
DEFINE_GUID(GUID_DEVINTERFACE_KEYBOARD,               0x884b96c3L, 0x56ef, 0x11d1, 0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd);
DEFINE_GUID(GUID_DEVINTERFACE_MOUSE,                  0x378de44cL, 0x56ef, 0x11d1, 0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd);
DEFINE_GUID(GUID_DEVINTERFACE_COMPORT,                0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73);
DEFINE_GUID(GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, 0x4D36E978L, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18);
DEFINE_GUID(GUID_DEVINTERFACE_PARALLEL,               0x97F76EF0L, 0xF883, 0x11D0, 0xAF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x5C);
DEFINE_GUID(GUID_DEVINTERFACE_PARCLASS,               0x811FC6A5L, 0xF728, 0x11D0, 0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1);
游客

返回顶部