关于访问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;
}
...全文
484 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

2,644

社区成员

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

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