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相关的设备信