分享

禁用和启用网卡.使用windows DDK - David liao Stl C - ...

 SpringEmpire 2007-09-23
#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;   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多