…..
PUSB_NODE_CONNECTION_INFORMATION_EX pNodeConnInfoEx;
For( int I = 0; I <= NumPorts; I ++ )
{
dwBytes = sizeof(USB_NODE_CONNECTION_INFORMATION_EX) + sizeof(USB_PIPE_INFO) * 32;
pNodeConnInfoEx = (PUSB_NODE_CONNECTION_INFORMATION_EX)malloc( dwBytes );
if
( pNodeConnInfoEx )
{
Memset( pNodeConnInfoEx,0,dwBytes );
//
这里是输入参数,指定要查高询哪一个端口的连接信息,从1开始
pNodeConnInfoEx->ConnectionIndex = I;
DeviceIoControl( hHubHandle,IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,pNodeConnInfoEx,dwBytes,pNodeConnInfoEx,dwBytes,&dwBytes,NULL );
//
这个端口有挂接设备
If( pNodeConnInfo->ConnectionStatus == DeviceConnected )
{
//
这个设备有这三个主要信息
If( pNodeConnInfo->DeviceDescriptor.idVendor &&
pNodeConnInfo->DeviceDescriptor.idProduct &&
pNodeConnInfo->DeviceDescriptor.iSerialNumber )
{
//
获取这个设备的字符串描述(IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION)
PUSB_DESCRIPTOR_REQUEST stringDescReq;
//
这里输入参数结构,需要填充
PUSB_STRING_DESCRIPTOR stringDesc;
PSTRING_DESCRIPTOR_NODE stringDescNode;
nBytes = sizeof(stringDescReqBuf);
stringDescReq = (PUSB_DESCRIPTOR_REQUEST)stringDescReqBuf;
stringDesc = (PUSB_STRING_DESCRIPTOR)(stringDescReq+1);
//
填充输入查询信息参数
memset(stringDescReq, 0, nBytes);
//
连接的端口索引
stringDescReq->ConnectionIndex = ConnectionIndex;
//
这个wValume是一个WORD值,高8位指标查询类型,这里要查询字符串描述,所以是USB_STRING_DESCRIPTOR,低8位指定查询的描述符索引,比如要查询SerialNumber,这个值就是上面获取到的iSerialNumber
stringDescReq->SetupPacket.wValue = (USB_STRING_DESCRIPTOR_TYPE << 8)
| DescriptorIndex;
//
语言ID,置为0即可
stringDescReq->SetupPacket.wIndex = LanguageID;
//
指示整个输出缓冲的大小,用总大小nBytes减去查询结构大小,
stringDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));
if
( DeviceIoControl(hHubDevice,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,stringDescReq,nBytes,stringDescReq,nBytes,&nBytesReturned,NULL);
{
//
获取到的是UNICODE字符串
TCHAR* pSerialNumberString = (TCHAR*)malloc( stringDesc->bLength / sizeof(WCHAR) + 1 );
//
获取iSErialNumber在字符串描述中的偏移,stringDesc->bString + descChars就是SerialNumber的UNICODE字符串了
int descChars = ( (int)stringDesc->bLength - offsetof(USB_STRING_DESCRIPTOR,bString)) / sizeof(WCHAR);
if
(pSerialNumberString)
{
//
转为ansi字符串
stringDesc->bString[descChars] = 0;
WCharToMByte( stringDesc->bString, pSerialNumberString,stringDesc->bLength / sizeof(WCHAR) + 1 );
//
现在有了这三个信息就可以匹配可移动磁盘了
//
pNodeConnInfo->DeviceDescriptor.idVendor
//
pNodeConnInfo->DeviceDescriptor.idProduct
//
pSerialNumberString
……
}
}
}
}
…..