SetupDiGetDeviceInterfaceDetail в Windows 2003 64-bit
От: Слава_2 Беларусь  
Дата: 30.05.07 12:41
Оценка:
Вызов функции SetupDiGetDeviceInterfaceDetail, который нормально работает в Windows'98 — Windows 2003 (32-bit) возвращает ошибку 1784 ERROR_INVALID_USER_BUFFER — The supplied user buffer is not valid for the requested operation.
Предварительный вызов SetupDiEnumDeviceInterfaces проходит успешно.

struct _TDetailedData
{
DWORD cbSize;
char DevicePath[260];
}TDetailedData;

TDetailedData DetailedData;
DetailedData.cbSize = 5;
if(
SetupDiGetDeviceInterfaceDetail(PnPHandle, &DeviceInterfaceData,
PSP_INTERFACE_DEVICE_DETAIL_DATA(&DetailedData),
sizeof(DWORD)+sizeof(DetailedData), NULL, 0)
)

Исходники были перекомпилированы в Visual Studio 2005 с использованием библиотек для AMD64 (Поддержка x64 для Visual Studio включена).
Кто-нибудь сталкивался с подобной проблемой? И если да, то как ее решил.
Re: SetupDiGetDeviceInterfaceDetail в Windows 2003 64-bit
От: g_i  
Дата: 30.05.07 12:46
Оценка:
Здравствуйте, Слава_2, Вы писали:

Using the SetupDiGetDeviceInterfaceDetail function to get details about an interface is typically a two-step process:
1 Get the required buffer size. Call SetupDiGetDeviceInterfaceDetail with a NULL DeviceInterfaceDetailData pointer, a DeviceInterfaceDetailDataSize of zero, and a valid RequiredSize parameter. In response to such a call, this function fails, GetLastError returns ERROR_INSUFFICIENT_BUFFER, and the RequiredSize parameter receives the required buffer size.
2 Allocate an appropriately sized buffer and call the function again to get the interface details.
Re[2]: SetupDiGetDeviceInterfaceDetail в Windows 2003 64-bit
От: g_i  
Дата: 30.05.07 13:07
Оценка:
Здравствуйте, g_i, Вы писали:

g_i>Здравствуйте, Слава_2, Вы писали:


А... оно не про то. Поспешил. )
Re: SetupDiGetDeviceInterfaceDetail в Windows 2003 64-bit
От: Аноним  
Дата: 30.05.07 13:14
Оценка:
Здравствуйте, Слава_2, Вы писали:

С_>Вызов функции SetupDiGetDeviceInterfaceDetail, который нормально работает в Windows'98 — Windows 2003 (32-bit) возвращает ошибку 1784 ERROR_INVALID_USER_BUFFER — The supplied user buffer is not valid for the requested operation.

С_>Предварительный вызов SetupDiEnumDeviceInterfaces проходит успешно.

С_>struct _TDetailedData

С_>{
С_> DWORD cbSize;
С_> char DevicePath[260];
С_>}TDetailedData;
С_> TDetailedData DetailedData;
А зачем так? Почему не использовать структуру, описанную в setupapi.h?


С_> DetailedData.cbSize = 5;

И вот это жутковато выглядит. Оно что зовет, в итоге, юникодный вариант или ансишный (SetupDiGetDeviceInterfaceDetail)?


С_> if(

С_> SetupDiGetDeviceInterfaceDetail(PnPHandle, &DeviceInterfaceData,
С_> PSP_INTERFACE_DEVICE_DETAIL_DATA(&DetailedData),
С_> sizeof(DWORD)+sizeof(DetailedData), NULL, 0)
С_> )

С_>Исходники были перекомпилированы в Visual Studio 2005 с использованием библиотек для AMD64 (Поддержка x64 для Visual Studio включена).

С_>Кто-нибудь сталкивался с подобной проблемой? И если да, то как ее решил.
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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.