关于访问usb设备问题mass storage方式
以下代码在windows xp 管理员下可以正常使用,但到非管理员下或者vista系统下,运行到hDevUSB = CreateFile(
devInterfaceDetailData->DevicePath,//
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,//FILE_ATTRIBUTE_NORMAL
NULL);
时总是返回错误码5,hDevUSB创建失败,好象是因为非管理员对usb的操作权限不够,请问这个问题怎么解决,是有其他方法提升权限还是用其他方法访问呢?排除HID方式,因为传输量太小。谢谢!
const GUID DiskClassGuid = {0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b}};
int GetDevicePath(LPGUID Guid, LPTSTR *pszDevicePath)
{
HDEVINFO hIntDevInfo;
SP_DEVICE_INTERFACE_DETAIL_DATA* devInterfaceDetailData = NULL;
hIntDevInfo = SetupDiGetClassDevs(
Guid,
NULL,
NULL,
(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)
);
if(hIntDevInfo == INVALID_HANDLE_VALUE)
{
// MessageBox("打开磁盘驱动器句柄失败!");
return 0;
}
BOOL bSuccess;
DWORD index = 0;
SP_DEVICE_INTERFACE_DATA devInterfaceData;//存储设备接口信息
memset( &devInterfaceData, 0, sizeof(SP_DEVICE_INTERFACE_DATA) );
devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
DWORD *pdwTokenCnt = 0;
while(TRUE)
{
bSuccess = SetupDiEnumDeviceInterfaces(
hIntDevInfo,
NULL,
Guid,
index,
&devInterfaceData);
if(!bSuccess)
{
break;
}
else
{
ULONG requiredLength = 0;
ULONG predictedLength = 0;
//获取输出缓冲区大小
bSuccess = SetupDiGetInterfaceDeviceDetail(
hIntDevInfo, // 设备信息集句柄
&devInterfaceData, // 设备接口信息
NULL, // 设备接口细节(设备路径)
0, // 输出缓冲区大小
&requiredLength, // 计算输出缓冲区大小
NULL); // 不需额外的设备描述
predictedLength = requiredLength;
devInterfaceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength);
devInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// 取得该设备接口的细节(设备路径)
bSuccess = SetupDiGetInterfaceDeviceDetail(
hIntDevInfo,
&devInterfaceData,
devInterfaceDetailData,
predictedLength,
&requiredLength,
NULL);
if ( bSuccess == FALSE && GetLastError()!=ERROR_INSUFFICIENT_BUFFER)
{
return 0;
}
else
{
// 复制设备路径到输出缓冲区
::strcpy(pszDevicePath[index], devInterfaceDetailData->DevicePath);
HANDLE hDevUSB;
hDevUSB = CreateFile(
devInterfaceDetailData->DevicePath,//&guidHID_1,//
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,//FILE_ATTRIBUTE_NORMAL
NULL);
if ((NULL != hDevUSB) && (INVALID_HANDLE_VALUE != hDevUSB))
{
}
else
{
MessageBox(NULL,"打开文件失败!","提示", NULL);
}
// 调整计数值
index++;
}
}
}
GlobalFree(devInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hIntDevInfo);
return index;
}