#include
#define WIN32_LEAN_AND_MEAN
#include
#include
#include
#pragma comment(lib, "setupapi.lib")
#include
#define MAX_DEVICE 16
#include
#include
#include
int nCount=0;
// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
#define INTERFACE_DETAIL_SIZE 1024
const GUID DiskClassGuid ={0x873fdf, 0x61a8, 0x11d1, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xb1, 0x72, 0x8b}; //设备GUID
// 根据GUID获得设备路径
// lpGuid: GUID指针
// pszDevicePath: 设备路径指针的指针
// 返回: 成功得到的设备路径个数,可能不止1个
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
HDEVINFO hDevInfoSet;
SP_DEVICE_INTERFACE_DATA ifdata;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
BOOL bResult;
// 取得一个该GUID相关的设备信息集句柄
hDevInfoSet = ::SetupDiGetClassDevs(lpGuid, // class GUID
NULL, // 无关键字
NULL, // 不指定父窗口句柄
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备
// 失败...
if (hDevInfoSet == INVALID_HANDLE_VALUE)
{
return 0;
}
// 申请设备接口数据空间
pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bResult = TRUE;
// 设备序号=0,1,2... 逐一测试设备接口,到失败为止
while (bResult)
{
ifdata.cbSize = sizeof(ifdata);
// 枚举符合该GUID的设备接口
bResult = ::SetupDiEnumDeviceInterfaces(
hDevInfoSet, // 设备信息集句柄
NULL, // 不需额外的设备描述
lpGuid, // GUID
(ULONG)nCount, // 设备信息集里的设备序号
&ifdata); // 设备接口信息
if (bResult)
{
// 取得该设备接口的细节(设备路径)
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfoSet, // 设备信息集句柄
&ifdata, // 设备接口信息
pDetail, // 设备接口细节(设备路径)
INTERFACE_DETAIL_SIZE, // 输出缓冲区大小
NULL, // 不需计算输出缓冲区大小(直接用设定值)
NULL); // 不需额外的设备描述
if (bResult)
{
// 复制设备路径到输出缓冲区
::strcpy(pszDevicePath[nCount], pDetail->DevicePath);
// 调整计数值
nCount++;
}
}
}
// 释放设备接口数据空间
::GlobalFree(pDetail);
// 关闭设备信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
return nCount;
}
HANDLE OpenDevice(char *devName) //逐个打开设备
{
HANDLE hOut;
hOut=CreateFile(devName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hOut==INVALID_HANDLE_VALUE)
{
printf("failed to open %s/n",devName);
}
return hOut;
}
//pszDevicePath是个指向字符串指针的指针
HANDLE * Open_file()
{
int i;
char* szDevicePath[MAX_DEVICE]; // 设备路径
int nDevice=0;
HANDLE hDevice[MAX_DEVICE];
HANDLE * h=new HANDLE[MAX_DEVICE];
// 分配需要的空间
for (i = 0; i < MAX_DEVICE; i++)
{
szDevicePath[i] = new char[256];
}
// 取设备路径
nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath);
printf("%d",nDevice);
// 逐一获取设备信息
for (i = 0; i < nDevice; i++)
{
h[i]=CreateFile(szDevicePath[i],
GENERIC_WRITE | GENERIC_READ,
//FILE_SHARE_WRITE | FILE_SHARE_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (h[i]== INVALID_HANDLE_VALUE) {
printf("Failed to open (%s)", szDevicePath[i]);
} else
{
printf("Opened successfully./n");
}
return h; //返回实例句柄集合
}
/*if (hDevice != INVALID_HANDLE_VALUE)
{
... ... // I/O操作
::CloseHandle(hDevice);
}*/
// 释放空间
/* for (i = 0; i & i {
delete []szDevicePath[i];
}
*/
}
/*
//Q 得到设备路径后,就可以到下一步,用CreateFile打开设备,然后用DeviceIoControl
int MAX_DEVICE = 2;
int i;
char* szDevicePath[8]; // 设备路径
// 分配需要的空间
for (i = 0; i < MAX_DEVICE; i++)
{
szDevicePath[i] = new char[256];
ZeroMemory(szDevicePath[i],256); //szDevicePath[i]置为0
}
// 取设备路径
int nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath);
for (i = 0; i < MAX_DEVICE; i++)
{
MessageBox(szDevicePath[i]);
}
for (i = 0; i < MAX_DEVICE; i++)
{
delete []szDevicePath[i];
}
*/
int main()
{
HANDLE *P=Open_file();
return 0;
}