none
Solucion para setupApi.h RRS feed

  • Pregunta

  • Muy buenas tardes tengo un detalle, estoy desarrollando un proyecto que su funcion es traer en pantalla todos los dispositivos conectados en la pc .

    ¿Cual es mi problema?

    R= no puedo identificar que tipo de puerto es al que estoy conectado 

    desde ya muchas gracias este es mi codigo

    #include <windows.h>
    #include <devguid.h>    // para los GUID de las clases CD-ROM etc
    #include <setupapi.h>  //para propiedaddes de dispositivos
    #include <cfgmgr32.h>   // para MAX_DEVICE_ID_LEN, CM_Get_Parent y CM_Get_Device_ID
    #define INITGUID
    #include <tchar.h>
    #include <stdio.h>
    #include <usbioctl.h>
    #include <usb100.h>
    #include <usbspec.h>
    
    //#include "Estructuras.h" //mis estructuras creadas en el header.
    
    
    #ifdef DEFINE_DEVPROPKEY
    #undef DEFINE_DEVPROPKEY
    #endif
    #ifdef INITGUID
    #define DEFINE_DEVPROPKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) EXTERN_C const DEVPROPKEY DECLSPEC_SELECTANY name = { { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }, pid }
    #else
    #define DEFINE_DEVPROPKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) EXTERN_C const DEVPROPKEY name
    #endif // INITGUID
     
    DEFINE_DEVPROPKEY(DEVPKEY_Device_BusReportedDeviceDesc, 0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2, 4);     // DEVPROP_TYPE_STRING
    DEFINE_DEVPROPKEY(DEVPKEY_Device_ContainerId, 0x8c7ed206, 0x3f8a, 0x4827, 0xb3, 0xab, 0xae, 0x9e, 0x1f, 0xae, 0xfc, 0x6c, 2);     // DEVPROP_TYPE_GUID
    DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14);    // DEVPROP_TYPE_STRING
    DEFINE_DEVPROPKEY(DEVPKEY_DeviceDisplay_Category, 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x5a);  // DEVPROP_TYPE_STRING_LIST
    DEFINE_DEVPROPKEY(DEVPKEY_Device_LocationInfo, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 15);    // DEVPROP_TYPE_STRING
    DEFINE_DEVPROPKEY(DEVPKEY_Device_Manufacturer, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 13);    // DEVPROP_TYPE_STRING
    DEFINE_DEVPROPKEY(DEVPKEY_Device_SecuritySDS, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 26);    // DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING
    
    #define ARRAY_SIZE(arr)     (sizeof(arr)/sizeof(arr[0]))
    
    #pragma comment (lib, "setupapi.lib")
    
    typedef BOOL(WINAPI *FN_SetupDiGetDevicePropertyW)
    (
    	__in       HDEVINFO DeviceInfoSet,
    	__in       PSP_DEVINFO_DATA DeviceInfoData,
    	__in       const DEVPROPKEY *PropertyKey,
    	__out      DEVPROPTYPE *PropertyType,
    	__out_opt  PBYTE PropertyBuffer,
    	__in       DWORD PropertyBufferSize,
    	__out_opt  PDWORD RequiredSize,
    	__in       DWORD Flags
    	);
    
    
    
    // Lista de Todos los Dispositivos con información extra
    void ListDevices(CONST GUID *pClassGuid, LPCTSTR pszEnumerator)
    {
    	unsigned i, j;
    	DWORD dwSize, dwPropertyRegDataType;
    	DEVPROPTYPE ulPropertyType;
    	CONFIGRET status;
    	HDEVINFO hDevInfo;
    	SP_DEVINFO_DATA DeviceInfoData;
    	const static LPCTSTR arPrefix[3] = { TEXT("VID_"), TEXT("PID_"), TEXT("MI_") };
    	TCHAR szDeviceInstanceID[MAX_DEVICE_ID_LEN];
    	TCHAR szDesc[1024], szHardwareIDs[4096];
    	WCHAR szBuffer[4096];
    	LPTSTR pszToken, pszNextToken;
    	TCHAR szVid[MAX_DEVICE_ID_LEN], szPid[MAX_DEVICE_ID_LEN], szMi[MAX_DEVICE_ID_LEN];
    	FN_SetupDiGetDevicePropertyW fn_SetupDiGetDevicePropertyW = (FN_SetupDiGetDevicePropertyW)
    		GetProcAddress(GetModuleHandle(TEXT("Setupapi.dll")), "SetupDiGetDevicePropertyW");
    
    
    	
    
    
    	// Lista de todos los dispositivos conectados 
    	hDevInfo = SetupDiGetClassDevs(pClassGuid, pszEnumerator, NULL,
    		pClassGuid != NULL ? DIGCF_PRESENT : DIGCF_ALLCLASSES | DIGCF_PRESENT);
    	if (hDevInfo == INVALID_HANDLE_VALUE)
    	{
    		return;
    	}
    		
    
    	// Encuentra los que no estan conectados
    	for (i = 0;; i++)  {
    		DeviceInfoData.cbSize = sizeof(DeviceInfoData);
    		if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData))
    		{
    			break;
    		}
    			
    
    		status = CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID, MAX_PATH, 0);
    		if (status != CR_SUCCESS)
    		{
    			continue;
    		}
    			
    
    		// Visualizar en pantalla la instancia ID
    		_tprintf(TEXT("%s\n"), szDeviceInstanceID);
    
    		if (SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
    			&dwPropertyRegDataType, (BYTE*)szDesc,
    			sizeof(szDesc),   // Tamaño, en bytes
    			&dwSize))
    		{
    			_tprintf(TEXT("    Descripcion del Dispositivo: \"%s\"\n"), szDesc);
    		}
    			
    
    		if (SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,
    			&dwPropertyRegDataType, (BYTE*)szHardwareIDs,
    			sizeof(szHardwareIDs),    // The size, in bytes
    			&dwSize))
    		{
    			LPCTSTR pszId;
    			_tprintf(TEXT("    Hardware IDs:\n"));
    			for (pszId = szHardwareIDs;
    				*pszId != TEXT('\0') && pszId + dwSize / sizeof(TCHAR) <= szHardwareIDs + ARRAYSIZE(szHardwareIDs);
    				pszId += lstrlen(pszId) + 1) 
    			{
    
    				_tprintf(TEXT("        \"%s\"\n"), pszId);
    			}
    		}
    
    		// Regresa la informacion del dispositivo que genero en un reporte por el mismo dispositivo 
    		// En windows Vista o anteriores, Podemos usar solo SPDRP_DEVICEDESC
    		// en Windows 7, se accede a la información que queremos ("Bus reported device description") 
    		// a través de DEVPKEY_Device_BusReportedDeviceDesc
    		if (fn_SetupDiGetDevicePropertyW && fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_BusReportedDeviceDesc,
    			&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) {
    
    			if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_BusReportedDeviceDesc,
    				&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0))
    			{
    				_tprintf(TEXT("    Descripcion del Dispositivo Notificado por Bus: \"%ls\"\n"), szBuffer);
    			}
    				
    			if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_Manufacturer,
    				&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0))
    			{
    				_tprintf(TEXT("    Fabricante del Dispositivo: \"%ls\"\n"), szBuffer);
    			}
    			if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_FriendlyName,
    				&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) 
    			{
    				_tprintf(TEXT("    Nombre del Dispositivo: \"%ls\"\n"), szBuffer);
    			}
    			if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_LocationInfo,
    				&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0))
    			{
    				_tprintf(TEXT("    Ubicacion del Dispositivo: \"%ls\"\n"), szBuffer);
    			}
    			if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_SecuritySDS,
    				&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) 
    			{
    				// Ver Lenguaje de definición de descriptor de seguridad en MSDN
    				
    				_tprintf(TEXT("    Descriptor de Seguridad del Dispositivo: \"%ls\"\n"), szBuffer);
    			}
    			if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_ContainerId,
    				&ulPropertyType, (BYTE*)szDesc, sizeof(szDesc), &dwSize, 0)) 
    			{
    				StringFromGUID2((REFGUID)szDesc, szBuffer, ARRAY_SIZE(szBuffer));
    				_tprintf(TEXT("    ContainerId: \"%ls\"\n"), szBuffer);
    			}
    			if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_DeviceDisplay_Category,
    				&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0))
    			{
    				_tprintf(TEXT("    Categoria de Dispositivo: \"%ls\"\n"), szBuffer);
    			}
    				
    		}
    
    		pszToken = _tcstok_s(szDeviceInstanceID, TEXT("\\#&"), &pszNextToken);
    		while (pszToken != NULL) 
    		{
    			szVid[0] = TEXT('\0');
    			szPid[0] = TEXT('\0');
    			szMi[0] = TEXT('\0');
    			for (j = 0; j < 3; j++) 
    			{
    				if (_tcsncmp(pszToken, arPrefix[j], lstrlen(arPrefix[j])) == 0) {
    					switch (j) 
    					{
    					case 0:
    						_tcscpy_s(szVid, ARRAY_SIZE(szVid), pszToken);
    						break;
    					case 1:
    						_tcscpy_s(szPid, ARRAY_SIZE(szPid), pszToken);
    						break;
    					case 2:
    						_tcscpy_s(szMi, ARRAY_SIZE(szMi), pszToken);
    						break;
    					default:
    						break;
    					}
    				}
    			}
    			if (szVid[0] != TEXT('\0'))
    			{
    				_tprintf(TEXT("    vid: \"%s\"\n"), szVid);
    			}
    				
    			if (szPid[0] != TEXT('\0'))
    			{
    				_tprintf(TEXT("    pid: \"%s\"\n"), szPid);
    			}
    				
    			if (szMi[0] != TEXT('\0'))
    			{
    				_tprintf(TEXT("    mi: \"%s\"\n"), szMi);
    			}
    				
    			pszToken = _tcstok_s(NULL, TEXT("\\#&"), &pszNextToken);
    		}
    	}
    
    	return;
    }
    
    
    
    //iniciar estructuras
    //Esta estructura manda a llamar USB_HUB_TYPE que contiene la información del controlador
    //y verifica si es 1.0,2.0 o 3.0
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    int _tmain()
    {   
    	
    	// List all connected USB devices
    	_tprintf(TEXT("---------------\n"));
    	_tprintf(TEXT("- Dispositivos USB -\n"));
    	_tprintf(TEXT("---------------\n"));
    	ListDevices(NULL, TEXT("USB"));
    	
    	_tprintf(TEXT("\n"));
    	_tprintf(TEXT("-------------------\n"));
    	_tprintf(TEXT("-  Dispositivos de Almacenamiento -\n"));
    	_tprintf(TEXT("-------------------\n"));
    	ListDevices(NULL, TEXT("USBSTOR"));
    
    	_tprintf(TEXT("\n"));
    	_tprintf(TEXT("--------------\n"));
    	_tprintf(TEXT("- Dispositivos SD -\n"));
    	_tprintf(TEXT("--------------\n"));
    	ListDevices(NULL, TEXT("SD"));
    
    	//_tprintf (TEXT("\n"));
    	//ListDevices(&GUID_DEVCLASS_USB, NULL);
    	//_tprintf (TEXT("\n"));
    
    	_tprintf(TEXT("\n"));
    	_tprintf(TEXT("-----------\n"));
    	_tprintf(TEXT("- Volumen -\n"));
    	_tprintf(TEXT("-----------\n"));
    	//ListDevices(NULL, TEXT("STORAGE\\VOLUME"));
    	//_tprintf (TEXT("\n"));
    	ListDevices(&GUID_DEVCLASS_VOLUME, NULL);
    	
    	
    	_tprintf(TEXT("\n"));
    	_tprintf(TEXT("----------------------------\n"));
    	_tprintf(TEXT("- dispositivos con unidades de disco -\n"));
    	_tprintf(TEXT("----------------------------\n"));
    	ListDevices(&GUID_DEVCLASS_DISKDRIVE, NULL);
    	system("pause");
    	return 0;
    }
    
    

    jueves, 7 de septiembre de 2017 1:22