请指点编程识别U盘特征的思路,有源码更好

theseraph 2008-12-08 09:24:11
如何编程识别U盘的唯一特征身份呢,不限方法,得要对每种U盘都适用,针对特定芯片的方法作为参考,如果提供的类型比较全,也可以得全分(但想全不太容易吧),或者没有完美方法的话,可以在散分的时候多得点。
但反对上来不思考、不搜索资料就说接分,这样都抱着接分心理,问题就不容易解决了。给分还可能考虑给,不会多。
也不要上来,不经过调查就说不现实,因为U盘,无论哪个厂商出品,都该给个特征识别方法(通用也好、厂用也好),都什么年头了,生产瓶汽水可乐都加条形码呢,更何况电子产品乎?然否?
别说我偷懒啊,也搜索了一下,净是些使用上的识别,而不是编程识别U盘特征。如果可以建立不可见的(如果谁说加系统S和隐藏H属性的,赶紧出去)更主要得是不可复制的特殊特征文件(例如人为创建坏道等,但都是老方式,会不会因为修复而改变也难以保证)也可考虑,就是想为软件实现一个U盘身份识别的功能,对U盘,不对主机。我用过电子KEY盘,那是专门加工的一种,不想再用它,就是让用户在U盘上运行软件,限定只在该U盘上运行,用户有一定常识,普通方法都不行。
由于这个问题不限定编程语言,得各版块都发一下,因此现在给分不能太多。如果回答的资料好,可以开专帖追加分数,本人信用情况,从论坛功能也看得出来还算可以吧。其实主要的,也是高手们出来晾一晾。
编程语言最好是VB,如果是DELPHI,C,也可以。
...全文
113 点赞 收藏 2
写回复
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiww03 2008-12-09
你说了那么多都不知道是不是你想要的,我先抛砖引玉一下,不好,windows下先检测有没有usb类型设备插入,在判断选择盘的类型,如果楼主找到什么更好的方法,贴出来分享下啊

static const GUID GUID_DEVINTERFACE = { 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED }; // usb设备guid

// 注册监听消息(只监听USB设备变化)
HDEVNOTIFY hDevNotify;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( ¬ificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE;//指定要检测的设备的guid,这里是usb设备的
hDevNotify = RegisterDeviceNotification(hWnd, ¬ificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE)//注册设备通知窗口,
if( !hDevNotify ) {
return NULL;
}

///消息处理
// 只截取WM_DEVICECHANGE消息
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
case WM_DEVICECHANGE:
OnMyDeviceChange(wParam, lParam);//处理usb设备改变的消息
break;
default:
break;
return DefWindowProc(hWnd, message, wParam, lParam);
}
LRESULT OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam ) {//设备插入或移除
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
switch( pHdr->dbch_devicetype ) {
case DBT_DEVTYP_DEVICEINTERFACE:
pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
UpdateDevice(pDevInf, wParam);//后面根据pDevInf进一步判断,这还要自己实现
break;
}
}
return 0;
}
//具体的pDevInf格式
// pDevInf->dbcc_name: \\?\USB#Vid_04e8&Pid_503b#0002F9A9828E0F06#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
// szDevId: USB\Vid_04e8&Pid_503b\0002F9A9828E0F06
// szClass: USB
//UpdateDevice函数中DBT_DEVICEARRIVAL==wParam,插入设备,否则移出
//设备插入并且UINT type = GetDriveType(dir);
if (DRIVE_REMOVABLE == type)//选了可移动硬盘,一般就是u盘,做事...
{}
回复
ma100 2008-12-08
普通U盘没有唯一的序列号,像网银的U盾什么的可能有
可乐瓶子条码都是一样的
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告