识别USB端口程序开发感想
2007-07-05 21:30
288 查看
程序功能:识别USB设备插在左边的U口还是右边的U口。
准备工作:1.下载资源:因为这个功能设计到驱动级别的编程(本人才疏学浅,可能对这一点的认识有偏差),所以windows自带的
API中没有实现此功能的函数,需要下载一套新的开发包。大家熟知的是Win_DDK,它里面有我们需要的API,
这个软件XP版的非常不好下,因为微软是收费的,而且用它开发的人少,我记得当初是在某个ftp服务器上
下的。
2.安装Win_DDK,我直接安装在了C://的路径下。然后在VC中设置
Tools->Options->Directories中设置Win_DDK的路径,比如C:/WINDDK/2600/INC/WXP
Project->setting->Link中设置需要的库文件,比如hid.lib setupapi.lib
库文件的路径我没有设置,直接把需要的.lib文件拷到当前路径下了。
识别USB端口函数的调用过程:
void IdentifyUSB::IdenUSB()
{...}{
HANDLE hHCDev;
HANDLE hHubDevice;
BOOL success;
PCHAR deviceName;
ULONG nBytes;
PCHAR rootHubName;
PUSB_NODE_CONNECTION_INFORMATION connectionInfo;
//------打开HCDx端口,得到它的句柄------
hHCDev = CreateFile("//./HCD2", //注意这个形式:/.HCD0。具体原因我就不知道了,呵呵。
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
rootHubName =(char*) GetRootHubName(hHCDev); //例子中现成的函数,直接拿来用了。
deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("//./"));
strcpy(deviceName, "//./");
strcpy(deviceName + sizeof("//./") - 1, rootHubName);
hHubDevice = CreateFile(deviceName, //形式大概是/.USB#ROOT_HUB#4&5f8db32&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) + sizeof(USB_PIPE_INFO) * 30;
connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
connectionInfo->ConnectionIndex = 1; //查找端口1
//------得到端口1的一些参数------
success = DeviceIoControl(hHubDevice, //刚才得到的设备句柄
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
connectionInfo,
nBytes,
connectionInfo,
nBytes,
&nBytes,
NULL);
if (connectionInfo->ConnectionStatus == DeviceConnected) //这里DeviceConnected是头文件中枚举类型
{...}
fb48
{
m_Port = RIGHT_PORT; //连同的是端口1
}
else //查找端口2
{...}{
//------得到端口2的一些参数------
connectionInfo->ConnectionIndex = 2;
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
connectionInfo,
nBytes,
connectionInfo,
nBytes,
&nBytes,
NULL);
if (connectionInfo->ConnectionStatus == DeviceConnected)
{
m_Port = LEFT_PORT;
}
}
CloseHandle(hHubDevice);
CloseHandle(hHCDev);
}
PCHAR IdentifyUSB::GetRootHubName(HANDLE HostController)
{...}{
BOOL success;
ULONG nBytes;
USB_ROOT_HUB_NAME rootHubName;
PUSB_ROOT_HUB_NAME rootHubNameW;
PCHAR rootHubNameA;
rootHubNameW = NULL;
rootHubNameA = NULL;
success = DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
0,
0,
&rootHubName,
sizeof(rootHubName),
&nBytes,
NULL);
if (!success)
{
goto GetRootHubNameError;
}
nBytes = rootHubName.ActualLength;
rootHubNameW =(PUSB_ROOT_HUB_NAME) malloc(nBytes);
if (rootHubNameW == NULL)
{...}{
goto GetRootHubNameError;
}
success = DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
NULL,
0,
rootHubNameW,
nBytes,
&nBytes,
NULL);
if (!success)
{...}{
goto GetRootHubNameError;
}
rootHubNameA = WideStrToMultiStr(rootHubNameW->RootHubName);
free(rootHubNameW);
return rootHubNameA;
GetRootHubNameError:
if (rootHubNameW != NULL)
{...}{
free(rootHubNameW);
rootHubNameW = NULL;
}
return NULL;
}
PCHAR IdentifyUSB::WideStrToMultiStr(PWCHAR WideStr)
{...}{
ULONG nBytes;
PCHAR MultiStr;
nBytes = WideCharToMultiByte(
CP_ACP,
0,
WideStr,
-1,
NULL,
0,
NULL,
NULL);
if (nBytes == 0)
{
return NULL;
}
MultiStr =(PCHAR) malloc(nBytes);
if (MultiStr == NULL)
{...}{
return NULL;
}
nBytes = WideCharToMultiByte(
CP_ACP,
0,
WideStr,
-1,
MultiStr,
nBytes,
NULL,
NULL);
if (nBytes == 0)
{...}{
free(MultiStr);
return NULL;
}
return MultiStr;
}
准备工作:1.下载资源:因为这个功能设计到驱动级别的编程(本人才疏学浅,可能对这一点的认识有偏差),所以windows自带的
API中没有实现此功能的函数,需要下载一套新的开发包。大家熟知的是Win_DDK,它里面有我们需要的API,
这个软件XP版的非常不好下,因为微软是收费的,而且用它开发的人少,我记得当初是在某个ftp服务器上
下的。
2.安装Win_DDK,我直接安装在了C://的路径下。然后在VC中设置
Tools->Options->Directories中设置Win_DDK的路径,比如C:/WINDDK/2600/INC/WXP
Project->setting->Link中设置需要的库文件,比如hid.lib setupapi.lib
库文件的路径我没有设置,直接把需要的.lib文件拷到当前路径下了。
识别USB端口函数的调用过程:
void IdentifyUSB::IdenUSB()
{...}{
HANDLE hHCDev;
HANDLE hHubDevice;
BOOL success;
PCHAR deviceName;
ULONG nBytes;
PCHAR rootHubName;
PUSB_NODE_CONNECTION_INFORMATION connectionInfo;
//------打开HCDx端口,得到它的句柄------
hHCDev = CreateFile("//./HCD2", //注意这个形式:/.HCD0。具体原因我就不知道了,呵呵。
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
rootHubName =(char*) GetRootHubName(hHCDev); //例子中现成的函数,直接拿来用了。
deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("//./"));
strcpy(deviceName, "//./");
strcpy(deviceName + sizeof("//./") - 1, rootHubName);
hHubDevice = CreateFile(deviceName, //形式大概是/.USB#ROOT_HUB#4&5f8db32&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) + sizeof(USB_PIPE_INFO) * 30;
connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
connectionInfo->ConnectionIndex = 1; //查找端口1
//------得到端口1的一些参数------
success = DeviceIoControl(hHubDevice, //刚才得到的设备句柄
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
connectionInfo,
nBytes,
connectionInfo,
nBytes,
&nBytes,
NULL);
if (connectionInfo->ConnectionStatus == DeviceConnected) //这里DeviceConnected是头文件中枚举类型
{...}
fb48
{
m_Port = RIGHT_PORT; //连同的是端口1
}
else //查找端口2
{...}{
//------得到端口2的一些参数------
connectionInfo->ConnectionIndex = 2;
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
connectionInfo,
nBytes,
connectionInfo,
nBytes,
&nBytes,
NULL);
if (connectionInfo->ConnectionStatus == DeviceConnected)
{
m_Port = LEFT_PORT;
}
}
CloseHandle(hHubDevice);
CloseHandle(hHCDev);
}
PCHAR IdentifyUSB::GetRootHubName(HANDLE HostController)
{...}{
BOOL success;
ULONG nBytes;
USB_ROOT_HUB_NAME rootHubName;
PUSB_ROOT_HUB_NAME rootHubNameW;
PCHAR rootHubNameA;
rootHubNameW = NULL;
rootHubNameA = NULL;
success = DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
0,
0,
&rootHubName,
sizeof(rootHubName),
&nBytes,
NULL);
if (!success)
{
goto GetRootHubNameError;
}
nBytes = rootHubName.ActualLength;
rootHubNameW =(PUSB_ROOT_HUB_NAME) malloc(nBytes);
if (rootHubNameW == NULL)
{...}{
goto GetRootHubNameError;
}
success = DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
NULL,
0,
rootHubNameW,
nBytes,
&nBytes,
NULL);
if (!success)
{...}{
goto GetRootHubNameError;
}
rootHubNameA = WideStrToMultiStr(rootHubNameW->RootHubName);
free(rootHubNameW);
return rootHubNameA;
GetRootHubNameError:
if (rootHubNameW != NULL)
{...}{
free(rootHubNameW);
rootHubNameW = NULL;
}
return NULL;
}
PCHAR IdentifyUSB::WideStrToMultiStr(PWCHAR WideStr)
{...}{
ULONG nBytes;
PCHAR MultiStr;
nBytes = WideCharToMultiByte(
CP_ACP,
0,
WideStr,
-1,
NULL,
0,
NULL,
NULL);
if (nBytes == 0)
{
return NULL;
}
MultiStr =(PCHAR) malloc(nBytes);
if (MultiStr == NULL)
{...}{
return NULL;
}
nBytes = WideCharToMultiByte(
CP_ACP,
0,
WideStr,
-1,
MultiStr,
nBytes,
NULL,
NULL);
if (nBytes == 0)
{...}{
free(MultiStr);
return NULL;
}
return MultiStr;
}
相关文章推荐
- Discuz!X论坛开发(二)二次开发 教你识别程序目录和文件列表for discuzx!1--NO.1
- 对Ansible二次开发来检查服务器的Java程序占用端口数量
- asp.net开发wap程序必备:识别来访手机品牌型号
- asp.net开发wap程序必备:识别来访手机品牌型号 选择自 Qqwwee_Com 的 Blog
- asp.net开发wap程序必备:识别来访手机品牌型号
- 没有数据线,Wifi也能连接Android真机开发调试!彻底解决“无法识别的USB设备”等数据线连接问题!
- USB驱动安装程序-开发过程
- Mac OS X 下开发 Android 程序时使用 USB 连真机调试
- C++开发人脸性别识别教程(10)——加入图片的人脸检測程序
- asp.net开发wap程序必备:识别来访手机品牌型号
- Discuz!X论坛开发(三)二次开发 教你识别程序目录和文件列表for discuzx!1--NO.2
- 小米2 usb电脑无法识别或者Android开发工具eclipse不能识别
- 3.11 基于OHCI的USB主机开发 —— OHCI(控制端口读数据)
- ASP.NET开发WAP程序必备:识别来访手机品牌型号
- USB--平台搭建--1--vc 6.0中开发驱动设备程序配置
- 微信小程序:nodejs+百度语音识别开发实践
- asp.net开发wap程序必备:识别来访手机品牌型号
- 【小程序开发】VSCode-:识别wxml,wxss文件为html,css格式
- 用Pulsar Eclipse开发的HelloJava程序在MOTO手机上无法运行 另:MOTODEV不识别我的E6