Здравствуйте, Andrew S, Вы писали:
AS>>>В ДДК есть пример. Ну и поиск по форуму.
DS>>Я уже смотрел пример в DDK (Вы наверное имеете ввиду DevCon ) и здесь на форуме находил порядок вызовов. Но под XP DevCon ставит USB Universal driver хотя у меня драйвер TI DFU class driver то биш после вставки устройства в USB порт опять всплывает диалог New HardWare Wizard. А по той схеме что приводится в форуме вылет на функции SetupDiEnumDriverInfo .
Еще такой нюанс устройство у меня композитное( в одном корпусе несколько устройств в моем случае 3)
AS>Ну так вы посмотрите, какой там драйвер выбирается. Наверняка не тот, что вы подсовываете. Соответственно, измените алгоритм нахождения нужного драйвера в списке на свой.
Я вообще ни какой драйвер выбрать не могу. У меня вылет на функции SetupDiEnumDriverInfo с кодом ошибки ERROR_NO_MORE_ITEMS при первой же попытке вызвать эту функцию.(переменная что принемает описаловку драйвера ни чего не содержит) Такое ощущение что не создается вообще ни какого списка. Я уже и с параметрами функций эксперементировал.... глухо. Если не трудно то подскажите в чем промах?! Код мой следующий:
hDevList = SetupDiCreateDeviceInfoList(&UsbGuid,0);
if( hDevList==INVALID_HANDLE_VALUE)
{
DWORD dwError = GetLastError();
}
if( !SetupDiClassNameFromGuid(&UsbGuid,chClassName,MAX_PATH,&dwRequiredSize) )
{
DWORD dwError = GetLastError();
}
SP_DEVINFO_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
if( !SetupDiCreateDeviceInfo(hDevList,"Vid_0554&Pid_1002&Mi_04",&UsbGuid,"TI DFU class driver",0,DICD_GENERATE_ID,&DeviceInfoData)) // "TI DFU class driver",NULL,DICD_GENERATE_ID,&DeviceInfoData
{
DWORD dwError = GetLastError();
switch( dwError )
{
case ERROR_CLASS_MISMATCH:
MessageBox(NULL,"ERROR_CLASS_MISMATCH","Error",MB_OK);
break;
case ERROR_DEVINST_ALREADY_EXISTS:
MessageBox(NULL,"ERROR_DEVINST_ALREADY_EXISTS","Error",MB_OK);
break;
case ERROR_INVALID_USER_BUFFER:
MessageBox(NULL,"ERROR_INVALID_USER_BUFFER","Error",MB_OK);
break;
default:
MessageBox(NULL,"Unknow Error","Error",MB_OK);
}
}
SP_DEVINFO_DATA DupDeviceInfoData;
DupDeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
//SPRDI_FIND_DUPS,NULL,NULL,&DupDeviceInfoData
if( !SetupDiRegisterDeviceInfo(hDevList,&DeviceInfoData,0,NULL,0,NULL) )
{
DWORD dwError = GetLastError();
switch( dwError )
{
case ERROR_DI_DO_DEFAULT:
MessageBox(NULL,"ERROR_DI_DO_DEFAULT","Error",MB_OK);
break;
default:
MessageBox(NULL,"Unknow Error Terminate instalation application","Error",MB_OK);
}
}
SP_DEVINSTALL_PARAMS DeviceInstallParams;
DeviceInstallParams.cbSize = sizeof( SP_DEVINSTALL_PARAMS );
DeviceInstallParams.Flags = DI_ENUMSINGLEINF | DI_QUIETINSTALL | DI_COMPAT_FROM_CLASS ; // DI_ENUMSINGLEINF
DeviceInstallParams.FlagsEx = 0;
DeviceInstallParams.hwndParent = NULL;
DeviceInstallParams.InstallMsgHandler = NULL;
DeviceInstallParams.InstallMsgHandlerContext = NULL;
strcpy(DeviceInstallParams.DriverPath,"D:\\WORK\\PSSDK\\Research\\Microphone\\CommUCom\\html2\\cab\\dfuusb.inf");
DeviceInstallParams.FileQueue = NULL;
DeviceInstallParams.ClassInstallReserved = 0;
if(!SetupDiSetDeviceInstallParams(hDevList,&DeviceInfoData,&DeviceInstallParams))
{
DWORD dwError = GetLastError();
}
if( !SetupDiBuildDriverInfoList(hDevList,&DeviceInfoData,SPDIT_CLASSDRIVER ) )
{
DWORD dwError = GetLastError();
}
DWORD nCurDrv=0;
SP_DRVINFO_DATA drv_info;
drv_info.cbSize = sizeof(SP_DRVINFO_DATA);
while ( !SetupDiEnumDriverInfo ( hDevList, &DeviceInfoData , SPDIT_CLASSDRIVER, nCurDrv, &drv_info) )
{
if( ERROR_NO_MORE_ITEMS == GetLastError())
break;
// Finf driver
++nCurDrv;
}
// if( !SetupDiGetDriverInfoDetail(hDevList,&DeviceInfoData,&drv_info,0,sizeof(PSP_DRVINFO_DETAIL_DATA),0) )
// {
// DWORD dwError = GetLastError();
// }
drv_info.Reserved = 0;
if( !SetupDiSetSelectedDriver( hDevList, &DeviceInfoData,&drv_info ) )
{
DWORD dwError = GetLastError();
}
if(!SetupDiCallClassInstaller(DIF_INSTALLDEVICE,hDevList,&DeviceInfoData))
{
DWORD dwError = GetLastError();
}
if(!SetupDiCallClassInstaller(DIF_REGISTER_COINSTALLERS,hDevList,&DeviceInfoData))
{
DWORD dwError = GetLastError();
}
if(!SetupDiCallClassInstaller(DIF_INSTALLINTERFACES,hDevList,&DeviceInfoData))
{
DWORD dwError = GetLastError();
}
if( !SetupDiInstallDevice(hDevList,&DeviceInfoData) )
{
DWORD dwError = GetLastError();
}
SP_DEVINSTALL_PARAMS DeviceInstallParam;
DeviceInstallParam.cbSize = sizeof( SP_DEVINSTALL_PARAMS );
if( !SetupDiGetDeviceInstallParams(hDevList,&DeviceInfoData,&DeviceInstallParam) )
{
DWORD dwError = GetLastError();
}
SetupDiDestroyDeviceInfoList( hDevList );