williamhe
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2010-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3147回复:6

如何获得USB设备的PID、VID?

楼主#
更多 发布于:2004-07-30 15:29
请教各位,我应该怎么样获得USB设备的PID、VID?谢谢!
williamhe
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2010-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-03 18:23
非常感谢楼上的兄弟!

我想问,你的程序是基于WDM写的吧?只是我现在的程序是用纯C写的,可能很多API不能调用。

我的程序是这样子的:
有一支用纯C(VC 6.0环境)写的设备驱动程序Driver DLL,在Driver DLL上实现了诸如 OpenDevice(int PID, int VID)等函数,我现在需要用Delphi 7.0写一个测试程序,这个测试程序调用Driver DLL中的导出函数OpenDevice(int PID, int VID)以检验这个OpenDevice是不是能像预期一样完成指定功能,并把设备的状态信息回传到测试程序中显示。那么在测试程序中调用OpenDevice时,我肯定要给参数PID、VID赋值,请问我应该怎么样获得这PID、VID的值呢?

感谢大家告诉我!
znzn2001
驱动牛犊
驱动牛犊
  • 注册日期2003-02-26
  • 最后登录2004-11-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-03 13:50
void CGetUDiskDriverDlg::SearchUDISK()
{
int nCount, len;//标记同一设备个数
HDEVINFO hDevInfoSet;
BOOL bResult;
char * devicename;
char volume[MAX_PATH];
char ch[100];

memset(volume, 0, MAX_PATH);

    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL;
  
    // 取得一个该GUID相关的设备信息集句柄
    hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE,     // class GUID
        NULL,                    // 无关键字
        NULL,                    // 不指定父窗口句柄
        DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的设备
        
    // 失败...
    if (hDevInfoSet == INVALID_HANDLE_VALUE)
    {
        return;
    }
  
    // 申请设备接口数据空间
    
    nCount = 0;
    bResult = TRUE;
  
SP_DEVICE_INTERFACE_DATA ifdata;
    // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
    while (bResult)
    {

        ifdata.cbSize = sizeof(ifdata);
        // 枚举符合该GUID的设备接口
        bResult = ::SetupDiEnumDeviceInterfaces(
            hDevInfoSet,     // 设备信息集句柄
            NULL,            // 不需额外的设备描述
            (LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE,          // GUID
            (ULONG)nCount,   // 设备信息集里的设备序号
            &ifdata);        // 设备接口信息
  
        if (bResult)
        {
ULONG                                predictedLength = 0;
ULONG                                requiredLength = 0;
// 取得该设备接口的细节(设备路径)
            bResult = SetupDiGetInterfaceDeviceDetail(
                hDevInfoSet,    // 设备信息集句柄
                &ifdata,        // 设备接口信息
                NULL,        // 设备接口细节(设备路径)
                0,    // 输出缓冲区大小
                &requiredLength,           // 不需计算输出缓冲区大小(直接用设定值)
                NULL);          // 不需额外的设备描述
            // 取得该设备接口的细节(设备路径)
predictedLength=requiredLength;

// if(pDetail)
// {
// pDetail =NULL;
// }
            pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength);
            pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bResult = SetupDiGetInterfaceDeviceDetail(
                hDevInfoSet,    // 设备信息集句柄
                &ifdata,        // 设备接口信息
                pDetail,        // 设备接口细节(设备路径)
                predictedLength,    // 输出缓冲区大小
                &requiredLength,           // 不需计算输出缓冲区大小(直接用设定值)
                NULL);          // 不需额外的设备描述
  
            if (bResult)
            {
                // 复制设备路径到输出缓冲区
for(int i=0;i<17;i++){
ch=*(pDetail->DevicePath+8+i);
}
ch[17]='\0';
if (strcmp(ch,"vid_11dd&pid_0101")==0 ||
strcmp(ch,"vid_11dd&pid_11dd")==0 ||
strcmp(ch,"vid_0101&pid_0101")==0 ||
strcmp(ch,"vid_0101&pid_11dd")==0) //比较版本号,防止意外出错
{
len = strlen(pDetail->DevicePath);
devicename = new char[len];
memset(devicename, 0, len);
for(int i=0;i<(len-38);i++)
{
ch=*(pDetail->DevicePath+i);
}
ch[len-38]='\0';
memset(volume, 0, MAX_PATH);
}
}
}
nCount++;
}
   // 释放设备接口数据空间
    ::GlobalFree(pDetail);
  
    // 关闭设备信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
}
张南
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-31 20:25
我认为,VID、PID均是在系统加载设备驱动时使用的(通过.inf文件中的VID与PID与设备匹配来确定使用哪个驱动程序驱动设备),而在应用程序中却不是用它。
应用程序使用GUID或设备名来访问设备。
新手上路,请多关照.
williamhe
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2010-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-31 15:56
比如说我现在要在主程式中(exe)调用dll程式中的一支函数,dll中的函数名是OpenDriver(int pid, int vid),我需要在主程式中把pid、vid参数传到DLL中,那么在主程式中我怎么样去获得这些参数呢?如果机器上的设备很多,比如有ps/2、com、usb,且usb口有多个,那么我怎么去获得我想要打开设备的参数,又怎么去打开呢?

谢谢大家,希望得到大家的帮助!谢谢!
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-30 21:20
Bus Hound
USBVeiw
USBCheck
都可以!!!
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-30 17:45
UsbView就可看到
新手上路,请多关照.
游客

返回顶部