summerfruit
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2013-12-07
  • 粉丝0
  • 关注0
  • 积分395分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
阅读:1057回复:0

USB+MP3,在用SetupDiEnumDeviceInterfaces()时,找不到任何接口。why?

楼主#
更多 发布于:2004-08-17 10:46
各位大哥,小弟现在在windows2000下写一个低层的mp3加USB盘的过滤驱动程序。

我想在应用层,用deviceiocontrol发送自己的控制代码给过滤驱动程序。

但是我不知道硬件的名称,所以我通过GUID来列举所有的接口,用SetupDiGetClassDevs()函数。

但是在调用SetupDiEnumDeviceInterfaces()时,找不到任何接口。
为什么?请教各位大哥!

我的GUID试了2个,一个是下面的usb设备的GUID,还有一个是标准磁盘的GUID,是4D开头的。2个都不行,初步估计是我的代码有问题?
下面是我的代码。

const GUID USBClassGuid = {0x36FC9E60,0xC465,0x11CF,{0x80,0x56,0x44,0x45,0x53,0x54,0x00,0x00}};
int CSniffUSBDlg::GetDevicePath(LPGUID lpGuid, LPTSTR *pszDevicePath)
{
HDEVINFO hDevInfoSet;
    SP_DEVICE_INTERFACE_DATA ifdata;
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
    int nCount,index;
    BOOL bResult;

const int INTERFACE_DETAIL_SIZE=1024;

    // 取得一个该GUID相关的设备信息集句柄
    hDevInfoSet = SetupDiGetClassDevs(lpGuid,     // class GUID
        NULL,                    // 无关键字
        NULL,                    // 不指定父窗口句柄
        DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的设备

    // 失败...
    if (hDevInfoSet == INVALID_HANDLE_VALUE)
    {
        return 0;
    }

    // 申请设备接口数据空间
    pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);

    pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

    nCount = 0;
index=0;
    bResult = TRUE;

    // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
    while (bResult||index<30)
    {
        ifdata.cbSize = sizeof(ifdata);

        // 枚举符合该GUID的设备接口
        bResult = SetupDiEnumDeviceInterfaces(
            hDevInfoSet,     // 设备信息集句柄
            NULL,            // 不需额外的设备描述
            lpGuid,          // GUID
            (ULONG)index,   // 设备信息集里的设备序号
            &ifdata);        // 设备接口信息

        if (bResult)
        {
            // 取得该设备接口的细节(设备路径)
            bResult = SetupDiGetInterfaceDeviceDetail(
                hDevInfoSet,    // 设备信息集句柄
                &ifdata,        // 设备接口信息
                pDetail,        // 设备接口细节(设备路径)
                INTERFACE_DETAIL_SIZE,    // 输出缓冲区大小
                NULL,           // 不需计算输出缓冲区大小(直接用设定值)
                NULL);          // 不需额外的设备描述

            if (bResult)
            {
                // 复制设备路径到输出缓冲区
                strcpy(pszDevicePath[index], pDetail->DevicePath);

                // 调整计数值
                nCount++;
            }

        }
index++;
    }

    // 释放设备接口数据空间
    GlobalFree(pDetail);

    // 关闭设备信息集句柄
    SetupDiDestroyDeviceInfoList(hDevInfoSet);

    return nCount;
}
游客

返回顶部