/// GUID des Cypress USB Treibers
static GUID CYUSBDRV_GUID = {0xae18aa60, 0x7f6a, 0x11d4, 0x97, 0xdd, 0x0, 0x1, 0x2, 0x29, 0xb9, 0x59};
/// Zeilenanfangskennung
static const unsigned int XXX_LINE_MAGICNUMBER = 0x555A;
/// Adresse des USB Endpoints
#define XXX_TX_ENDPOINT_ADDR 0x08
/// Transferdatenblockgröße
#define DEFAULT_TX_TRANSFER_SIZE 64
// Handle auf den Gerätetreiber holen
HDEVINFO hwDeviceInfo = SetupDiGetClassDevs((LPGUID) &CYUSBDRV_GUID, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if (hwDeviceInfo != INVALID_HANDLE_VALUE)
{
// devInterfaceData Struktur vorbereiten
SP_DEVICE_INTERFACE_DATA devInterfaceData;
devInterfaceData.cbSize = sizeof(devInterfaceData);
// Liste aller vorhandenen Module erstellen
while( (modules.size() < XXX_MAX_MODULES) && (SetupDiEnumDeviceInterfaces(hwDeviceInfo, 0, (LPGUID) &CYUSBDRV_GUID, (DWORD)modules.size(), &devInterfaceData)))
{
// deviceInfoData Struktur vorbereiten
SP_DEVINFO_DATA deviceInfoData;
memset(&deviceInfoData, 0, sizeof(SP_DEVINFO_DATA));
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
// deviceInterfaceDetailData Struktur vorbereiten
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData;
ULONG requiredLength = 0, reservedLength = 0, realLength = 0;
if (!SetupDiGetDeviceInterfaceDetail(hwDeviceInfo, &devInterfaceData, NULL, 0, &requiredLength, NULL))
{
int errorCode = GetLastError();
if (errorCode != ERROR_INSUFFICIENT_BUFFER)
{
perror("ERROR: SetupDiGetDeviceInterfaceDetail()[1] failed - ");
printf("ERROR CODE %d (0x%X)\n", errorCode, errorCode);
FreeModuleList();
return ERR_XXX_SETUPAPI;
}
}
reservedLength = requiredLength;
deviceInterfaceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA) new char[reservedLength];
memset(deviceInterfaceDetailData, 0, reservedLength);
deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// Details abfragen
realLength = reservedLength;
if (SetupDiGetDeviceInterfaceDetail(hwDeviceInfo, &devInterfaceData, deviceInterfaceDetailData, reservedLength, &realLength, &deviceInfoData))
{
// Modul initialisieren
XXXModule* newModule = new XXXModule((int)modules.size(), deviceInterfaceDetailData->DevicePath);
modules.push_back(newModule);
} else
{
int error = ::GetLastError();
std::cerr << "XXXEnumerator::UpdateModuleList: SetupDiGetDeviceInterfaceDetail failed with code " << error << " \"" << ErrorMessage(error) << "\"" << std::endl;
FreeModuleList();
return ERR_XXX_SETUPAPI;
}
// Für deviceInterfaceDetailData reservierten Speicher freigeben
delete deviceInterfaceDetailData;
deviceInterfaceDetailData = NULL;
}
// Auflistung beenden
SetupDiDestroyDeviceInfoList(hwDeviceInfo);
// Fertig
return ERR_XXX_OK;
// Gerätetreiber nicht vorhanden -> ergo keine Module
} else
{
return ERR_XXX_NODRIVER;
}