// //////////////////////////////////////////////////////////////////////////////// // @private StateChange // static BOOL StateChange(DWORD NewState, DWORD SelectedItem,HDEVINFO hDevInfo) { SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)}; SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; if ( !SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData) ) { return FALSE; } PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; PropChangeParams.Scope = DICS_FLAG_GLOBAL; PropChangeParams.StateChange = NewState; if ( !SetupDiSetClassInstallParams( hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams, sizeof(PropChangeParams)) ) { return FALSE; } if ( !SetupDiCallClassInstaller( DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData) ) { return TRUE; } return TRUE; }
// 创建自定义的属性页 DWORD PropPageCY001( __in HDEVINFO DeviceInfoSet, __in PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ) { HPROPSHEETPAGE pageHandle; PROPSHEETPAGE page; SP_ADDPROPERTYPAGE_DATA AddPropertyPageData = {0}; if (DeviceInfoData==NULL) { return ERROR_DI_DO_DEFAULT; } AddPropertyPageData.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); // 属性表单的详细定义,保存在类安装参数结构体中。 // 下面的做法主要分成三步: // 1. 取结构体 // 2. 创建新页面,并修改结构体 // 3. 存结构体 if (SetupDiGetClassInstallParams(DeviceInfoSet, DeviceInfoData, (PSP_CLASSINSTALL_HEADER)&AddPropertyPageData, sizeof(SP_ADDPROPERTYPAGE_DATA), NULL )) { // 存在一个最大页数,不能超过 if(AddPropertyPageData.NumDynamicPages >= MAX_INSTALLWIZARD_DYNAPAGES) { return NO_ERROR; } // 创建一个新页面 memset(&page, 0, sizeof(PROPSHEETPAGE)); page.dwSize = sizeof(PROPSHEETPAGE); page.dwFlags = 0; page.hInstance = ModuleInstance; page.pszTemplate = MAKEINTRESOURCE(DLG_TOASTER_PORTSETTINGS); page.pfnDlgProc = CY001PageProc; page.pfnCallback = NULL; page.lParam = 0; pageHandle = CreatePropertySheetPage(&page); if(!pageHandle) { return NO_ERROR; } // 添加新的属性页,并重新设置给类设备 AddPropertyPageData.DynamicPages[ AddPropertyPageData.NumDynamicPages++]=pageHandle; SetupDiSetClassInstallParams(DeviceInfoSet, DeviceInfoData, (PSP_CLASSINSTALL_HEADER)&AddPropertyPageData, sizeof(SP_ADDPROPERTYPAGE_DATA)); } return NO_ERROR; }
DWORD AddPropertyPageAdvanced(_In_ DI_FUNCTION InstallFunction, _In_ HDEVINFO hDeviceInfoSet, _In_ PSP_DEVINFO_DATA pDeviceInfoData) { SP_ADDPROPERTYPAGE_DATA addPropertyPageData; HPROPSHEETPAGE hPropSheetPage; PROPSHEETPAGE propSheetPage; PCOISANE_Data privateData; HANDLE hActCtx, hHeap; HINSTANCE hInstance; BOOL res; hActCtx = GetActivationContext(); hInstance = GetModuleInstance(); if (!hInstance) return ERROR_OUTOFMEMORY; hHeap = GetProcessHeap(); if (!hHeap) return ERROR_OUTOFMEMORY; ZeroMemory(&addPropertyPageData, sizeof(addPropertyPageData)); addPropertyPageData.ClassInstallHeader.cbSize = sizeof(addPropertyPageData.ClassInstallHeader); addPropertyPageData.ClassInstallHeader.InstallFunction = InstallFunction; res = SetupDiGetClassInstallParams(hDeviceInfoSet, pDeviceInfoData, &addPropertyPageData.ClassInstallHeader, sizeof(addPropertyPageData), NULL); if (!res) return GetLastError(); if (addPropertyPageData.NumDynamicPages >= MAX_INSTALLWIZARD_DYNAPAGES) return NO_ERROR; privateData = (PCOISANE_Data) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(COISANE_Data)); if (!privateData) return ERROR_OUTOFMEMORY; privateData->hHeap = hHeap; privateData->hInstance = hInstance; privateData->hDeviceInfoSet = hDeviceInfoSet; privateData->pDeviceInfoData = pDeviceInfoData; ZeroMemory(&propSheetPage, sizeof(propSheetPage)); propSheetPage.dwSize = sizeof(propSheetPage); propSheetPage.dwFlags = PSP_USECALLBACK; propSheetPage.hActCtx = hActCtx; propSheetPage.hInstance = hInstance; propSheetPage.pfnDlgProc = &DialogProcPropertyPageAdvanced; propSheetPage.pfnCallback = &PropSheetPageProcPropertyPageAdvanced; propSheetPage.pszTemplate = MAKEINTRESOURCE(IDD_PROPERTIES); propSheetPage.lParam = (LPARAM) privateData; hPropSheetPage = CreatePropertySheetPage(&propSheetPage); if (!hPropSheetPage) return GetLastError(); addPropertyPageData.DynamicPages[addPropertyPageData.NumDynamicPages++] = hPropSheetPage; res = SetupDiSetClassInstallParams(hDeviceInfoSet, pDeviceInfoData, &addPropertyPageData.ClassInstallHeader, sizeof(addPropertyPageData)); if (!res) return GetLastError(); return NO_ERROR; }
static int ti_reset_state(HDEVINFO *hdi, SP_DEVINFO_DATA *did, DWORD state) { SP_PROPCHANGE_PARAMS parm; parm.ClassInstallHeader.cbSize = sizeof(parm.ClassInstallHeader); parm.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; parm.Scope = DICS_FLAG_GLOBAL; parm.StateChange = state; if (!SetupDiSetClassInstallParams(*hdi, did, (SP_CLASSINSTALL_HEADER*) &parm, sizeof(parm))) return -1; if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, *hdi, did)) return -1; return 0; }
static BOOL StopDevice(HDEVINFO info, SP_DEVINFO_DATA *dev_info_data) { SP_PROPCHANGE_PARAMS p; if (info == NULL || dev_info_data == NULL) { return FALSE; } memset(&p, 0, sizeof(p)); p.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); p.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; p.StateChange = DICS_DISABLE; p.Scope = DICS_FLAG_CONFIGSPECIFIC; if (SetupDiSetClassInstallParams(info, dev_info_data, &p.ClassInstallHeader, sizeof(p)) == FALSE || SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, info, dev_info_data) == FALSE) { return FALSE; } return TRUE; }
BOOL DeleteDevice(HDEVINFO info, SP_DEVINFO_DATA *dev_info_data) { SP_REMOVEDEVICE_PARAMS p; SP_DEVINFO_LIST_DETAIL_DATA detail; char device_id[MAX_PATH]; if (info == NULL || dev_info_data == NULL) { return FALSE; } memset(&detail, 0, sizeof(detail)); detail.cbSize = sizeof(detail); if (SetupDiGetDeviceInfoListDetail(info, &detail) == FALSE || CM_Get_Device_ID_Ex(dev_info_data->DevInst, device_id, sizeof(device_id), 0, detail.RemoteMachineHandle) != CR_SUCCESS) { logError("CM_Get_Device_ID_Ex: %x\n", GetLastError()); return FALSE; } memset(&p, 0, sizeof(p)); p.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); p.ClassInstallHeader.InstallFunction = DIF_REMOVE; p.Scope = DI_REMOVEDEVICE_GLOBAL; if (SetupDiSetClassInstallParams(info, dev_info_data, &p.ClassInstallHeader, sizeof(p)) == FALSE) { logError("SetupDiSetClassInstallParams: %x\n", GetLastError()); return FALSE; } if (SetupDiCallClassInstaller(DIF_REMOVE, info, dev_info_data) == FALSE) { logError("SetupDiCallClassInstaller: %x\n", GetLastError()); return FALSE; } return TRUE; }
BOOL CDevice::Restart() { SP_PROPCHANGE_PARAMS params; // initialize the structure memset(¶ms, 0, sizeof(params)); // initialize the SP_CLASSINSTALL_HEADER struct at the beginning // of the SP_PROPCHANGE_PARAMS struct, so that // SetupDiSetClassInstallParams will work params.ClassInstallHeader.cbSize = sizeof(params.ClassInstallHeader); params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; // initialize SP_PROPCHANGE_PARAMS such that the device will be // stopped. params.StateChange = DICS_PROPCHANGE; params.Scope = DICS_FLAG_CONFIGSPECIFIC; params.HwProfile = 0; // current profile if(!SetupDiSetClassInstallParams(m_hDev, &m_hDevInfo, (PSP_CLASSINSTALL_HEADER) ¶ms,sizeof(SP_PROPCHANGE_PARAMS))) { return FALSE; } // we call SetupDiCallClassInstaller() twice for the ECI USB ADSL // modem, maybe because it is 2 USB devices. But this is not // needed for all USB devices, so it's better for the end user to // hit the button "replug" twice. if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, m_hDev, &m_hDevInfo)) { return FALSE; } return TRUE; }
static bool ChangeState(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, DWORD stateChange) { SP_PROPCHANGE_PARAMS propChangeParams; memset(&propChangeParams, 0, sizeof(propChangeParams)); propChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); propChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; propChangeParams.StateChange = stateChange; propChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC; propChangeParams.HwProfile = 0; if (!SetupDiSetClassInstallParams(hDevInfo, pDevInfoData, (SP_CLASSINSTALL_HEADER *)&propChangeParams, sizeof(propChangeParams))) { ShowLastError(MB_OK|MB_ICONSTOP, "SetupDiSetClassInstallParams()"); return FALSE; } if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, pDevInfoData)) { ShowLastError(MB_OK|MB_ICONSTOP, "SetupDiCallClassInstaller(DIF_PROPERTYCHANGE)"); return FALSE; } return TRUE; }
VOID DisableNetworkAdapter(INetConnection * pNet, LANSTATUSUI_CONTEXT * pContext, HWND hwndDlg) { HKEY hKey; NETCON_PROPERTIES * pProperties; LPOLESTR pDisplayName; WCHAR szPath[200]; DWORD dwSize, dwType; LPWSTR pPnp; HDEVINFO hInfo; SP_DEVINFO_DATA DevInfo; SP_PROPCHANGE_PARAMS PropChangeParams; BOOL bClose = FALSE; NOTIFYICONDATAW nid; if (FAILED(pNet->GetProperties(&pProperties))) return; hInfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT ); if (!hInfo) { NcFreeNetconProperties(pProperties); return; } if (FAILED(StringFromCLSID((CLSID)pProperties->guidId, &pDisplayName))) { NcFreeNetconProperties(pProperties); SetupDiDestroyDeviceInfoList(hInfo); return; } NcFreeNetconProperties(pProperties); if (FindNetworkAdapter(hInfo, &DevInfo, pDisplayName)) { PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; //; PropChangeParams.StateChange = DICS_DISABLE; PropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC; PropChangeParams.HwProfile = 0; if (SetupDiSetClassInstallParams(hInfo, &DevInfo, &PropChangeParams.ClassInstallHeader, sizeof(SP_PROPCHANGE_PARAMS))) { if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hInfo, &DevInfo)) bClose = TRUE; } } SetupDiDestroyDeviceInfoList(hInfo); swprintf(szPath, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pDisplayName); CoTaskMemFree(pDisplayName); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) return; dwSize = 0; if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, &dwType, NULL, &dwSize) != ERROR_SUCCESS || dwType != REG_SZ) { RegCloseKey(hKey); return; } pPnp = static_cast<PWSTR>(CoTaskMemAlloc(dwSize)); if (!pPnp) { RegCloseKey(hKey); return; } if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, &dwType, (LPBYTE)pPnp, &dwSize) != ERROR_SUCCESS) { CoTaskMemFree(pPnp); RegCloseKey(hKey); return; } RegCloseKey(hKey); swprintf(szPath, L"System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Enum\\%s", pPnp); CoTaskMemFree(pPnp); if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szPath, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) return; dwSize = 1; /* enable = 0, disable = 1 */ RegSetValueExW(hKey, L"CSConfigFlags", 0, REG_DWORD, (LPBYTE)&dwSize, sizeof(DWORD)); RegCloseKey(hKey); if (!bClose) return; PropSheet_PressButton(GetParent(hwndDlg), PSBTN_CANCEL); ZeroMemory(&nid, sizeof(nid)); nid.cbSize = sizeof(nid); nid.uID = pContext->uID; nid.hWnd = pContext->hwndDlg; nid.uFlags = NIF_STATE; nid.dwState = NIS_HIDDEN; nid.dwStateMask = NIS_HIDDEN; Shell_NotifyIconW(NIM_MODIFY, &nid); }
bool remove(const std::wstring& hardware_id, bool& reboot_required) { bool result = false; HDEVINFO devices = SetupDiGetClassDevsEx(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT, NULL, NULL, NULL); if (devices != INVALID_HANDLE_VALUE) { std::wcerr << "Got device information set." << std::endl; SP_DEVINFO_LIST_DETAIL_DATA device_info_list_detail; memset(&device_info_list_detail, 0x00, sizeof(device_info_list_detail)); device_info_list_detail.cbSize = sizeof(device_info_list_detail); if (SetupDiGetDeviceInfoListDetail(devices, &device_info_list_detail)) { std::wcerr << "Got device information list details." << std::endl; SP_DEVINFO_DATA device_info; device_info.cbSize = sizeof(device_info); for (DWORD index = 0; SetupDiEnumDeviceInfo(devices, index, &device_info); ++index) { TCHAR device_id[MAX_DEVICE_ID_LEN]; if (CM_Get_Device_ID_Ex(device_info.DevInst, device_id, MAX_DEVICE_ID_LEN, 0, device_info_list_detail.RemoteMachineHandle) == CR_SUCCESS) { std::list<std::wstring> device_hardware_id_list; if (getDeviceProperty(devices, device_info, SPDRP_HARDWAREID, device_hardware_id_list)) { bool match = false; for (std::list<std::wstring>::const_iterator device_hardware_id = device_hardware_id_list.begin(); device_hardware_id != device_hardware_id_list.end(); ++device_hardware_id) { if (*device_hardware_id == hardware_id) { match = true; break; } } if (match) { std::wstring friendly_name; if (getDeviceProperty(devices, device_info, SPDRP_FRIENDLYNAME, friendly_name) && (friendly_name.length() > 0)) { std::wcerr << "Removing device: " << friendly_name << " (" << device_id << ")" << std::endl; } else { std::wcerr << "Removing device: " << device_id << std::endl; } SP_REMOVEDEVICE_PARAMS remove_device_params; remove_device_params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); remove_device_params.ClassInstallHeader.InstallFunction = DIF_REMOVE; remove_device_params.Scope = DI_REMOVEDEVICE_GLOBAL; remove_device_params.HwProfile = 0; result = true; if (!SetupDiSetClassInstallParams(devices, &device_info, &remove_device_params.ClassInstallHeader, sizeof(remove_device_params)) || !SetupDiCallClassInstaller(DIF_REMOVE, devices, &device_info)) { std::wcerr << "Failed to set the class installer." << std::endl; result = false; } if (result) { reboot_required = false; SP_DEVINSTALL_PARAMS device_params; if (SetupDiGetDeviceInstallParams(devices, &device_info, &device_params)) { if (device_params.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT)) { reboot_required = true; } } } } } } } } SetupDiDestroyDeviceInfoList(devices); } return result; }
static BOOL ChangeStatus( DWORD dwNewStatus, DWORD dwSelectedItem, HDEVINFO hDevInfo ) { BOOL bRet = TRUE; TRY { SP_DEVINFO_DATA DeviceInfoData; ZeroMemory( &DeviceInfoData, sizeof( SP_DEVINFO_DATA ) ); DeviceInfoData.cbSize = sizeof( SP_DEVINFO_DATA ); // Get a handle to the Selected Item if ( !SetupDiEnumDeviceInfo( hDevInfo, dwSelectedItem, &DeviceInfoData ) ) { bRet = FALSE; } else { SP_PROPCHANGE_PARAMS PropChangeParams; ZeroMemory( &PropChangeParams, sizeof( SP_PROPCHANGE_PARAMS ) ); PropChangeParams.ClassInstallHeader.cbSize = sizeof( SP_CLASSINSTALL_HEADER ); // Set the PropChangeParams structure PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; PropChangeParams.Scope = DICS_FLAG_GLOBAL; PropChangeParams.StateChange = dwNewStatus; if ( !SetupDiSetClassInstallParams( hDevInfo, &DeviceInfoData, ( SP_CLASSINSTALL_HEADER* )&PropChangeParams, sizeof( PropChangeParams ) ) ) { bRet = FALSE; } else { // Call the ClassInstaller and perform the change if ( !SetupDiCallClassInstaller( DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData ) ) { bRet = FALSE; } else { // // Is Need to restart computer // SP_DEVINSTALL_PARAMS devParams; ZeroMemory( &devParams, sizeof( SP_DEVINSTALL_PARAMS ) ); devParams.cbSize = sizeof( SP_DEVINSTALL_PARAMS ); if ( !SetupDiGetDeviceInstallParams( hDevInfo, &DeviceInfoData, &devParams ) ) { bRet = FALSE; } else { if ( devParams.Flags & ( DI_NEEDRESTART | DI_NEEDREBOOT ) ) { TRACE( _T("\nNeed Restart Computer\n") ); } } } } } } CATCH_ALL( e ) { e->ReportError(); bRet = FALSE; } END_CATCH_ALL return bRet; }
DWORD PropPageProvider( _In_ HDEVINFO DeviceInfoSet, _In_ PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ) /*++ Routine Description: Entry-point for adding additional device manager property sheet pages. Arguments: Return Value: Returns: NO_ERROR, ERROR_DI_DO_DEFAULT, or an error code. --*/ { HPROPSHEETPAGE pageHandle; PROPSHEETPAGE page; PTOASTER_PROP_PARAMS params = NULL; SP_ADDPROPERTYPAGE_DATA AddPropertyPageData = {0}; // // DeviceInfoSet is NULL if setup is requesting property pages for // the device setup class. We don't want to do anything in this // case. // if (DeviceInfoData==NULL) { return ERROR_DI_DO_DEFAULT; } AddPropertyPageData.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); // // Get the current class install parameters for the device // if (SetupDiGetClassInstallParams(DeviceInfoSet, DeviceInfoData, (PSP_CLASSINSTALL_HEADER)&AddPropertyPageData, sizeof(SP_ADDPROPERTYPAGE_DATA), NULL )) { // // Ensure that the maximum number of dynamic pages for the // device has not yet been met // if(AddPropertyPageData.NumDynamicPages >= MAX_INSTALLWIZARD_DYNAPAGES){ return NO_ERROR; } params = HeapAlloc(GetProcessHeap(), 0, sizeof(TOASTER_PROP_PARAMS)); if (params) { // // Save DeviceInfoSet and DeviceInfoData // params->DeviceInfoSet = DeviceInfoSet; params->DeviceInfoData = DeviceInfoData; params->Restart = FALSE; // // Create custom property sheet page // memset(&page, 0, sizeof(PROPSHEETPAGE)); page.dwSize = sizeof(PROPSHEETPAGE); page.dwFlags = PSP_USECALLBACK; page.hInstance = ModuleInstance; page.pszTemplate = MAKEINTRESOURCE(DLG_TOASTER_PORTSETTINGS); page.pfnDlgProc = (DLGPROC) PropPageDlgProc; page.pfnCallback = PropPageDlgCallback; page.lParam = (LPARAM) params; pageHandle = CreatePropertySheetPage(&page); if(!pageHandle) { HeapFree(GetProcessHeap(), 0, params); return NO_ERROR; } // // Add the new page to the list of dynamic property // sheets // AddPropertyPageData.DynamicPages[ AddPropertyPageData.NumDynamicPages++]=pageHandle; SetupDiSetClassInstallParams(DeviceInfoSet, DeviceInfoData, (PSP_CLASSINSTALL_HEADER)&AddPropertyPageData, sizeof(SP_ADDPROPERTYPAGE_DATA)); } } return NO_ERROR; }
bool WinNetCard::NetCardStateChange(void * NetCardPoint, bool Enabled) { PNetCardStruct NetCard = (PNetCardStruct)NetCardPoint; DWORD DeviceId = NetCard->Id; HDEVINFO hDevInfo = 0; if (INVALID_HANDLE_VALUE == (hDevInfo = SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES))) { return false; } /* SetupDiGetClassDevs( (LPGUID) &GUID_DEVCLASS_NET, // GUID_DEVCLASS_NET表示仅列出网络设备 NULL, this->m_hWnd, DIGCF_PRESENT); */ SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; DWORD Status, Problem; if (!SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData)) // return false; if (CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst,0) != CR_SUCCESS) //读取网卡状态 return false; SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)}; PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; PropChangeParams.Scope = DICS_FLAG_GLOBAL; if (Enabled) { if (!((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))) { NetCard->Disabled = false; return false; } PropChangeParams.StateChange = DICS_ENABLE; } else { if ((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem)) { NetCard->Disabled = true; return false; } if (!((Status & DN_DISABLEABLE) && (CM_PROB_HARDWARE_DISABLED != Problem))) return false; PropChangeParams.StateChange = DICS_DISABLE; } if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData,(SP_CLASSINSTALL_HEADER *)&PropChangeParams, sizeof(PropChangeParams))) {//功能:设置网卡有效或无效 return false; } if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData)) { return false; } if (CM_Get_DevNode_Status(&Status, &Problem,DeviceInfoData.DevInst,0) == CR_SUCCESS) { NetCard->Disabled = (Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem); } return true; }