已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025四川省九洲千城置业有限责任公司招聘工程管理主管1人笔试考试备考题库及答案解析
- 航海基本安全考试题及答案
- 2025首都医科大学附属北京朝阳医院面向应届毕业生(含社会人员)招聘155人考试笔试模拟试题及答案解析
- 2025年青岛日报社公开招聘事业单位工作人员(14名)考试笔试模拟试题及答案解析
- 2025四川成都市新都区妇幼保健院编外专业技术人员招聘8人考试笔试模拟试题及答案解析
- 烧碱蒸发工安全管理水平考核试卷含答案
- 汽油煤油柴油加氢装置操作工操作技能水平考核试卷含答案
- 异丁烷装置操作工操作规程强化考核试卷含答案
- 三氯氢硅还原工岗前管理应用考核试卷含答案
- 混合气生产工成果水平考核试卷含答案
- 人教版数学九年级下册全册教案
- 粤教版综合实践活动指引二年级第三单元-牛奶伴我成长-第一课时-课件
- DL∕T 5759-2017 配电系统电气装置安装工程施工及验收规范
- 燃气输送用不锈钢管及双卡压式管件
- 2021利达JB-QG-LD988EL JB-QT-LD988EL 火灾报警控制器 消防联动控制器调试手册
- 心内科品管圈-提高规范化口服给药执行率
- 教学课件:乙酸乙酯制备
- 国家电网南瑞集团招聘笔试真题2023
- 养老院食品安全知识讲座
- 2023年12月2024届广州市高三年级调研测试(零模)生物试卷(含答案)
- 空调维保投标方案(技术标)
评论
0/150
提交评论