关于访问usb设备问题mass storage方式

aaazxd 2009-05-15 09:46:49
以下代码在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;
}
...全文
492 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2009-05-19
  • 打赏
  • 举报
回复
第一是我也不知道是否真的能行,我对那基本上不懂,第二这是我同事的专利,据他说可以。反正windows能够访问mass storage,你就可以编一个指令和windows发的一样,然后呢,让设备去区分是windows发的还是你发的。

aaazxd 2009-05-19
  • 打赏
  • 举报
回复
或者有什么相关资料看看吗?摆脱了
aaazxd 2009-05-19
  • 打赏
  • 举报
回复
jennyvenus,能说具体点么?多给点思路也行啊,谢谢了啊!
aaazxd 2009-05-19
  • 打赏
  • 举报
回复
谢谢,我去试试先
aaazxd 2009-05-18
  • 打赏
  • 举报
回复
没人能解答吗?
用户 昵称 2009-05-18
  • 打赏
  • 举报
回复
非管理员访问scsi,变通一下windows的执行,涉及好多事情,不能多说。
aaazxd 2009-05-18
  • 打赏
  • 举报
回复
可以给你demo啊,怎么给你?
谁能帮我解决我的问题........
lili830209 2009-05-18
  • 打赏
  • 举报
回复
LZ可以把你的USB的通讯的代码给我一个DEMO么?

我理解不了USB设备与主控设备的握手。。。
fleiou2008 2009-05-15
  • 打赏
  • 举报
回复
sf
2024 年 Uber 乘车分析数据集 这个综合数据集包含 2024 年 Uber 运营的详细拼车数据,提供了有关预订模式、车辆性能、收入流、取消行为和客户满意度指标的丰富见解。 数据集概述 该数据集捕获了多种车辆类型的 148,770 个总预订,并提供了拼车作的完整视图,包括成功乘车、取消、客户行为和财务指标。 主要统计数据: 总预订量:148.77K 次乘车 成功率:65.96%(93K 完成骑行) 取消率:25%(37.43K 取消预订) 客户取消:19.15%(27K 乘车) 司机取消: 7.45% (10.5K 乘车) 数据模式 数据集包含以下列: 列名称 描述 Date 预订日期 Time 预订时间 Booking ID 每次行程预订的唯一标识符 Booking Status 预订状态(已完成、客户取消、司机取消等) Customer ID 客户的唯一标识符 Vehicle Type 车辆类型(Go Mini、Go Sedan、Auto、eBike/Bike、UberXL、Premier Sedan) Pickup Location 游乐设施的起点 Drop Location 乘车目的地 Avg VTAT 司机到达上车地点的平均时间(以分钟为单位) Avg CTAT 从取件到目的地的平均行程时间(以分钟为单位) Cancelled Rides by Customer 客户发起的取消标志 Reason for cancelling by Customer 客户取消原因 Cancelled Rides by Driver 驱动程序启动的取消标志 Driver Cancellation Reason 司机取消原因 Incomplete Rides 未完成骑行标志 Incomplete Rides Reason 不完整骑行的原因

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧