主题:我知道机器上usb设备的驱动,和Guid问怎么获得设备的句柄,然后用ReadFile来访问
我的代码如下:
HANDLE OpenOneDevice(HDEVINFO hDveInfo,PSP_INTERFACE_DEVICE_DATA DvcInfoData,
char *sDevNameBuf)
{
HANDLE hOut = INVALID_HANDLE_VALUE;
ULONG iReqLen = 0;
SetupDiGetInterfaceDeviceDetail( DveInfo,DvcInfoData,
NULL,0,&iReqLen,NULL);
ULONG iDevDataLen = iReqLen;
PSP_INTERFACE_DEVICE_DETAIL_DATA pDevData;
pDevData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(iDevDataLen);
pDevData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
bool bResult = SetupDiGetInterfaceDeviceDetail(hDveInfo,DvcInfoData,
pDevData,iDevDataLen,&iReqLen,NULL);
if(bResult == true)
{
strcpy(sDevNameBuf,pDevData->DevicePath);
hOut = CreateFile(pDevData->DevicePath ,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,0,NULL);
}
free(pDevData);
return hOut;
}
//-----------------------------------------------------------
HANDLE OpenUsbDevice(const GUID *pGuid,char *sDevNameBuf)
{
HANDLE hOut = INVALID_HANDLE_VALUE;
HDEVINFO hDevInfo ;
ULONG n;
SP_INTERFACE_DEVICE_DATA deviceInfoData;
hDevInfo = SetupDiGetClassDevs(pGuid,
NULL,
NULL,
DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
if(hDevInfo == INVALID_HANDLE_VALUE)
{
return NULL ;
}
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
ULONG nGuessCount = MAXLONG;
for(ULONG iDevIndex=0; iDevIndex<nGuessCount; iDevIndex++)
{
if(SetupDiEnumDeviceInterfaces(hDevInfo, 0, pGuid,
iDevIndex, &deviceInfoData))
{
hOut=OpenOneDevice(hDevInfo, &deviceInfoData, sDevNameBuf);
if(hOut != INVALID_HANDLE_VALUE)
break;
}
n = GetLastError();
if( n == ERROR_NO_MORE_ITEMS) //No more items
{
break;
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return hOut;
}
这段代码 SetupDiEnumDeviceInterfaces的返回值永远都是false,这是为什么啊,n的值是259,pGuid 是机器上的USB设备,比如U盘 。请大虾仁兄帮忙分析一下
HANDLE OpenOneDevice(HDEVINFO hDveInfo,PSP_INTERFACE_DEVICE_DATA DvcInfoData,
char *sDevNameBuf)
{
HANDLE hOut = INVALID_HANDLE_VALUE;
ULONG iReqLen = 0;
SetupDiGetInterfaceDeviceDetail( DveInfo,DvcInfoData,
NULL,0,&iReqLen,NULL);
ULONG iDevDataLen = iReqLen;
PSP_INTERFACE_DEVICE_DETAIL_DATA pDevData;
pDevData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(iDevDataLen);
pDevData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
bool bResult = SetupDiGetInterfaceDeviceDetail(hDveInfo,DvcInfoData,
pDevData,iDevDataLen,&iReqLen,NULL);
if(bResult == true)
{
strcpy(sDevNameBuf,pDevData->DevicePath);
hOut = CreateFile(pDevData->DevicePath ,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,0,NULL);
}
free(pDevData);
return hOut;
}
//-----------------------------------------------------------
HANDLE OpenUsbDevice(const GUID *pGuid,char *sDevNameBuf)
{
HANDLE hOut = INVALID_HANDLE_VALUE;
HDEVINFO hDevInfo ;
ULONG n;
SP_INTERFACE_DEVICE_DATA deviceInfoData;
hDevInfo = SetupDiGetClassDevs(pGuid,
NULL,
NULL,
DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
if(hDevInfo == INVALID_HANDLE_VALUE)
{
return NULL ;
}
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
ULONG nGuessCount = MAXLONG;
for(ULONG iDevIndex=0; iDevIndex<nGuessCount; iDevIndex++)
{
if(SetupDiEnumDeviceInterfaces(hDevInfo, 0, pGuid,
iDevIndex, &deviceInfoData))
{
hOut=OpenOneDevice(hDevInfo, &deviceInfoData, sDevNameBuf);
if(hOut != INVALID_HANDLE_VALUE)
break;
}
n = GetLastError();
if( n == ERROR_NO_MORE_ITEMS) //No more items
{
break;
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return hOut;
}
这段代码 SetupDiEnumDeviceInterfaces的返回值永远都是false,这是为什么啊,n的值是259,pGuid 是机器上的USB设备,比如U盘 。请大虾仁兄帮忙分析一下