how to get vendor id and product id of a plugged usb device on windows

Posted by new on Stack Overflow See other posts from Stack Overflow or by new
Published on 2010-05-29T13:12:29Z Indexed on 2010/05/29 13:22 UTC
Read the original article Hit count: 347

Filed under:
|
|
|
|

Hello all,

I am using Qt on windows platform.

i want to get and display vendor id and product id of a plugged usb device from my local system.

Below is my full source code to get the vendor id and product id from the usb device.

when i run the my qt application it does not throw me any errors .

so i plug the usb device into the system.

but my print statement displays the result as below

qDebug ()<DevicePath;

i get the result as 0x4

Whether i have any implementation mistakes in my source code ?

if so please guide me what i am doing wrong..

Have i missed out any other functions ?

Is it possible to get the vendor id and product id from the usb device based on my source code .( my implementation of the code ) ?

kindly find my source code below

static GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };

HANDLE hInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE,NULL,NULL,DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

if ( hInfo == INVALID_HANDLE_VALUE )

{

qDebug ()<<"invalid";

}

else

{

qDebug ()<<"valid handle";

SP_DEVINFO_DATA DeviceInfoData;

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

SP_INTERFACE_DEVICE_DATA Interface_Info;

Interface_Info.cbSize = sizeof(Interface_Info);

BYTE Buf[1024];

DWORD i;

DWORD InterfaceNumber= 0;

PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;

for (i=0;SetupDiEnumDeviceInfo(hInfo,i,&DeviceInfoData);i++)

{

DWORD DataT;

LPTSTR buffer = NULL;

DWORD buffersize = 0;

while (!SetupDiGetDeviceRegistryProperty( hInfo,&DeviceInfoData,SPDRP_DEVICEDESC,&DataT,(PBYTE)buffer,buffersize,&buffersize))

{

if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)

{

// Change the buffer size.

if (buffer) LocalFree(buffer);


buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);


}

else

{

// Insert error handling here.

break;

}


qDebug ()<<(TEXT("Device Number %i is: %s\n"),i, buffer);

if (buffer) LocalFree(buffer);


if ( GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS )

{

// Insert error handling here.

qDebug ()<<"return false";

}

InterfaceNumber = 0; // this just returns the first one, you can iterate on this

if (SetupDiEnumDeviceInterfaces(hInfo,NULL,&GUID_DEVINTERFACE_USB_DEVICE,InterfaceNumber,&Interface_Info))

{

printf("Got interface");

DWORD needed;

pspdidd->cbSize = sizeof(*pspdidd);

SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData = NULL;

DWORD dwDetDataSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + 256;

SetupDiGetDeviceInterfaceDetail(hInfo, &Interface_Info, pDetData,dwDetDataSize, NULL,&DeviceInfoData);


qDebug ()<<pDetData->DevicePath;


//qDebug ()<<QString::fromWCharArray(pDetData->DevicePath);

}

else

{

printf("\nNo interface");

//ErrorExit((LPTSTR) "SetupDiEnumDeviceInterfaces");

if ( GetLastError() == ERROR_NO_MORE_ITEMS) printf(", since there are no more items found.");

else printf(", unknown reason.");

}


// Cleanup

SetupDiDestroyDeviceInfoList(hInfo);

qDebug ()<<"return true";



}

}

}

© Stack Overflow or respective owner

Related posts about c++

Related posts about Windows