检测USB和SD卡存储设备的接入和移除

方法一:依赖窗口

方法二:从注册表入手

 

 

方法一:

 

 

由于USB存储设备和SD卡都是存储设备,

     当设备接入的时候枚举注册表路径"HKEY_LOCAL_MACHINE//Drivers//Active"下的子键,根据 p->dbcp_name;查找自检中与此值匹配的项,查找该项的键项"Key"的值是否包含"Drivers//USB//ClientDrivers//Mass_Storage_Class"字段,如果包含则加入了USB存储设备,若包含带有SD的字段,则加入了SD卡设备

 但是当设备移除的时候从注册表里已经找不到这些信息,唯一可行的就是要存储注册表项的内容,显得比较麻烦,而且非得依赖窗口才能实现,在写DLL的时候出现了一些问题,所以寻找下一种方法。

 

 

方法二:

 

思路:

 1.枚举注册表路径"HKEY_LOCAL_MACHINE//Drivers//Active"下的子键, 

     若该键的键项"Key"的值包含"Drivers//USB//ClientDrivers//Mass_Storage_Class",表示该设备为USB设备;

     若该键的键项"Key"的值包含"Drivers//SDCARD//ClientDrivers//Class",表示该设备为SD卡设备;

     规定,若未SD卡设备value = 1;若未USB存储设备value = 0.

  2.枚举的时候采用从head插入,读取的时候从链表头开始读,读到某一项其键项"Key"的值既不代表USB存储设备也不代表SD卡设备的时候停止。

     存储求得的和sum;

     old_itemNameList = EnumActiveDir();

     old_sum = Count(old_itemNameList);

  3.监控注册表项"HKEY_LOCAL_MACHINE,TEXT//Drivers//Active",此项发生变化说明有设备接入或者移除,当变化的时候重新枚举并比较变化前后的结构体 

     cur_itemNameList = EnumActiveDir();  //PREG_ITEM_NAME  EnumActiveDir()

     compare(old_itemNameList, cur_itemNameList);//比较主要是查看两个结构体子项的数目,如果old比cur大,说明有设备移除,反之有设备添加。

     根据old和cur的差值来判断是哪种类型的设备接入或者移除。

 

 

EnumActiveDir函数实现如下:

typedef  struct   __REG_ITEM_NAME
{
    int num;//编号
    char szItemName[MAX_PATH];//键值内容
     __REG_ITEM_NAME *pNext;
} REG_ITEM_NAME, *PREG_ITEM_NAME;
PREG_ITEM_NAME  EnumActiveDir();
#define REGITEMLEN sizeof(struct __REG_ITEM_NAME)

PREG_ITEM_NAME  EnumActiveDir()
{
    PREG_ITEM_NAME p,last,head;
    HKEY hKey;
    LONG lResult ;
    TCHAR szKeyName[64] ;
    if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("Drivers//Active"),0,0,&hKey))
    {
        int count=0;
        head=last=NULL;
        p = (PREG_ITEM_NAME)malloc(REGITEMLEN);
        do
        {
            DWORD dwKeynameLength = MAX_PATH;
            lResult = RegEnumKeyEx(hKey,count,szKeyName,&dwKeynameLength,0,NULL,NULL,NULL);
            if(lResult != ERROR_SUCCESS)
            {
                break;
            }
            p->num = count;
            strcpy(p->szItemName, wide2short(szKeyName));
            p->pNext=NULL;
            ++count;
            if(count == 1)
                head=p;
            else
                last->pNext=p;
            last=p;
            p = (PREG_ITEM_NAME)malloc(REGITEMLEN);
        } while (lResult != ERROR_NO_MORE_ITEMS);
        RegCloseKey(hKey);
        free(p);
        return head;
    }
    return NULL;
}


compare函数实现如下:

void compare(PREG_ITEM_NAME old_itemNameStruct, PREG_ITEM_NAME cur_itemNameStruct)
{
    PREG_ITEM_NAME old_struct = old_itemNameStruct;
    PREG_ITEM_NAME cur_struct = cur_itemNameStruct;
    int old_count = 0;
    int cur_count = 0;
    while(old_struct)
    {
        old_count++;
        old_struct = old_struct->pNext;
    }
    while(cur_struct)
    {
        cur_count++;
        cur_struct = cur_struct->pNext;
    }
    //还原指针指向
    cur_struct = cur_itemNameStruct;
    old_struct = old_itemNameStruct;
    if((old_count>cur_count) && (old_count-cur_count == 1))//有设备移除
    {
        //取old的最上面一个
        new_sum = Count(cur_struct);
        if(new_sum == old_sum)
            AfxMessageBox(L"USB设备移除");
        else if(old_sum-new_sum == 1 )
            AfxMessageBox(L"SD卡移除");
    }
    if((cur_count>old_count) && (cur_count-old_count == 1))//有新设备添加
    {
        new_sum = Count(cur_struct);
        if(new_sum == old_sum)
            AfxMessageBox(L"接入USB设备");
        else if(new_sum-old_sum == 1 )
            AfxMessageBox(L"接入SD卡");
    }
    old_itemNameList = cur_itemNameList;
    old_sum = new_sum;
}



本产品适用于于单位内部对自身的计算机设备的保密情况以及计算机违规使用情况进行自查。它主要包括以下几部分功能: ■ 系统运行痕迹:该功能主要查看电脑使用和程序运行情况,可以准备获取最近的电脑开关机时间、运行过的程序。 ■ 电脑外联痕迹:该功能主要查看电脑远程登录或者网络连接情况,主要获取网上邻居访问痕迹、远程终端登录痕迹、ADSL拨号连接情况以及无线网络连接情况。 ■ 上网行为痕迹:上网痕迹包括了系统中由于访问互联网而留下的各种痕迹。这里列出的痕迹是系统内的未清理过的,或者未完全清理干净的一些痕迹。 ■ URL 缓存痕迹:分为快速和深度两种检查方法,快速为直接读取IE浏览器缓存文件,深度检查从磁盘级搜索上网痕迹,基于数据特征和数据恢复技术,可以搜出被清除过或者重装过系统的电脑的上网痕迹。 ■ 文档处理痕迹:这里主要描述当前和最近一段时间计算机上处理和访问的文档的名称。可通过名称查看是否有违规现象。 ■ USB 设备管理:该功能列举出了所有在该计算机上曾经使用过的USB存储设备的名称、型号及日期等信息。 ■ 文件内容检索:可以搜索微软office,金山office,PDF等办公文档内容,检索是否有违规关键字文件存在。 ■ 删除文件检索:可以搜索磁盘中已删除的文件,文件夹,可通过名称查看是否有违规现象。 多种痕迹取证,三种深度检查,涉密文档检索
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值