ApSerg
Зарегистрирован: 20.01.2007 Сообщения: 4
|
Добавлено: Ср Май 30 2007 09:19 Заголовок сообщения: Получение информации устройстве (setupapi.dll) |
|
|
Для включения/отключения сетевых карт я использую setupapi.dll. При переборе устройств, относящихся к классу Network Card {AD498944-762F-11D0-8DCB-00C04FC3358C} вылазит много левоты типа "Минипорт планировщика пакетов" и т.п.
Как это отфильтровать?
И ещё вопрос:
Мой код может включить устройство (сетевой адаптер), только если оно было выключено моим же кодом. Если я выключаю устройство из диспетчера устройств, то включить его не получается, но и ошибок не выдаётся. Ниже привожу исходник функции включающей устройство:
Код: |
extern "C" BOOL _stdcall EnableNic(wchar_t* pName)
{
BOOL bRes;
SP_PROPCHANGE_PARAMS spPropChangeParams;
spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
spPropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
spPropChangeParams.Scope = DICS_FLAG_GLOBAL;
spPropChangeParams.StateChange = DICS_ENABLE;
spPropChangeParams.HwProfile = 0;
SP_DEVINFO_DATA spDevInfoData;
HDEVINFO hDevInfo;
DWORD dwFlags = DIGCF_DEVICEINTERFACE;
bRes = FindDevice(hDevInfo, pName, spDevInfoData, dwFlags);
if(!bRes)
{
return FALSE;
}
bRes = SetupDiSetClassInstallParams(hDevInfo, &spDevInfoData,
(SP_CLASSINSTALL_HEADER*)&spPropChangeParams, sizeof(spPropChangeParams));
if(!bRes)
{
printf("SetupDiSetClassInstallParams(): Error");
return FALSE;
}
bRes = SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &spDevInfoData);
if(!bRes)
{
printf("SetupDiCallClassInstaller(): Error");
return FALSE;
}
return true;
}
BOOL FindDevice(HDEVINFO& hDevInfo, wchar_t* pName,
SP_DEVINFO_DATA& spDevInfoData, DWORD dwFlags)
{
BOOL bSuccess = FALSE;
GUID ClassGuid;
// Network Card GUID
ClassGuid.Data1 = 0xad498944;
ClassGuid.Data2 = 0x762f;
ClassGuid.Data3 = 0x11d0;
ClassGuid.Data4[0] = 0x8d;
ClassGuid.Data4[1] = 0xcb;
ClassGuid.Data4[2] = 0x00;
ClassGuid.Data4[3] = 0xc0;
ClassGuid.Data4[4] = 0x4f;
ClassGuid.Data4[5] = 0xc3;
ClassGuid.Data4[6] = 0x35;
ClassGuid.Data4[7] = 0x8c;
hDevInfo = SetupDiGetClassDevs(&ClassGuid, NULL, NULL, dwFlags);
if(hDevInfo == INVALID_HANDLE_VALUE)
{
return FALSE;
}
spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for(int i=0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
{
DWORD DataT ;
WCHAR buf[MAX_PATH];
DWORD nSize = 0;
if ( !SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData,
SPDRP_DEVICEDESC, &DataT, (PBYTE)buf, sizeof(buf), &nSize) )
{
lstrcpy(buf, L"Unknown");
}
std::wstring StrBuf = buf;
std::wstring StrName = pName;
if(StrBuf == StrName)
{
bSuccess = TRUE;
break;
}
}
return bSuccess;
}
|
Заранее спасибо. |
|