2965|2

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

怎样判断U盘正在被插入 [复制链接]

我现在HOOK了IofCallDriver.可以得到全部的IRP.那么我怎样才能够通过截获到的IRP判断出U盘插入的动作呢?

最新回复

BOOL CAdminMangerDlg::OnDeviceChange(UINT nEventType, DWORD dwData)////它是一个在ClassWizard中无法添加的消息,叫:OnDeviceChange    {                                                                                       LONG        lResult;         char        szDeviceList[1024];         ULONG        ulLen;         ULONG        ulDeviceNum = 0;         ULONG        ulOffset = 0;         switch( nEventType)         {         case DBT_DEVICEARRIVAL://当一个设备被插入并变得可用时,系统会发送广播事件DBT_DEVICEARRIVAL,                 break;                     case DBT_DEVICEREMOVECOMPLETE://而当一个设备被除去并变得不可用时,系统会发送DBT_DEVICEREMOVECOMPLETE                 break;         case DBT_DEVNODES_CHANGED://定义设备变化                 {                         //枚举设备                         memset(szDeviceList, 0, sizeof(szDeviceList));                         ulLen = sizeof(szDeviceList);  //设备列表长度                         //该函数枚举当前系统上所支持的设备列表. 每一个设备名称之间以'\0'作为分隔符.                         lResult = ZH_ListDevice(DEVICETYPE_UKEY, szDeviceList, &ulLen, 0);                         if(lResult != 0)                         {                                 return TRUE;                         }                         //如果没有设备变化,则直接返回                         if(ulLen == g_ulDeviceListLen                                 && memcmp(szDeviceList, g_szDeviceList, ulLen) == 0)//如果没有设备变化                         {                                 return TRUE;                         }                         ////////////////////////////////////////////////////////////////////                         //有设备变化,执行下面的流程                         ////////////////////////////////////////////////////////////////////                         //关闭已经打开的句柄                         if(g_hDevice != 0)                         {                                 ZH_Disconnect(g_hDevice);//断开与设备的连接                                 g_hDevice = 0;                         }                         g_ulDeviceListLen = ulLen;                         memcpy(g_szDeviceList, szDeviceList, sizeof(szDeviceList));                         //获得设备个数                         while(ulOffset < ulLen)//                 {                                 ulDeviceNum ++;                                 ulOffset += strlen(szDeviceList+ulOffset)+1;                         }                                 g_ulDeviceNum = ulDeviceNum;                         if(g_ulDeviceNum == 1)//如果有唯一设备                         {                                                                                                 lResult = ZH_Connect(szDeviceList, CONNECT_MODE_SHARE, &g_hDevice);                                 if(lResult != 0)                                 {                                         return TRUE;                                 }                                 ///////////////////////////////////////////////////////////////////////////                                 ///////////////////////////////////////////////////////////////////////////                                 lResult = ReadDeviceInfo();                                 if(lResult != 0)                                 {                                         return TRUE;                                 }                                                                 if(m_dlgFormat.m_hWnd != 0)                                 {                                         m_dlgFormat.UpdateDisplay();                                 }                                 ///////////////////////////////////////////////////////////////////////////                         }                         else                         {                                 ///////////////////////////////////////////////////////////////////////////                                 g_ulTotalSector = 0;                                 g_ulSectorsOfHidden = 0;//设定当前容量                                 g_ulSectorsOfCommon = 0;                                 g_ulSectorsOfUtility = 0;                                 g_ulSectorsOfPrivate = 0;                                                                 if(m_dlgFormat.m_hWnd != 0)//format对话框                                 {                                         m_dlgFormat.UpdateDisplay();                                 }                                 ///////////////////////////////////////////////////////////////////////////                         }                 }                 break;         default:                 return TRUE;         }         return TRUE;         // }  详情 回复 发表于 2007-4-20 09:22
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
U盘插入会有系统消息。
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
BOOL CAdminMangerDlg::OnDeviceChange(UINT nEventType, DWORD dwData)//<增加>//它是一个在ClassWizard中无法添加的消息,叫:OnDeviceChange   
{                                                                              
        LONG        lResult;
        char        szDeviceList[1024];
        ULONG        ulLen;
        ULONG        ulDeviceNum = 0;
        ULONG        ulOffset = 0;

        switch( nEventType)
        {
        case DBT_DEVICEARRIVAL://当一个设备被插入并变得可用时,系统会发送广播事件DBT_DEVICEARRIVAL,
                break;            
        case DBT_DEVICEREMOVECOMPLETE://而当一个设备被除去并变得不可用时,系统会发送DBT_DEVICEREMOVECOMPLETE
                break;
        case DBT_DEVNODES_CHANGED://定义设备变化
                {
                        //枚举设备
                        memset(szDeviceList, 0, sizeof(szDeviceList));
                        ulLen = sizeof(szDeviceList);  //设备列表长度
                        //该函数枚举当前系统上所支持的设备列表. 每一个设备名称之间以'\0'作为分隔符.
                        lResult = ZH_ListDevice(DEVICETYPE_UKEY, szDeviceList, &ulLen, 0);
                        if(lResult != 0)
                        {
                                return TRUE;
                        }

                        //如果没有设备变化,则直接返回
                        if(ulLen == g_ulDeviceListLen
                                && memcmp(szDeviceList, g_szDeviceList, ulLen) == 0)//如果没有设备变化
                        {
                                return TRUE;
                        }

                        ////////////////////////////////////////////////////////////////////
                        //有设备变化,执行下面的流程
                        ////////////////////////////////////////////////////////////////////


                        //关闭已经打开的句柄
                        if(g_hDevice != 0)
                        {
                                ZH_Disconnect(g_hDevice);//断开与设备的连接
                                g_hDevice = 0;
                        }

                        g_ulDeviceListLen = ulLen;
                        memcpy(g_szDeviceList, szDeviceList, sizeof(szDeviceList));

                        //获得设备个数
                        while(ulOffset < ulLen)//
                {
                                ulDeviceNum ++;
                                ulOffset += strlen(szDeviceList+ulOffset)+1;
                        }
       
                        g_ulDeviceNum = ulDeviceNum;
                        if(g_ulDeviceNum == 1)//如果有唯一设备
                        {
                                                                                                lResult = ZH_Connect(szDeviceList, CONNECT_MODE_SHARE, &g_hDevice);
                                if(lResult != 0)
                                {
                                        return TRUE;
                                }

                                ///////////////////////////////////////////////////////////////////////////
                                ///////////////////////////////////////////////////////////////////////////
                                lResult = ReadDeviceInfo();
                                if(lResult != 0)
                                {
                                        return TRUE;
                                }
                               
                                if(m_dlgFormat.m_hWnd != 0)
                                {
                                        m_dlgFormat.UpdateDisplay();
                                }
                                ///////////////////////////////////////////////////////////////////////////

                        }
                        else
                        {
                                ///////////////////////////////////////////////////////////////////////////
                                g_ulTotalSector = 0;
                                g_ulSectorsOfHidden = 0;//设定当前容量
                                g_ulSectorsOfCommon = 0;
                                g_ulSectorsOfUtility = 0;
                                g_ulSectorsOfPrivate = 0;
                               
                                if(m_dlgFormat.m_hWnd != 0)//format对话框
                                {
                                        m_dlgFormat.UpdateDisplay();
                                }
                                ///////////////////////////////////////////////////////////////////////////
                        }
                }
                break;
        default:
                return TRUE;
        }

        return TRUE;         //
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表