首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

怎样判断U盘正在被插入,该如何处理

2012-03-06 
怎样判断U盘正在被插入我现在HOOK了IofCallDriver.可以得到全部的IRP.那么我怎样才能够通过截获到的IRP判

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

[解决办法]
BOOL CAdminMangerDlg::OnDeviceChange(UINT nEventType, DWORD dwData)// <增加> //它是一个在ClassWizard中无法添加的消息,叫:OnDeviceChange
{
LONGlResult;
charszDeviceList[1024];
ULONGulLen;
ULONGulDeviceNum = 0;
ULONGulOffset = 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; //
}

热点排行