Для включения/отключения сетевых карт я использую 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; }
|
Прошу прощения если вопросы немного не в теме форума. Заранее спасибо. Добавлено через 3 минуты и 35 секундОшибка: biggrin исходник не выключающей, а включающей функции.
|