禁用和启用网卡.使用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无线网卡探索初步

 调查了一半,在主要功能上遇到问题,函数执行失败。 最近要忙别的事情,先暂时搁置此事。为了日后的继续调查,先把自己的调查结果整理在此。 Setup api is here: ...

Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.2

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

windows 驱动开发 DDK与WDK WDM的区别

1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK,开发WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发W...

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

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

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

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

windows xp 驱动开发(三)DDK与WDK WDM的区别

转自: http://www.cnblogs.com/hyddd/archive/2009/03/15/1412684.html  最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到...

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

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

windows 驱动开发(二) DDK与WDK WDM的区别

最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到的资料。   1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要...

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

搭建开发环境是开发驱动的第一步,这个搭建的过程还是有点小折腾的,在这儿我遇到的问题记下来,免得日后忘记,也希望可以帮到一些人。   其实问题基本都处在DriverStudio3.2的安装和编译上。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:禁用和启用网卡.使用windows DDK
举报原因:
原因补充:

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