打开MASS STORAGE DEVICE 设备时遇到的问题(SetupDiGetInterfaceDeviceDetail)

wangbin0829 2010-11-17 10:19:43
小弟前一段时间用DeviceIOControl成功对U盘就行操作,因为U盘有盘符,所以句柄很容易得要
但是要是针对没有盘符的USB设备,就不能这样做了
于是,按照网上的帖子说的:调用DDK里的调用SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces,SetupDiGetDeviceInterfaceDetail三个函数,目的是访问MASS STORAGE DEVICE 设备,还是用U盘做测试,
问题出现了:SetupDiGetDeviceInterfaceDetail这个函数返回lGetLastError 122,都一整天了,小弟一筹莫展!
其中在注册表里找到的U盘的GUID,并且用到了一下HID的库文件和头文件,比如:setapi.h,setupapi.lib等等
小弟想知道这样做对吗?迷茫了
小弟的目的是用CreatFile 和DeviceIOControl对没有盘符的USB设备进行操作
请大侠指点一下,谢谢
...全文
924 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2010-11-20
  • 打赏
  • 举报
回复
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\DeviceClasses

应该从类似这样的位置读。
用户 昵称 2010-11-20
  • 打赏
  • 举报
回复
你的guid使用的应该不对,
wangbin0829 2010-11-20
  • 打赏
  • 举报
回复
DEFINE_GUID(pGuid,0xa5dcbf10, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);
HANDLE OpenMyHIDDevice(int overlapped)
{
HANDLE hidHandle;
HDEVINFO hDevInfo = SetupDiGetClassDevs((LPGUID)&pGuid, NULL, NULL, (DIGCF_PRESENT | DIGCF_INTERFACEDEVICE));//hidGuid
if (hDevInfo == INVALID_HANDLE_VALUE)
{
return INVALID_HANDLE_VALUE;
}
SP_DEVICE_INTERFACE_DATA devInfoData;
memset(&devInfoData,0,sizeof(SP_DEVICE_INTERFACE_DATA));
devInfoData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);
int deviceNo = 0;
SetLastError(NO_ERROR);
while (GetLastError() != ERROR_NO_MORE_ITEMS)
{

for(deviceNo = 0;SetupDiEnumInterfaceDevice(hDevInfo,0,(LPGUID)&pGuid,deviceNo,&devInfoData);++deviceNo)
{
DWORD strSize = 0,requiredLength = 0;
int DRET = SetupDiGetInterfaceDeviceDetail(hDevInfo,&devInfoData,NULL, 0, &strSize, NULL);
if(DRET == 0)
{
DWORD dret = GetLastError();
}
requiredLength = strSize;
PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(requiredLength);
devDetail->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);
SP_DEVINFO_DATA did ;
did.cbSize = sizeof(SP_DEVINFO_DATA);
SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInfoData, devDetail, strSize, &requiredLength, &did);
TCHAR fname[256];
DWORD rreT = SetupDiGetDeviceRegistryProperty(hDevInfo,&did,SPDRP_FRIENDLYNAME,NULL,(PBYTE) fname,sizeof(fname),NULL);
if(rreT == 0)
{
DWORD dret = GetLastError();
}
DWORD rret = SetupDiGetDeviceRegistryProperty(hDevInfo,&did,SPDRP_DEVICEDESC,NULL,(PBYTE) fname,sizeof(fname),NULL);
if(rret == 0)
{
DWORD dret = GetLastError();
}
if ((!rreT) && (!rret))
{
_tcsncpy(fname, devDetail->DevicePath, 256);

}

if(overlapped)
{
hidHandle = CreateFile(devDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
}
else
{
hidHandle = CreateFile(devDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hidHandle == 0)
{
DWORD dreT = GetLastError();
}
return hidHandle;
free(devDetail);
if (hidHandle==INVALID_HANDLE_VALUE)
{
SetupDiDestroyDeviceInfoList(hDevInfo);
return INVALID_HANDLE_VALUE;
}
_HIDD_ATTRIBUTES hidAttributes;
if(!HidD_GetAttributes(hidHandle, &hidAttributes))
{
CloseHandle(hidHandle);
SetupDiDestroyDeviceInfoList(hDevInfo);
return INVALID_HANDLE_VALUE;
}
if (USB_VID == hidAttributes.VendorID && USB_PID == hidAttributes.ProductID)
{
return hidHandle;
}
}
}


}
SetupDiDestroyDeviceInfoList(hDevInfo);

}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
int k = 0;
TCHAR szBuf[300];
HANDLE hDevice;
BYTE byBuffer[36] ;//存放INQUIRY数据
BYTE bufDataRead[512];//存放容量数据
DWORD dwBufferBytes = sizeof(byBuffer);
DWORD capacity = 0;
int res = 0;
DWORD dwReturned = 0;
DWORD index = 0;
BOOL matched = FALSE;

hDevice = OpenMyHIDDevice(0);


DeviceIOControl 里面的参数配置是没问题的,我配的SCSI_PASS_TTHROUGH
wangbin0829 2010-11-20
  • 打赏
  • 举报
回复
我按照jennyvenus提供的方法,找到了GUID
DEFINE_GUID(pGuid,0xa5dcbf10, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);
发现鼠标和金斯顿的U盘都是用的这个GUID
目前存在两个问题:
DRET = SetupDiGetInterfaceDeviceDetail(hDevInfo,&devInfoData,NULL, 0, &strSize, NULL);执行错误,GetLastError 122
CreatFile长生的句柄的值是0x07b0,但是执行DeviceIOComtrol错误,GetLastError 50
我把代码贴出来哈,大家帮帮忙,鄙视我也行,呵呵
wangbin0829 2010-11-19
  • 打赏
  • 举报
回复
122:传送到系统资料的呼叫区太小 这该怎么搞啊?
wangbin0829 2010-11-19
  • 打赏
  • 举报
回复
deviceiocontrol会用到句柄,句柄是通过CreatFile得到的,使用CreatFile需要设备的路径或者描述符,这需要SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces,SetupDiGetDeviceInterfaceDetail三个函数得到设备路径,问题是:第一次使用SetupDiGetInterfaceDeviceDetail的时候执行错误,GetLastError 122,这应该怎么解决啊?
这样做有问题吗?谢谢
winxpliyou 2010-11-19
  • 打赏
  • 举报
回复
用户 昵称 2010-11-19
  • 打赏
  • 举报
回复
mass 的设备好像要用deviceiocontrol来处理。
fly4free 2010-11-19
  • 打赏
  • 举报
回复
你的详细的相关代码。
wangbin0829 2010-11-19
  • 打赏
  • 举报
回复
上面的问题依然没有解决,但是我回去run程序,发现能把鼠标(我的机器上只有鼠标和U盘这两个USB设备)枚举出来,然后我把鼠标拔下来,再次run程序,就能把U盘枚举出来,然后我再插上鼠标,再次run程序,发现还是只能枚举鼠标,这里面还存在优先级的问题吗?
小弟无限困惑!请大侠指教!我学习一下枚举过程先!
wangbin0829 2010-11-18
  • 打赏
  • 举报
回复
没有盘符的USB设备,其实是个指纹仪,采集数据,但是在“我的电脑”里看不到“I盘、J盘”等等
在设备管理器里看到是MASS STORAGE DEVICE ,就是这个样子
请指点一下
用户 昵称 2010-11-18
  • 打赏
  • 举报
回复
没有盘符的设备,那未必是海量存储设备了,看设备管理器,常见的就是hid的。
fly4free 2010-11-18
  • 打赏
  • 举报
回复
既然如3楼所说,那么可能通信的时候用的指令集(不是CPU的)是存储设备的,而我记得USB存储设备是用
SCSI的(class08_subclass06)……
fly4free 2010-11-18
  • 打赏
  • 举报
回复
我很纳闷,什么样的存储设备是“没有盘符的USB设备”?
如果它不是存储设备,当然不会有盘符了!
wangbin0829 2010-11-18
  • 打赏
  • 举报
回复
36FC9E60L-C465-11CF-8056-444553540000这是在注册表里读出的U盘设备的GUID
然后枚举这种类别的USB设备,然后我想知道如何区别感兴趣的设备呢?这个环节老是过不去,用到SetupDiEnumDeviceInterfaces,
请高手指点!!谢谢

2,640

社区成员

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

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