One thing that strikes me as odd is that MSDN on SQLDataSources documents the BufferLength2 parameter as
[Input] Length in characters of the *Description buffer.
The value passed to it is sizeof(description). This is all well, as long as sizeof(UCHAR) == sizeof(char), but I don't know if that is actually true, as I don't do much C. UCHAR could be unsigned char, but it could also be Unicode char. Personally, I would try to avoid the direct sizeof() and declare a constant (say) DESCRIPTION_SIZE= 256, and then use
const DESCRIPTION_SIZE= 256;
UCHAR description[ DESCRIPTION_SIZE ];
... but I doubt that this is the problematic part, as it would imply an "overly long" description of over 256 bytes in one of the ODBC data sources.