GUID 驱动
我用DriverStudio里面的引导一步步生成了.INF和.SYS文件(我只是安引导和选择成生,没有对程序进行添加和改动),
然后对我的PDIUSBD12设备的驱动文伯INF SYS进行了安装, 在.INF文件中我找到了这个设备的GUID.
我就对这个GUID进行 1.获取设备信息 2.识别接口信息,3获取设备路径可是老是在第二步返回FALSE,我换成别的GUID可以。可是我对应的设备就是这个GUID啊,怎么办,我要达到对这个设备识别,读写!请教高手!
//GUID GUID_CLASS_I82930_BULK= {0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b};//GUID
GUID GUID_CLASS_I82930_BULK= 0x4d36e967L, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18};//我的设备ID
SP_DEVINFO_DATA DeviceInfo;
BOOL GetUsbDeviceFileName( LPGUID pGuid, char *outNameBuf);
HANDLE OpenUsbDevice( LPGUID pGuid, char *outNameBuf);
HANDLE OpenOneDevice (HDEVINFO HardwareDeviceInfo, PSP_INTERFACE_DEVICE_DATA DeviceInfoData,char *devName);
int GetUsbPath(char *path);
int WriteUsb(HANDLE hUsb,char *Outbuff, int len);
int ReadUsb(HANDLE hUsb,BYTE inbuff[], DWORD &nBytesRead,int nToRead);
/***********************************************************************************************
名称:open_file
功能:打开USB设备
参数:filename 定义为"PIPE00" pipe name for bulk input pipe on our test board ,"PIPE01" pipe name for bulk output pipe on our test board。
PIPE00 和 PIPE01 是参考src\usb\bulkusb,我实际在用时这两个效果一样,为了避免USB异常引起的死机,我文件打开采用非阻塞模式。
***********************************************************************************************/
HANDLE open_file( char *filename)
{
int success = 1;
HANDLE h;
char completeDeviceName[256] = ""; //generated from the GUID registered by the driver itself
if ( !GetUsbDeviceFileName((LPGUID) &GUID_CLASS_I82930_BULK,completeDeviceName) )
{
//NOISY(("Failed to GetUsbDeviceFileName\n", GetLastError()));
return INVALID_HANDLE_VALUE;
}
strcat (completeDeviceName, "\\");
strcat (completeDeviceName, filename);
//printf("completeDeviceName = (%s)\n", completeDeviceName);
h = CreateFile(completeDeviceName,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
if (h == INVALID_HANDLE_VALUE)
{
printf("OpenUSB 失败\n");
//NOISY(("Failed to open (%s) = %d", completeDeviceName, GetLastError()));
success = 0;
} else
{
printf("OpenUSB 成功\n");
//NOISY(("Opened successfully.\n"));
}
return h;
}
/***********************************************************************************************
名称:GetUsbDeviceFileName
功能:获取USB设备路径
参数:pGUID
返回:outNameBuf USB设备路径
***********************************************************************************************/
BOOL GetUsbDeviceFileName( LPGUID pGuid, char *outNameBuf)
{
HANDLE hDev = OpenUsbDevice( pGuid, outNameBuf );
if ( hDev != INVALID_HANDLE_VALUE )
{
CloseHandle( hDev );
return TRUE;
}
return FALSE;
}
/***********************************************************************************************
名称:OpenUsbDevice
功能:获取USB设备路径
参数:pGUID 设备GUID
返回:outNameBuf USB设备路径
***********************************************************************************************/
HANDLE OpenUsbDevice( LPGUID pGuid, char *outNameBuf)
{
ULONG NumberDevices;
HANDLE hOut = INVALID_HANDLE_VALUE;
HDEVINFO hardwareDeviceInfo;
SP_INTERFACE_DEVICE_DATA deviceInfoData;
// PSP_DEVICE_INTERFACE_DATA deviceInfoData;
ULONG i;
BOOLEAN done;
PUSB_DEVICE_DESCRIPTOR usbDeviceInst;
PUSB_DEVICE_DESCRIPTOR *UsbDevices = &usbDeviceInst;
*UsbDevices = NULL;
NumberDevices = 0;
hardwareDeviceInfo = SetupDiGetClassDevs (
pGuid,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_INTERFACEDEVICE)); // Function class devices.
if(hardwareDeviceInfo !=INVALID_HANDLE_VALUE)
{
printf("%d\n",hardwareDeviceInfo);
printf("获取设备信息 成功\n");
}else
{
printf("获取设备信息 失败\n");
}
NumberDevices = 100;
done = FALSE;
deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
i=0;
while (!done)
{
NumberDevices *= 2;
if (*UsbDevices)
{
*UsbDevices = (PUSB_DEVICE_DESCRIPTOR)realloc (*UsbDevices, (NumberDevices * sizeof (USB_DEVICE_DESCRIPTOR)));
}
else
{
*UsbDevices = (PUSB_DEVICE_DESCRIPTOR)calloc (NumberDevices, sizeof (USB_DEVICE_DESCRIPTOR));
}
if (NULL == *UsbDevices)
{
// SetupDiDestroyDeviceInfoList destroys a device information set
// and frees all associated memory.
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
return INVALID_HANDLE_VALUE;
}
usbDeviceInst = *UsbDevices + i;
for (; i < NumberDevices; i++)
{
if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo,
NULL, // We don't care about specific PDOs
(LPGUID)pGuid,
i,
&deviceInfoData))
{
printf("deviceInfoData=%d\n",deviceInfoData);
printf("识别接口信息 成功\n");
hOut = OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, outNameBuf);
if ( hOut != INVALID_HANDLE_VALUE )
{
done = TRUE;
break;
}
}
else
{
printf("识别接口信息 失败\n");
printf("GetLastError()=%d\n",GetLastError());
if (ERROR_NO_MORE_ITEMS == GetLastError())
{
done = TRUE;
break;
}
}
}
}
NumberDevices = i;
// SetupDiDestroyDeviceInfoList() destroys a device information set
// and frees all associated memory.
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
free ( *UsbDevices );
return hOut;
}
HANDLE OpenOneDevice (
IN HDEVINFO HardwareDeviceInfo,
IN PSP_INTERFACE_DEVICE_DATA DeviceInfoData,
IN char *devName)
{
PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;
ULONG predictedLength = 0;
ULONG requiredLength = 0;
HANDLE hOut = INVALID_HANDLE_VALUE;
//
// allocate a function class device data structure to receive the
// goods about this particular device.
//
SetupDiGetInterfaceDeviceDetail (
HardwareDeviceInfo,
DeviceInfoData,
NULL, // probing so no output buffer yet
0, // probing so output buffer length of zero
&requiredLength,
NULL); // not interested in the specific dev-node
predictedLength = requiredLength;
// sizeof (SP_FNCLASS_DEVICE_DATA) + 512;
functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc (predictedLength);
functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);
//
// Retrieve the information from Plug and Play.
//
if (! SetupDiGetInterfaceDeviceDetail (
HardwareDeviceInfo,
DeviceInfoData,
functionClassDeviceData,
predictedLength,
&requiredLength,
NULL))
{
free( functionClassDeviceData );
return INVALID_HANDLE_VALUE;
}
strcpy( devName,functionClassDeviceData->DevicePath) ;
//printf( "Attempting to open %s\n", devName );
hOut = CreateFile (
functionClassDeviceData->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, // no SECURITY_ATTRIBUTES structure
OPEN_EXISTING, // No special create flags
0, // No special attributes
NULL); // No template file
if (INVALID_HANDLE_VALUE == hOut)
{
//printf( "FAILED to open %s\n", devName );
}
free( functionClassDeviceData );
return hOut;
}
/***********************************************************************************************
名称:GetUsbPath
功能:返回USB设备路径
参数:pGUID
返回:path 路径
***********************************************************************************************/
int GetUsbPath(char *path)
{
if ( !GetUsbDeviceFileName((LPGUID) &GUID_CLASS_I82930_BULK,path) )
{
return 0;
}
return 1;
}