使用Setup API枚举系统设备
2014-06-01 21:57
477 查看
#pragma comment(lib, "Setupapi.lib") #pragma comment(lib, "shlwapi.lib") #include "stdafx.h" #include <Windows.h> #include <setupapi.h> #include <devguid.h> #include <regstr.h> #include <shlwapi.h> #include <Rpc.h> int main( int argc, char *argv[ ], char *envp[ ] ) { HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD i; char szGUID[] = _T("36FC9E60-C465-11CF-8056-444553540000"); GUID guid; UuidFromString((unsigned char *)szGUID, &guid); // 枚举指定类型设备 hDevInfo = SetupDiGetClassDevs(&guid, 0, // Enumerator 0, DIGCF_ALLCLASSES | DIGCF_PRESENT ); if (hDevInfo == INVALID_HANDLE_VALUE) { // Insert error handling here. return 1; } DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); // 枚举指定设备信息集合的成员,并将数据放在PSP_DEVINFO_DATA中 for (i=0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) { DWORD DataT; LPTSTR buffer = NULL; DWORD buffersize = 0; // 获取设备信息 while (!SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, &DataT, (PBYTE)buffer, buffersize, &buffersize)) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { if (buffer) LocalFree(buffer); buffer = (LPTSTR)LocalAlloc(LPTR,buffersize); } else { break; } } if(buffer) { LONG nLen = strlen(buffer)+10; char* pStr = new char[nLen]; strcpy_s(pStr, nLen, "Result: "); strcat_s(pStr, nLen, buffer); if( StrStr(pStr, _T("WD"))!=NULL) { _tprintf(pStr); _tprintf(_T("\n")); } delete []pStr; } } if ( GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS ) return 1; SetupDiDestroyDeviceInfoList(hDevInfo); return 0; }如果配合WM_DEVICECHANGE消息,可以完成对U盘等设备的检测(注:在Win Me只能收到nEventType=7的消息,这时候要注意自己判断)
BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData) { switch(nEventType) { case DBT_DEVICEARRIVAL: // 设备插入并可用 break; case DBT_DEVICEREMOVECOMPLETE: // 设备拨出 break; } }以下是一些设备在系统中的GUID,有的不会翻译,暂用英文:)
4D36E980-E325-11CE-BFC1-08002BE10318 软驱
4D36E965-E325-11CE-BFC1-08002BE10318 光驱
4D36E97D-E325-11CE-BFC1-08002BE10318 系统设备
6D807884-7D21-11CF-801C-08002BE10318 磁带机
36FC9E60-C465-11CF-8056-444553540000 USB
4D36E964-E325-11CE-BFC1-08002BE10318 适配器
D45B1C18-C8FA-11D1-9F77-0000F805F530 APMSUPPORT
E0CBF06C-CD8B-4647-BB8A-253B43F0F974 蓝牙设备
4D36E966-E325-11CE-BFC1-08002BE10318 电脑
6BDD1FC2-810F-11D0-BEC7-08002BE2092F 解码器
6BDD1FC3-810F-11D0-BEC7-08002BE2092F GPS——Global Positioning System
4D36E976-E325-11CE-BFC1-08002BE10318 No Driver
8ECC055D-047F-11D1-A537-0000F8753ED1 Non-plug And Play Drivers
4D36E97E-E325-11CE-BFC1-08002BE10318 Other Devices
4D36E97A-E325-11CE-BFC1-08002BE10318 Printer Upgrade
4D36E97C-E325-11CE-BFC1-08002BE10318 声音设备
相关文章推荐
- 使用SetupDI* API列举系统中的设备
- 一个可以禁用USB存储设备的程序(SetupAPI的使用方法)
- 一个可以禁用USB存储设备的程序(SetupAPI的使用方法)
- 使用多媒体API枚举音频设备
- 使用多媒体API枚举音频设备 - zgl7903的专栏 - CSDNBlog
- 视频捕获 之 如何使用系统设备枚举器
- 枚举系统中已经安装的所有硬件设备
- 使用 Win32 API 枚举应用程序
- c# 使用API读取系统信息并操作
- WIN32 API编程--枚举系统显示器
- 如何使用API获取文件系统的文件目录
- C#使用API屏蔽系统热键和任务管理器
- 用SetupDiGetClassDevs枚举设备
- 不使用系统API来实现互斥保护功能
- 在Visual C#程序中使用系统热键(API)
- 如何使用API获取文件系统的文件目录
- 使用API实现的一个增加系统桌面,并且可以任意切换的小程序.
- 如何使用 WMI 枚举当前系统进程?
- [转]用Delphi通过SetupAPI.dll列举和停用硬件设备
- 系统设备枚举