怎么用CryptoAPI检测一个USB KEY的句柄还是否有效?

Tommy 2006-04-13 05:25:03
我们在应用中,用USB KEY进行SSL通信,但是希望在用户拔出USB KEY的时候可以检测到,从而停止工作。不知有什么方法可以做到这点?
...全文
492 点赞 收藏 5
写回复
5 条回复
Tommy 2006年05月12日
DBT_DEVNODES_CHANGED和找到证书之间确实有延迟。我估计DBT_DEVNODES_CHANGED只是指硬件层就绪了,CryptAPI应该也是在收到这个信号后才去看有没有新的证书,所以在收到DBT_DEVNODES_CHANGED消息时证书还没有就绪。

回复 点赞
ycxw 2006年04月24日
我也没有找到好办法,但你可以这么做
检测到DBT_DEVNODES_CHANGED消息,你调用CryptAquireContext,看看能不能成功,能成功,就是插入,否则就是拔除了
至于延时问题,只有当设备完全准备好了,之后,才会产生DBT_DEVNODES_CHANGED消息,我觉得是这样的
回复 点赞
Tommy 2006年04月17日
谢谢MSDN3000(八门金锁)。
不过要这样做的话,就要找出所用的CryptoAPI的证书与物理设备的对应关系,这恐怕不太好找。

最好是直接用一个CryptoAPI调用来判断EKey还是否可用。换个说法吧,就是想看看一个CryptoAPI的句柄还是否有效。
回复 点赞
Tommy 2006年04月17日
而且这样做也有问题,我用明华的Key试了一下,插入后收到WM_DEVICECHANGE消息时在系统中还找不到对应的证书,可能有个延后的时间。

另外,我收不到DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE两种消息,只有DBT_DEVNODES_CHANGED消息
回复 点赞
MSDN3000 2006年04月15日
转一篇文章,希望有所帮助:


USB设备插入与拔出的响应

2005.11.18

有时候,我们需要检测到USB设备的插入与拔出事件,比如,一个有加密锁的程序,当加密锁拔出时,程序应当给出相应提示,并可能采取退出程序的举措。要达到这个目的,我们可以通过响应WM_DEVICECHANGE消息来达到这个目的,而WPARAM则可以告诉我们USB设备是插入还是拔出的。如果WPARAM为DBT_DEVICEARRIVAL则是插入事件,如果为DBT_DEVICEREMOVECOMPLETE则为删除事件。这两个宏义于头文件Dbt.h中。以下以VC为例做成例子。

1. 在相关cpp文件中加入头文包含:
#include
2. 在相应类中添加函数:
LRESULT CtestUsbChangeDlg::OnDeviceChange(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case DBT_DEVICEARRIVAL: //插入
MessageBox("设备插入!");
break;
case DBT_DEVICEREMOVECOMPLETE: //删除
MessageBox("设备删除!");
break;
}
return LRESULT();
}
3. 添加消息映射:
BEGIN_MESSAGE_MAP(CTestUsbChangeDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_DEVICECHANGE, OnDeviceChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

至此,程序已经可以检测USB设备的插入与拨出操作了。事实上,WM_DEVICECHANGE不只支持USB设备的插入与拔出,其它支持热插拔的设备也应支持,不过,因条件所限,只能测试USB设备的情况。
回复 点赞
发动态
发帖子
硬件/系统
创建于2007-09-28

2260

社区成员

1.7w+

社区内容

VC/MFC 硬件/系统
社区公告
暂无公告