专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 驱动开发

根据优盘的VID能不能允许或禁止优盘的使用解决方法

发布时间:2010-06-14 17:45:27 文章来源:www.iduyao.cn 采编人员:星星草
根据优盘的VID能不能允许或禁止优盘的使用
最近被要求写个内核驱动毫无头绪呀,大家能不能给个类似的代码参考学习下或是提供链接,怎么根据优盘的厂商ID允许或禁止此优盘的使用(比如首先规定了某些厂商ID的可通行),禁止的话就自动弹出。 同时还要 记录下 此优盘的使用记录 。用的C++编写。  

希望大家能给予帮助。

------解决方案--------------------
C/C++ code
获取PID,UID,序列号信息

int CUSBPortDlg::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
    HDEVINFO hDevInfoSet;    //设备信息集句柄;
    SP_DEVICE_INTERFACE_DATA ifdata;
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
    int nCount;
    BOOL bResult;
 LPGUID UsbClassGuid;
 CHANGER_PRODUCT_DATA ProductBuffer;
 unsigned long BytesReturned;
 
 UsbClassGuid = (LPGUID)malloc(sizeof(GUID));
 UsbClassGuid->Data1 = 0xa5dcbf10L;
 UsbClassGuid->Data2 = 0x6530;
 UsbClassGuid->Data3 = 0x11d2;
 UsbClassGuid->Data4[0] = 0x90;
 UsbClassGuid->Data4[1] = 0x1F;
 UsbClassGuid->Data4[2] = 0x00;
 UsbClassGuid->Data4[3] = 0xC0;
 UsbClassGuid->Data4[4] = 0x4F;
 UsbClassGuid->Data4[5] = 0xB9;
 UsbClassGuid->Data4[6] = 0x51;
 UsbClassGuid->Data4[7] = 0xED;

    // 取得一个该GUID相关的设备信息集句柄
    hDevInfoSet = SetupDiGetClassDevs(UsbClassGuid,     // 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;
    bResult = TRUE;
 
    // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
    while (bResult)
    {
        ifdata.cbSize = sizeof(ifdata);
  
        // 枚举符合该GUID的设备接口
        bResult = ::SetupDiEnumDeviceInterfaces(
            hDevInfoSet,     // 设备信息集句柄
            NULL,            // 不需额外的设备描述
            UsbClassGuid,          // GUID
            (ULONG)nCount,   // 设备信息集里的设备序号
            &ifdata);        // 设备接口信息
  
        if (bResult)
        {
            // 取得该设备接口的细节(设备路径)
            bResult = SetupDiGetInterfaceDeviceDetail(
                hDevInfoSet,    // 设备信息集句柄
                &ifdata,        // 设备接口信息
                pDetail,        // 设备接口细节(设备路径)
                INTERFACE_DETAIL_SIZE,   // 输出缓冲区大小
                NULL,           // 不需计算输出缓冲区大小(直接用设定值)
                NULL);          // 不需额外的设备描述
            if (bResult)
            {
                // 复制设备路径到输出缓冲区
                ::strcpy(pszDevicePath[nCount], pDetail->DevicePath);
    // 调整计数值
                nCount++;
            }
        }
    }
    // 释放设备接口数据空间
    ::GlobalFree(pDetail);
    // 关闭设备信息集句柄
    ::SetupDiDestroyDeviceInfoList(hDevInfoSet);
    return nCount;
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: