当前位置: 代码迷 >> 驱动开发 >> 怎样判断U盘正在被插入,该如何处理
  详细解决方案

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

热度:40   发布时间:2016-04-28 11:12:05.0
怎样判断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; //
}
  相关解决方案