使用Setup API枚举系统设备

来源:互联网 发布:sql注入漏洞如何处理 编辑:程序博客网 时间:2024/05/15 04:07
#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      声音设备
2 0
原创粉丝点击