禁用和启用网卡.使用windows DDK

原创 2007年09月22日 00:58:00

 

#include <SetupAPI.h>   
#include 
<cfgmgr32.h>     
#include 
<list>
using namespace std;
//     cfgmgr32.h 在Microsoft Windows 2000 DDK 中.   
//     要用 CM_Get_DevNode_Status(...) 来查询状态.   
//---------------------------------------------------------------------------   
typedef struct  NetCardStruct   
{   
    DWORD    Id;         
// 网卡设备号   
    AnsiString   Name;     // 网卡名   
    bool     Disabled;     // 当前是否禁用   
    bool     Changed;         // 是否更改过   
}
TNetCardStruct;   
typedef TNetCardStruct
*  PNetCardStruct;   
typedef list
<TNetCardStruct> TList;

//---------------------------------------------------------------------------   
//     EnumNetCards 枚举出网卡   
//---------------------------------------------------------------------------   
void  __fastcall EnumNetCards(TList  *NetDeviceList)   
{   
    AnsiString     DevValue;   
    PNetCardStruct NetCard;   
    DWORD  Status, Problem;   
    LPTSTR Buffer   
= NULL;   
    DWORD  BufSize  
= 0;   
    HDEVINFO hDevInfo   
= 0;  

    
if(INVALID_HANDLE_VALUE==(hDevInfo=SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT &brvbar;DIGCF_ALLCLASSES)))   
        
return

    SP_DEVINFO_DATA  DeviceInfoData 
={sizeof(SP_DEVINFO_DATA)};

    HKEY hKeyClass;   
    
char DeviceName[200];   
    
for(DWORD DeviceId=0;SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData);DeviceId++)   
    
{   
        
if (CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst,0!= CR_SUCCESS)   
            
continue;   
        DevValue.SetLength(
0);   
        
if(GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS , &Buffer, (PULONG)&BufSize))   
            DevValue 
= Buffer;   

        
if (DevValue == "Net")   
        
{   
            DevValue.SetLength(
0);   

            
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_ENUMERATOR_NAME , &Buffer, (PULONG)&BufSize))   
                DevValue 
= Buffer;   

            
if (DevValue != "ROOT")   
            
{   
                NetCard 
= new TNetCardStruct;   
                NetCard
->Id = DeviceId;   
                NetCard
->Name = "<Unknown Device>";   
                
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER , &Buffer, (PULONG)&BufSize))   
                    
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC , &Buffer, (PULONG)&BufSize))   
                        NetCard
->Name = Buffer;   
                NetCard
->Disabled = (Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem);   
                NetCard
->Changed = false;   
                NetDeviceList
->Add(NetCard);   
            }
   
        }
   
    }
   
}
   

//---------------------------------------------------------------------------   
bool __fastcall GetRegistryProperty(HDEVINFO DeviceInfoSet,   
                                    PSP_DEVINFO_DATA DeviceInfoData, 
                                    ULONG Property, 
                                    PVOID Buffer,
                                    PULONG Length)   
{   
    
while (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,   
        DeviceInfoData, Property, NULL, (BYTE 
*)*(TCHAR **)Buffer, *Length, Length))   
    
{   
        
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)   
        
{   
            
if (*(LPTSTR *)Buffer) LocalFree(*(LPTSTR *)Buffer);   
            
*(LPTSTR *)Buffer = (PCHAR)LocalAlloc(LPTR,*Length);   
        }
   
        
else return false;   
    }
   
    
return (*(LPTSTR *)Buffer)[0];   
}
   


//---------------------------------------------------------------------------   
//     NetCardStateChange 网卡的启用与禁用   
//             NetCardPoint 是 PNetCardStruct 的指针.   
//             Enabled     true = 启用     false = 禁用   
//---------------------------------------------------------------------------   
bool __fastcall 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 &brvbar;DIGCF_ALLCLASSES)))   
        
return false;   
    SP_DEVINFO_DATA DeviceInfoData 
= ;   
    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 
= ;   
    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;   
}
  
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

windows驱动开发技术详解 VC6与DDK搭配使用的设置 .

在《windows驱动开发技术详解》中作者提供了两种调式内核程序的方法,有两种编译驱动的办法,一种是用DDK环境来编译,需要在源代码所在目录下创建两个文件makefile和Sources,另一种为vc...

windows XP下驱动开发环境设置(DDK+VC6.0)

通常驱动程序的调试都是用ddk在cmd中完成的。这部分我暂时略过。下面先介绍如何设置vc++6.0在Visual Studio 6.0集成环境中开发设备驱动程序的方法。 在Windows上,Wind...
  • witxjp
  • witxjp
  • 2012-10-17 14:23
  • 1820

Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.2

Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.21·前言开发windows内核驱动程序是一个非常具有挑战性的工作,你得忍耐调试过程中操作系统 不断蓝...

Windows驱动开发VS2012 DDK/WDK的环境配置

[作者简介]      常用网名: 灯火阑珊     出生日期: 1995.XX.XX     生理特征: 男     个人网站: geons.cn     E-mail:   &...

windows XP下驱动开发环境设置(DDK+VC6.0)

[转]windows XP下驱动开发环境设置(DDK+VC6.0) 0 推荐 windows XP下驱动开发环境设置(DDK+VC6.0) 通常驱动程序的调试都是用ddk在...

Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.2 找来的,说的很全面

Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.2 1·前言 开发windows内核驱动程序是一个非常具有挑战性的工作,你得忍耐调试过程中操作系统...

Visual Studio2005 Windows XP DDK DriverStudio3.2 安装的一些说明

搭建开发环境是开发驱动的第一步,这个搭建的过程还是有点小折腾的,在这儿我遇到的问题记下来,免得日后忘记,也希望可以帮到一些人。   其实问题基本都处在DriverStudio3.2的安装和编译上。...

Windows使用C++获取网卡信息

使用 Windows sdk 提供的 API 函数 GetAdaptersInfo() 可以获得本机所有网卡的网卡名 , 网卡描述 , 网卡 MAC 地址 , 网卡IP , 网卡类型等信息 , 并用 ...

windows下使用WinPcap获取网卡列表

虽然看了挺多资料,不过实际做起来还是比较麻烦,这里总结下,一下在VC6.0运行通过 1.去网上下载winPcap安装包和开发人员包:http://www.winpcap.org/   在WpdP...
  • mzlqh
  • mzlqh
  • 2012-05-04 20:56
  • 4678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)