禁用适配器.docx_第1页
禁用适配器.docx_第2页
禁用适配器.docx_第3页
禁用适配器.docx_第4页
禁用适配器.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include#include#include#include#include#include#include#include/cfgmgr32.h MicrosoftWindows2000DDK中.#include#pragmacomment(lib,setupapi.lib)#defineUNKNOWNDEVICE_T()typedefstruct_DEVICE_INFOSP_DEVINFO_DATADevInfoData; /设备信息包括实例句柄和设备类的GUIDDWORDDevID;/在此次全局的枚举中设备IDTCHAR *lpszDevName;/设备的名称ULONGulDevNameLen;/设备名称的长度BOOLbDisableable;/是否可以被禁用BOOLbDisabled;/是否已经被禁用struct_DEVICE_INFO *pNextDevInfo;/下一个结构块DEVICE_INFO,*LPDEVICE_INFO;DEVICE_INFODevInfo;/设备链表头BOOLIsDisableable(DWORDdwDevID,HDEVINFOhDevInfo);BOOLIsDisabled(DWORDdwDevID,HDEVINFOhDevInfo);BOOLStateChange(DWORDdwNewState,DWORDdwDevID,HDEVINFOhDevInfo);/获得设备注册表中的内容/BOOLGetRegistryProperty(HDEVINFODeviceInfoSet,PSP_DEVINFO_DATADeviceInfoData,ULONGProperty,PVOIDBuffer,PULONGLength) 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 returnfalse; return(BOOL)(*(LPTSTR*)Buffer)0;BOOLEnableDevice(DWORDdwDevID,HDEVINFOhDevInfo)returnStateChange(DICS_ENABLE,dwDevID,hDevInfo);BOOLDisableDevice(DWORDdwDevID,HDEVINFOhDevInfo)returnStateChange(DICS_DISABLE,dwDevID,hDevInfo);BOOLControlDevice(DWORDdwDevID,HDEVINFOhDevInfo)BOOLbCanDisable; bCanDisable=(IsDisableable(dwDevID,hDevInfo)&(!IsDisabled(dwDevID,hDevInfo); if(bCanDisable)returnDisableDevice(dwDevID,hDevInfo); elsereturnEnableDevice(dwDevID,hDevInfo);voidEnumNetCards()DWORDStatus,Problem;LPTSTRBuffer=NULL;DWORDBufSize=0;/返回所有设备信息HDEVINFOhDevInfo=SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES);if(INVALID_HANDLE_VALUE=hDevInfo)return;SP_DEVINFO_DATADeviceInfoData=sizeof(SP_DEVINFO_DATA);/枚举设备for(DWORDDeviceId=0;SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData);DeviceId+)/获得设备的状态if(CM_Get_DevNode_Status(&Status,&Problem,DeviceInfoData.DevInst,0)!=CR_SUCCESS)continue;/获取设备类名TCHARszDevNameMAX_PATH=_T();if(GetRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_CLASS,&Buffer,(PULONG)&BufSize) lstrcpyn(szDevName,Buffer,MAX_PATH);if(lstrcmp(szDevName,_T(Net)=0) TCHARszNameMAX_PATH=_T();if(GetRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_ENUMERATOR_NAME,&Buffer,(PULONG)&BufSize) lstrcpyn(szName,Buffer,MAX_PATH);if(lstrcmp(szName,_T(ROOT)!=0) if(GetRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_DRIVER,&Buffer,(PULONG)&BufSize)lstrcpyn(szName,Buffer,MAX_PATH);/获取设备描述if(GetRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_DEVICEDESC,&Buffer,(PULONG)&BufSize)lstrcpyn(szName,Buffer,MAX_PATH);if(ControlDevice(DeviceId,hDevInfo)printf(Successfuln);elseprintf(FAILEDn); SetupDiDestroyDeviceInfoList(hDevInfo);BOOLStateChange(DWORDdwNewState,DWORDdwDevID,HDEVINFOhDevInfo)SP_PROPCHANGE_PARAMSPropChangeParams;SP_DEVINFO_DATADevInfoData=sizeof(SP_DEVINFO_DATA);SP_DEVINSTALL_PARAMSdevParams;/查询设备信息if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData)OutputDebugString(SetupDiEnumDeviceInfoFAILED);returnFALSE; /设置设备属性变化参数PropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);PropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;PropChangeParams.Scope=DICS_FLAG_GLOBAL;/使修改的属性保存在所有的硬件属性文件PropChangeParams.StateChange=dwNewState;PropChangeParams.HwProfile=0; /改变设备属性if(!SetupDiSetClassInstallParams(hDevInfo,&DevInfoData,(SP_CLASSINSTALL_HEADER*)&PropChangeParams,sizeof(PropChangeParams)OutputDebugString(SetupDiSetClassInstallParamsFAILED);returnFALSE; PropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER); PropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE; PropChangeParams.Scope=DICS_FLAG_CONFIGSPECIFIC;/使修改的属性保存在指定的属性文件 PropChangeParams.StateChange=dwNewState; PropChangeParams.HwProfile=0; /改变设备属性并调用安装服务if(!SetupDiSetClassInstallParams(hDevInfo,&DevInfoData, (SP_CLASSINSTALL_HEADER*)&PropChangeParams,sizeof(PropChangeParams)| !SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DevInfoData)OutputDebugString(SetupDiSetClassInstallParamsorSetupDiCallClassInstallerFAILED);returnTRUE; else /判断是否需要重新启动devParams.cbSize=sizeof(devParams);if(!SetupDiGetDeviceInstallParams(hDevInfo,&DevInfoData,&devParams)OutputDebugString(SetupDiGetDeviceInstallParamsFAILED);returnFALSE;if(devParams.Flags&(DI_NEEDRESTART|DI_NEEDREBOOT)OutputDebugString(NeedRestartComputer);returnTRUE;returnTRUE;BOOLIsDisableable(DWORDdwDevID,HDEVINFOhDevInfo)SP_DEVINFO_DATADevInfoData=sizeof(SP_DEVINFO_DATA);DWORDdwDevStatus,dwProblem;if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData)OutputDebugString(SetupDiEnumDeviceInfoFAILED);returnFALSE;/查询设备状态if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS)OutputDebugString(CM_GET_DevNode_StatusFAILED);returnFALSE;return(dwDevStatus&DN_DISABLEABLE)&(dwProblem!=CM_PROB_HARDWARE_DISABLED);BOOLIsDisabled(DWORDdwDevID,HDEVINFOhDevInfo)SP_DEVINFO_DATADevInfoData=sizeof(SP_DEVINFO_DATA);DWORDdwDevStatus,dwProblem;if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData)OutputDebugString(SetupDiEnumDeviceInfoFAILED);returnFALSE;/查询设备状态if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS)OutputDebugString(CM_GET_DevNode_StatusFAILED);returnFALSE;return(dwDevStatus&DN_HAS_PROBLEM)&(dwProblem=CM_PROB_DISABLED);voidGuidCopy(GUIDguidSrc,GUID*guidDest)guidDest-Data1=guidSrc.Data1;guidDest-Data2=guidSrc.Data2;guidDest-Data3=guidSrc.Data3;memcpy(guidDest-Data4,guidSrc.Data4,8);BOOLConstructDeviceName(HDEVINFODevInfoSet,PSP_DEVINFO_DATADevInfoData,PVOIDpBuffer,PULONGLength)/尝试通过各种类型的设备描述获得其设备名称if(!GetRegistryProperty(DevInfoSet,DevInfoData,SPDRP_FRIENDLYNAME,/设备的现实名称pBuffer,Length)if(!GetRegistryProperty(DevInfoSet,DevInfoData,SPDRP_DEVICEDESC,/设备的描述pBuffer,Length)if(!GetRegistryProperty(DevInfoSet,DevInfoData,SPDRP_CLASS,/设备类名pBuffer,Length)if(!GetRegistryProperty(DevInfoSet,DevInfoData,SPDRP_CLASSGUID,/设备的GUIDpBuffer,Length)/什么都没找到就返回UnknownDevice*Length=(lstrlen(UNKNOWNDEVICE)+1)*sizeof(TCHAR);*(LPTSTR*)pBuffer=(PCHAR)LocalAlloc(LPTR,*Length);_tcscpy(*(LPTSTR*)pBuffer,UNKNOWNDEVICE);returnTRUE;BOOLEnumDevices(HDEVINFOhDevInfo)DWORDdwDevID;/,dwStatus,dwProblem;SP_DEVINFO_DATADevInfoData=sizeof(SP_DEVINFO_DATA);LPDEVICE_INFOpDevInfo,pPreDevInfo;TCHAR*DeviceName=NULL;ULONGulNameLen=256;pPreDevInfo=&DevInfo;/穷举每个设备for(dwDevID=0;SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData);dwDevID+)/构造设备信息块pDevInfo=(LPDEVICE_INFO)malloc(sizeof(DEVICE_INFO);pDevInfo-pNextDevInfo=NULL;pDevInfo-DevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);pDevInfo-ulDevNameLen;pDevInfo-DevID=dwDevID;GuidCopy(DevInfoData.ClassGuid,&pDevInfo-DevInfoData.ClassGuid);pDevInfo-DevInfoData.DevInst=DevInfoData.DevInst;pDevInfo-DevInfoData.Reserved=DevInfoData.Reserved;/这里有个问题,如果用设备信息块结构中的字符串指针/SetupDiGetDeviceRegistyProperty函数就会返回数据无效,不知道为什么。/所以下面只能在重新复制一遍了。ConstructDeviceName(hDevInfo,&DevInfoData,&DeviceName,&ulNameLen);pDevInfo-ulDevNameLen=ulNameLen;pDevInfo-lpszDevName=(TCHAR*)malloc(ulNameLen*sizeof(TCHAR);memcpy(pDevInfo-lpszDevName,DeviceName,ulNameLen);pDevInfo-bDisableable=IsDisableable(dwDevID,hDevInfo);pDevInfo-bDisabled=IsDisabled(dwDevID,hDevInfo);pPreDevInfo-pNextDevInfo=pDevInfo;pPreDevInfo=pDevInfo;returnFALSE;intmain(intargc,char*argv)HDEVINFOhDevInfo=NULL;LPDEVICE_INFOpDevInfo=NULL;EnumNetCards();return0;/返回设备信息hDevInfo=SetupDiGetClassDevs(NULL,NULL,NULL,DIGCF_PRESENT|DIGCF_ALLCLASSES);DevInfo.DevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);DevInfo.ulDevNameLen=256;DevInfo.pNextDevInfo=NULL;/枚举系统设备EnumDevices(hDevInfo);pDevInfo=DevInfo.pNextDevInfo;while(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论