[大牛救命!!]CreateFile如何打开复合设备?复合设备与单一设备驱动有什么差别?
我有一个USB复合设备,要通过PC对其操作。
该设备原来是单一设备,现在加了一个SD卡的存储部分变成了复合设备。
使用原来的驱动。既xx.sys没变,修改INF文件,在VID&PID后增加了&MI_00(SD卡的大容量存储设备为MI_01)。
驱动安装是成功的。
现在有如下问题:
1.CreateFile如何打开复合设备?
2.是不是驱动问题,需要重写那一部分?
3.还是硬件中嵌入式代码有问题?如果是嵌入式部分有问题,问题会在哪里?嵌入式是另一个同事做的...
4.或者是其他的问题?请大家指点,给点解决这个问题的办法或者思路都可以!我被困了两个星期了!
代码中是我现在发现的现象。
//一开始以为是GUID不对,已经试过很多GUID。
//USB interface class GUID
GUID USB_INTERFACE_GUID ={0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED};
const GUID *pInterfaceGuid = &USB_INTERFACE_GUID;
//现在发现问题可能是设备无法连接。
//参数设置为DIGCF_DEVICEINTERFACE | DIGCF_PRESENT时,就找不到我要的设备。
//但是可以找到父设备,既USB\VID_XXXX&PID_XXXX可以找到,但是USB\VID_XXXX&PID_XXXX&MI_00。
//参数设置为DIGCF_DEVICEINTERFACE时,可以到我要的设备。但是CreateFile打开失败。
//但是在设备管理器中明明可以看到,而且显示正常工作。
HDEVINFO hDevInfo = SetupDiGetClassDevs(pInterfaceGuid, NULL, NULL,
DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
//之后是常规的搜索设备代码。
BYTE buf[1024];
PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buf;
SP_DEVICE_INTERFACE_DATA spdid;
SP_DEVINFO_DATA spdd;
DWORD dwSize;
spdid.cbSize = sizeof(spdid);
// Iterate through all the interfaces and try to match one based on
// the device number.
DWORD i = 0;
while(SetupDiEnumDeviceInterfaces(hDevInfo, NULL, pInterfaceGuid, i, &spdid))
{
i++;
// Get the device path.
dwSize = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL, 0, &dwSize, NULL);
if(dwSize == 0 || dwSize > sizeof(buf))
continue;
pspdidd->cbSize = sizeof(*pspdidd);
ZeroMemory((PVOID)&spdd, sizeof(spdd));
spdd.cbSize = sizeof(spdd);
if(!SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd,
dwSize, &dwSize, &spdd))
continue;
//
CString strDev;
strDev.Format("%s/n",pspdidd->DevicePath);
AfxMessageBox(strDev);
if (-1 == strDev.Find("vid_2010&pid_2005&mi_00"))
continue;
// Open the device.
m_hDev = CreateFile(pspdidd->DevicePath,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(m_hDev == INVALID_HANDLE_VALUE)
{
AfxMessageBox("CreateFile Fail");
return FALSE;
}
else
{
return TRUE;
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
[解决办法]
晕,啥是复合设备?与单一设备的区别是什么?
[解决办法]
1.首先你要确定CreateFile传入的设备名称是正确的。可以用Winobj对照
2.如果设备名称正确的话,那么是驱动的问题比较大。这个时候就要调试驱动了。