启用\禁用windows无线网卡探索初步



调查了一半,在主要功能上遇到问题,函数执行失败。

最近要忙别的事情,先暂时搁置此事。为了日后的继续调查,先把自己的调查结果整理在此。

Setup api is here

http://msdn.microsoft.com/en-us/library/windows/hardware/ff550897(v=vs.85).aspx

 

1.列出当前网卡

SetupDiEnumDeviceInfo

2.找出当前无线网卡的名字(用natvie wifi api

3.卸载\安装此驱动

问题:

log为:SetupDiSetClassInstallParams failed. -536870347

 

完整代码如下:

// ControlWirelessCard.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <SetupAPI.h>
#include <devguid.h>
#include <string>
#include <cfgmgr32.h>
#include <wlanapi.h>
#pragma comment(lib,"setupapi.lib")
#pragma comment(lib, "wlanapi.lib")
using namespace std;

wstring getWirelessNetworkCardName()
{
    wstring wirelessName;
    HANDLE hClient = NULL;
    DWORD dwMaxClient = 2;      //    
    DWORD dwCurVersion = 0;
    DWORD dwResult = 0;
    DWORD dwRetVal = 0;
    int iRet = 0;    
    WCHAR GuidString[39] = {0};
    unsigned int i;

    /* variables used for WlanEnumInterfaces  */
    PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
    PWLAN_INTERFACE_INFO pIfInfo = NULL;   
     
    dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
    if (dwResult != ERROR_SUCCESS) {
        wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult);
        return wirelessName;
    }

    dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
    if (dwResult != ERROR_SUCCESS) {
        wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
        return wirelessName;        
    } else {
		PWLAN_AVAILABLE_NETWORK_LIST pWLAN_AVAILABLE_NETWORK_LIST = NULL;
        dwResult = WlanGetAvailableNetworkList(hClient, &pIfList->InterfaceInfo[0].InterfaceGuid,
                WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES,
                NULL, &pWLAN_AVAILABLE_NETWORK_LIST);
        if (dwResult != ERROR_SUCCESS)
        {            
			printf("WlanGetAvailableNetworkList failed with error: %u\n",dwResult);
            WlanFreeMemory(pWLAN_AVAILABLE_NETWORK_LIST);
            return wirelessName;
        }        

        for (i = 0; i < (int) pIfList->dwNumberOfItems; i++) {
            pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];
            iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString, 
                sizeof(GuidString)/sizeof(*GuidString)); 
   
            wirelessName = pIfInfo->strInterfaceDescription;
        }
    }
    return wirelessName;
}

BOOL changeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)
{
    LPTSTR lpszMsg = NULL;
    HCURSOR hCursor = NULL;
    try
    {
        SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
        SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; 

        hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
        // Get a handle to the Selected Item.
        if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
        {
            wprintf(L"SetupDiEnumDeviceInfo failed. %d\n",GetLastError());
            throw lpszMsg;
        }

        // Set the PropChangeParams structure.
        PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        PropChangeParams.Scope = DICS_FLAG_GLOBAL;
        PropChangeParams.StateChange = NewStatus;

        if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
        sizeof(PropChangeParams)))
        {
            wprintf(L"SetupDiSetClassInstallParams failed. %d\n",GetLastError());
            throw lpszMsg;
        }
        // Call the ClassInstaller and perform the change.
        if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))
        {
            wprintf(L"SetupDiCallClassInstaller failed. %d\n",GetLastError());
            throw lpszMsg;
        }
        SetCursor(hCursor); 
        return TRUE;
    }
    catch (TCHAR * pszError)
    {
        SetCursor(hCursor);
        if (NULL != lpszMsg)
        {
            LocalFree((HLOCAL)lpszMsg);
        } 
        return FALSE;
    } 
}

int _tmain(int argc, _TCHAR* argv[])
{    
    LPTSTR lpszMsg = NULL;
     try
     {
         /*
         TCHAR * GUIDString = NULL;
         GUID guid;
         ZeroMemory(&guid, sizeof(GUID));
         GUIDString = _T("4d36e972-e325-11ce-bfc1-08002be10318");
         UuidFromString((unsigned char *)GUIDString, &guid);
         */
         //GUID guid = getWirelessNetworkCardGUID();
         HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET,/*L"WIRELESS"*/NULL,NULL,DIGCF_PRESENT);
         //HDEVINFO hDevInfo = SetupDiGetClassDevs(&guid,/*L"WIRELESS"*/NULL,NULL,DIGCF_PRESENT);
         if (INVALID_HANDLE_VALUE == hDevInfo)
         {
            wprintf(L"INVALID_HANDLE_VALUE");
            return -1;
         }

         DWORD i;
         int Icount=0;
         SP_DEVINFO_DATA DeviceInfoData;
         ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
         DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

         for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
         {
              //Get DeviceInfo            
             LPTSTR buffer = NULL;
             DWORD buffersize = 0;
             DWORD Status, Problem; 
             BOOL bDisabled = FALSE; 
            while (!SetupDiGetDeviceRegistryProperty(
                    hDevInfo,
                    &DeviceInfoData,
                    SPDRP_DEVICEDESC, //Read the names of the designated card
                    NULL,
                    (PBYTE) buffer,
                    buffersize,
                    &buffersize)
                )
             {
                 if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
                 {                
                     if (buffer) LocalFree(buffer);
                    buffer=(LPTSTR)LocalAlloc(LPTR,buffersize);  
                 }
                 else
                 { 
                    wprintf(L"read network card failed!");
                 }
             }

             std::wstring strEthernet = buffer;
             //wprintf(L"the buffer is %ws\n",buffer);

             wstring wirelessName = getWirelessNetworkCardName();
             if(wirelessName.empty())
             {
                 wprintf(L"wirelessName IS empty\n");
                 return -1;
             }
             //wprintf(L"wirelessName is %ws\n",wirelessName);

             if(wirelessName == buffer)
             {
                 wprintf(L"Found the wireless card: %ws\n",wirelessName);
                 if (int i= CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst,0) != CR_SUCCESS) 
                 {    
                     wprintf(L"CM_Get_DevNode_Status failed. %d\n",GetLastError());
                    throw "failed\n";
                 }
                 if (!((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))) 
                 {  
                     bDisabled = FALSE;
                 } 
                 if ((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem)) 
                 {  
                     bDisabled = TRUE; 
                 } 
                 if(bDisabled==FALSE)
                 { 
                     wprintf(L"disable the network card\n");
                     changeStatus(DICS_DISABLE, i, hDevInfo);//disable
                 }
                 if(bDisabled==TRUE)
                 { 
                     wprintf(L"enable the network card\n");
                     changeStatus(DICS_ENABLE, i, hDevInfo);// enable
                 }
             }         
         }
         return SetupDiDestroyDeviceInfoList(hDevInfo);
     }
     catch (TCHAR * pszError)
     {    
         if (NULL != lpszMsg)
         {
            LocalFree((HLOCAL)lpszMsg);
         } 
        return FALSE;
     }
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值