当前位置: 代码迷 >> 驱动开发 >> 根据优盘的VID能不能允许或禁止优盘的使用解决方法
  详细解决方案

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

热度:416   发布时间:2016-04-28 11:23:37.0
根据优盘的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;}
  相关解决方案