Re[2]: SetupDiGetDeviceInterfaceDetail в Windows 2003 64-bit
От:
Слава_2
Дата: 30.05.07 13:22
Оценка:
Здравствуйте, g_i:
Спасибо, MSDN у меня есть .
Обратите внимание на то, что в 4 основных версиях Windows (32-bits) код работает. Кроме того, не обязательно вызывать функцию SetupDiGetDeviceInterfaceDetail дважды, строковый идентификатор устройства не будет слишком большим в SP_DEVICE_INTERFACE_DETAIL_DATA.
Я попробовал поискать ответ на англоязычных форумах. Наткнулся только лишь на похожее описание проблемы, оставшееся без ответа.
И даже с рекомендациями MSDN результат тот же самый (даже перекомпилировал под UNICODE и убеждался, что ошибка та же):
if( SetupDiEnumDeviceInterfaces(PnPHandle, 0, &DeviceGuid, index, &DeviceInterfaceData) )
{
//сюда заходим
DWORD requiredSize;
if( !SetupDiGetDeviceInterfaceDetail(PnPHandle, &DeviceInterfaceData,
NULL, 0, &requiredSize, 0) )
{
DWORD lasterr=GetLastError();
if( lasterr!=ERROR_INSUFFICIENT_BUFFER )
{
return lasterr;
}
}
deviceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_FIXED|LMEM_ZEROINIT, requiredSize);
if (deviceDetail == NULL)
{
return ERROR_NOT_ENOUGH_MEMORY;
}
DbgPrint("Lib: requiredSize=%i", requiredSize);
//все хорошо до этой строчки
deviceDetail->cbSize=requiredSize;
if(
SetupDiGetDeviceInterfaceDetail(PnPHandle, &DeviceInterfaceData,
deviceDetail,
requiredSize, NULL, 0)
)
{
if( sizeof(DetailedData)<requiredSize )
{
LocalFree(deviceDetail);
return ERROR_NOT_ENOUGH_MEMORY;
}
memcpy(&DetailedData, deviceDetail, requiredSize);
LocalFree(deviceDetail);
}
else
{
DWORD lasterr=GetLastError();
DbgPrint("Lib: SetupDiGetDeviceInterfaceDetail error");
if( lasterr==ERROR_INSUFFICIENT_BUFFER )
{
DbgPrint("Lib: lasterr==ERROR_INSUFFICIENT_BUFFER ");
}
else
{
//вот здесь и ошибка ERROR_INVALID_USER_BUFFER в Windows 2003 64-bit,
DbgPrint("Lib: lasterr==%i requiredSize=%i", lasterr, requiredSize);
}
LocalFree(deviceDetail);
return lasterr;
}
}
else
{
DbgPrint("Lib: SetupDiEnumDeviceInterfaces error");
DWORD lasterr=GetLastError();
if( lasterr==ERROR_NO_MORE_ITEMS )
{
DbgPrint("Lib: lasterr==ERROR_NO_MORE_ITEMS ");
}
return lasterr;
}
return 0;
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить