找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 985|回复: 1

[求助]:谁能帮我编译这个定时开启网卡源程序成软件?

[复制链接]
发表于 2007-7-6 14:21:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我想定时关闭\开启网卡来控制上网时间,在网上找到了这个源程序,但不会用,请高手帮忙一下,十分谢谢!我的邮箱:gxqf888@163.com[/COLOR]


在google以及csdn上搜索了一下关于网卡禁用的程序,发现所示用的方法都一样,都是使用SetupAPI相关函数,本人也用同样方法写了一个程序,但是发现一个问题(在2k以及XP下都有),使用程序启用和禁用网卡都很正常,但如果是手工禁用网卡(在设备管理器中选择网卡,并停用),则无法用程序启用,而程序却报告启用成功,事实上此时网卡无法使用。本人登陆OS是Administrator身份。现将程序贴上,希望大家指点迷津。   
  #include   <windows.h>   
  #include   <SetupAPI.h>   
  #include   <stdio.h>   
  #include   <tchar.h>   
   
  #pragma   comment(lib,"setupapi.lib")   
   
  DWORD   CtrlNetcard(BOOL   bStatus);   
   
  void   _tmain(int   arg,   TCHAR**   argv)   
  {   
  BOOL   b   =   FALSE;   
  DWORD   err   =   0;   
  if(2   ==   arg)   
  {   
  argv++;   
  if(!_tcsicmp(TEXT("enable"),   *argv))   
  {   
  b   =   TRUE;   
  err   =   CtrlNetcard(TRUE);   
  }   
  else   if(!_tcsicmp(TEXT("disable"),   *argv))   
  {   
  b   =   FALSE;   
  err   =   CtrlNetcard(FALSE);   
  }   
  else   
  {   
  goto   main_end;   
  }   
   
  _tprintf("\n%s   NetAdapter   %s   !\n",   
  b   ?   TEXT("Enable")   :   TEXT("Disable"),   
  err   ?   TEXT("fail")   :   TEXT("success"));   
  return;   
   
  }   
  main_end:   
  _tprintf(TEXT("\nenable   NetCard:   enable"));   
  _tprintf(TEXT("\ndisable   NetCard:   disable\n"));   
   
  }   
   
  DWORD   CtrlNetcard(BOOL   bStatus)   
  {   
  LPCTSTR   HardwareId   =   TEXT("{4D36E972-E325-11CE-BFC1-08002BE10318}");   
  GUID   g   =   {0X4D36E972,   0XE325,   0X11CE,   {0XBF,   0XC1,   0X08,   0X00,   0X2B,   0XE1,   0X03,   0X18}};   
          DWORD   NewState     =   0;   
  //调用ddk函数,来禁用网卡           
          DWORD   i   =   0,   err   =   0;   
      
          HDEVINFO   hDevInfo   =   NULL;   
          SP_DEVINFO_DATA   spDevInfoData   =   {0};   
   
  NewState   =   bStatus   ?   DICS_ENABLE   :   DICS_DISABLE;   
   
          //访问系统的硬件库   
          hDevInfo   =   SetupDiGetClassDevs(NULL,   TEXT("PCI"),   NULL,   DIGCF_ALLCLASSES   |   DIGCF_PRESENT);   
          if(INVALID_HANDLE_VALUE   ==   hDevInfo)   
          {   
                  _tprintf(TEXT("访问系统硬件出错!"));   
                  return   GetLastError();   
          }   
   
          //枚举硬件,获得需要的接口   
          spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);   
  memcmp(&(spDevInfoData.ClassGuid),   &g,   sizeof(GUID));   
   
          for(i   =   0;   SetupDiEnumDeviceInfo(hDevInfo,   i,   &spDevInfoData);   i++)   
          {   
   
  PBYTE   PropertyBuffer   =   NULL;   
  DWORD   PropertyBufferSize   =   0;   
   
                  //获得硬件的属性值   
   
                  while(!SetupDiGetDeviceRegistryProperty(   
  hDevInfo,   
  &spDevInfoData,   
  SPDRP_CLASSGUID,   
  NULL,   
  PropertyBuffer,   
  PropertyBufferSize,   
  &PropertyBufferSize))   
                  {   
                          if(ERROR_INSUFFICIENT_BUFFER   ==   GetLastError())   
                          {   
                                  if(PropertyBuffer)   
  {   
  free(PropertyBuffer);   
  }   
  PropertyBuffer   =   (PBYTE)malloc(PropertyBufferSize);   
                          }   
                          else   
                          {   
                                  break;   
                          }   
                  }   
   
                  if(!PropertyBuffer)   
  {   
  continue;   
  }   
   
  if(!_tcsicmp(HardwareId,   (LPTSTR)PropertyBuffer))   
                  {   
  SP_PROPCHANGE_PARAMS   spPropChangeParams   ;   
                           
  free(PropertyBuffer);   
   
                          spPropChangeParams.ClassInstallHeader.cbSize   =   sizeof(SP_CLASSINSTALL_HEADER);   
                          spPropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;   
                          spPropChangeParams.Scope   =   DICS_FLAG_GLOBAL;   
                          spPropChangeParams.StateChange   =   NewState;   
   
                          if(!SetupDiSetClassInstallParams(hDevInfo,&spDevInfoData,(SP_CLASSINSTALL_HEADER*)&spPropChangeParams,sizeof(spPropChangeParams)))   
                          {   
  err   =   GetLastError();   
  goto   cleanup_DeviceInfo;   
                          }   
                           
                          if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&spDevInfoData))   
                          {   
  err   =   GetLastError();   
  goto   cleanup_DeviceInfo;   
                          }   
   
  }   
  else   
  {   
  free(PropertyBuffer);   
  }   
                    
          }   
   
  cleanup_DeviceInfo   :   
   
          SetupDiDestroyDeviceInfoList(hDevInfo);   
            
          return   err;   
  }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-7-9 13:45:21 | 显示全部楼层
小伙子很厉害的,编这个不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-24 19:15 , Processed in 0.209002 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表