实战DeviceIoControl 之五:列举已安装的存储设备[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 bhw98 的 blog

q 前几次我们讨论的都是设备名比较清楚的情况,有了设备名(路径),就可以直接调用createfile打开设备,进行它所支持的i/o操作了。如果事先并不能确切知道设备名,如何去访问设备呢?

a 访问设备必须用设备句柄,而得到设备句柄必须知道设备路径,这个套路以你我之力是改变不了的。每个设备都有它所属类型的guid,我们顺着这个guid就能获得设备路径。

guid是同类或同种设备的全球唯一识别码,它是一个128 bit(16字节)的整形数,真实面目为

typedef struct _guid
{
    unsigned long  data1;
    unsigned short data2;
    unsigned short data3;
    unsigned char  data4[8];
} guid, *pguid;

例如,disk类的guid为“53f56307-b6bf-11d0-94f2-00a0c91efb8b”,在我们的程序里可以定义为

const guid diskclassguid = {0x53f56307l, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b)};

或者用一个宏来定义

define_guid(diskclassguid, 0x53f56307l, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);

通过guid找出设备路径,需要用到一组设备管理的api函数

setupdigetclassdevs, setupdienumdeviceinterfaces, setupdigetinterfacedevicedetail, setupdidestroydeviceinfolist,

以及结构sp_device_interface_data, sp_device_interface_detail_data。

有关信息请查阅msdn,这里就不详细介绍了。

实现guid到设备路径的代码如下:

// setupdigetinterfacedevicedetail所需要的输出长度,定义足够大
#define interface_detail_size    (1024)
  
// 根据guid获得设备路径
// lpguid: guid指针
// pszdevicepath: 设备路径指针的指针
// 返回: 成功得到的设备路径个数,可能不止1个
int getdevicepath(lpguid lpguid, lptstr* pszdevicepath)
{
    hdevinfo hdevinfoset;
    sp_device_interface_data ifdata;
    psp_device_interface_detail_data pdetail;
    int ncount;
    bool bresult;
  
    // 取得一个该guid相关的设备信

本文关键:DeviceIoControl,GUID
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top