2,640
社区成员
发帖
与我相关
我的任务
分享
BOOL IsUsbStorageSetupDi(LPCTSTR drvDeviceName)
{
// drvDeviceName 参数形式如: "\\\\.\\X:"
BOOL bRet = TRUE;
BOOL bDeviceFound = FALSE;
BOOL bFunRet;
//TCHAR szHubDevicePath[MAX_PATH];
TCHAR szHubPath[MAX_PATH];
TCHAR szInstanceID[MAX_DEVICE_ID_LEN];
TCHAR DevIdBuffer[512];
DWORD dwSdn;
DWORD dwRetFuncCode;
DWORD dwRequireSize = 1024 + sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
DWORD dwCurSn;
int nDevIndex = 0;
int strIndex1 = 0;
int strIndex2 = 0;
HDEVINFO hDevInfo = NULL;
SP_DEVICE_INTERFACE_DATA sia;
SP_DEVINFO_DATA da;
PSP_DEVICE_INTERFACE_DETAIL_DATA sddia = NULL;
DEVNODE dnParent;
dwRetFuncCode = GetDeviceNumber(drvDeviceName, &dwSdn);
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_DISK,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );
sia.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
da.cbSize = sizeof(SP_DEVINFO_DATA);
sddia = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc(GPTR, dwRequireSize);
sddia->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
for ( nDevIndex = 0;
SetupDiEnumDeviceInterfaces(hDevInfo, NULL,(LPCGUID)&GUID_DEVINTERFACE_DISK, nDevIndex, &sia);
nDevIndex ++)
{
bFunRet = SetupDiGetDeviceInterfaceDetail(hDevInfo, &sia, sddia, dwRequireSize, &dwRequireSize, &da);
dwRetFuncCode = GetLastError();
//对于那个光盘盘符,DevicePath开头的不是"usb",是"ide..."什么的
//而一般U盘的是"USB\\....."或者"usbstor"??
GetDeviceNumber(sddia->DevicePath, &dwCurSn);
if(dwSdn == dwCurSn) //对于那个光盘盘符,通过设备路径获得的DeviceNumber与之前获得的不同……
{
CM_Get_Parent(&dnParent, da.DevInst, 0);
CM_Get_Device_ID(dnParent, DevIdBuffer, 512, 0);
StringCchCopy(szInstanceID, 512, DevIdBuffer);
memset(DevIdBuffer, 0, sizeof(DevIdBuffer));
CM_Get_Parent(&dnParent, dnParent, 0);
CM_Get_Device_ID(dnParent, DevIdBuffer, 512, 0);
StringCchCopy(szHubPath, 512, DevIdBuffer);
bDeviceFound = TRUE;
break;
}
}
GlobalFree(sddia);
SetupDiDestroyDeviceInfoList(hDevInfo);
if (!bDeviceFound) //对于那个光盘盘符, bDeviceFound 的结果就是FALSE,根本就没到下面的判断....
{
return FALSE;
}
//_tcsstr()
strIndex1 = lastIndexOfStr(szInstanceID, _T("USB\\"));
strIndex2 = lastIndexOfStr(szHubPath, _T("USB\\"));
if ( strIndex1 < 0 || strIndex1 > 3 || strIndex2 < 0 || strIndex2 > 3)
{
return FALSE;
}
return TRUE;
}