C++获取设备 PID,VID 信息
可直接编译(设置成:使用多字节字符集)
转来的,代码:
/*
http://www.experts-exchange.com/Programming/Editors_IDEs/Q_24506125.html
*/ #include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <winioctl.h>
#include <regstr.h>
#include <tchar.h>
#include <string>
using namespace std; #pragma comment(lib,"setupapi.lib") /*
获取设备数
路径: 如G:
设备数
*/
BOOL GetDeviceNumber(LPCTSTR pszDevPath, DWORD& dwDevNum) { BOOL bRC = FALSE; HANDLE hDrive = CreateFile(
pszDevPath,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
NULL,
NULL
); if (INVALID_HANDLE_VALUE != hDrive) { STORAGE_DEVICE_NUMBER sdn;
DWORD dwBytesReturned = 0; bRC = DeviceIoControl(
hDrive,
IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL,
0,
&sdn,
sizeof(sdn),
&dwBytesReturned,
NULL
); if (bRC) dwDevNum = sdn.DeviceNumber; CloseHandle(hDrive);
}else printf("Error:[%d] (%s)\n",GetLastError(),pszDevPath); return bRC;
} int GetDeviceDescription(LPCTSTR pszDrive, TCHAR* pszDesc, const size_t szDescSize)
{
TCHAR acDevName[MAX_PATH];
// QueryDosDevice(pszDrive,acDevName,MAX_PATH);
// printf("Test: %s\n",acDevName);
_stprintf(acDevName,"\\\\.\\%s", pszDrive);
DWORD dwNumOfInterest = -1;;
GetDeviceNumber(acDevName,dwNumOfInterest);
//printf("DeviceNumber:[%d]\n",dwNumOfInterest);
GUID* guid = (GUID*)&GUID_DEVINTERFACE_DISK;
// Get device interface info set handle
// for all devices attached to system
HDEVINFO hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) {
return 0;
} // Retrieve a context structure for a device interface
// of a device information set.
DWORD dwIndex = 0;
BOOL bRet = FALSE; BYTE Buf[1024];
PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
SP_DEVICE_INTERFACE_DATA spdid;
SP_DEVINFO_DATA spdd;
DWORD dwSize;
spdid.cbSize = sizeof(spdid);
while ( true ) {
bRet = SetupDiEnumDeviceInterfaces(hDevInfo, NULL,
guid, dwIndex, &spdid); if (!bRet) {
break;
} dwSize = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfo,
&spdid, NULL, 0, &dwSize, NULL); if ( dwSize!=0 && dwSize<=sizeof(Buf) ) {
pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes! ZeroMemory((PVOID)&spdd, sizeof(spdd));
spdd.cbSize = sizeof(spdd); long res =
SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd,
dwSize, &dwSize,
&spdd); printf("Result:[%s]\n",pspdidd->DevicePath); // <--------- here! DWORD dwType;
LPTSTR buffer = NULL;
DWORD buffersize = 0; while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&spdd,
SPDRP_FRIENDLYNAME,
&dwType,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
// Double the size to avoid problems on
// W2k MBCS systems per KB 888609.
buffer =(LPTSTR) LocalAlloc(LPTR,buffersize * 2);
}
else
{
// Insert error handling here.
break;
}
} DWORD dwNum = 0;;
GetDeviceNumber(pspdidd->DevicePath,dwNum);
//printf("DeviceNumber:[%d]\n",dwNum); //if (dwNumOfInterest == dwNum) _stprintf(pszDesc,_T("%s"),buffer);
if (dwNumOfInterest == dwNum) _stprintf(pszDesc,_T("%s"),pspdidd->DevicePath); //printf("Result:[%s]\n",buffer);
if (buffer) LocalFree(buffer); }
dwIndex++;
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
} void main (int argc, char** argv) {
TCHAR acDesc[1024] = "<unknown>";
TCHAR* pszDrive;
if (2 != argc) { printf("Usage: usbdev.exe <drive letter> (ex.: 'usbdev f:')\n");
}
pszDrive = *(argv + 1);
GetDeviceDescription(pszDrive, acDesc, 1024);
_tprintf("\nDescription for %s\n\n\t%s\n", pszDrive, acDesc);
system("pause");
}
C++获取设备 PID,VID 信息的更多相关文章
- Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息
详情请看:Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息 在项目中需要获取到当前设备,例如手机的ID,联网状态,等,然后这个Cordova里有这个插件可以用, ...
- 获取设备和 App 信息
设备对照表:https://www.theiphonewiki.com/wiki/Models 获取设备和 App 信息代码: NSLog(@"设备信息如下"); NSLog(@& ...
- ios 获取设备相关的信息
.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名称 NSStr ...
- iOS ---------- 获取设备的各种信息
一.目录结构: 获取屏幕宽度与高度 获取设备版本号 获取iPhone名称 获取app版本号 获取电池电量 获取当前系统名称 获取当前系统版本号 获取通用的唯一识别码UUID 获取当前设备IP 获取总内 ...
- iOS 获取设备的各种信息的方法
一.目录结构: 获取屏幕宽度与高度 获取设备版本号 获取iPhone名称 获取app版本号 获取电池电量 获取当前系统名称 获取当前系统版本号 获取通用的唯一识别码UUID 获取当前设备IP 获取总内 ...
- Android开发之获取设备的屏幕信息和px dp之间的转换
DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metr ...
- snmp获取设备相关管理信息
在本文中,作者将向我们展示如何用snmp代理监视网络设备,甚至发送软件警告. 网络上很多代理在为我们服务.只要我们开启UDP/161,162端口,这些代理就会以Management Informati ...
- C#:获取设备电量相关信息
更多资源:http://denghejun.github.io [DllImport("kernel32.dll",EntryPoint="GetSystemPowerS ...
- iOS 随笔小技巧 弱self 打印当前类行数列数,多人开发自动适配pch地址,获取设备uid的信息
$(SRCROOT)/PrefixHeader.pch自动适配pch地址 __weak __block typeof(self) weakself = self; __weak typeof(self ...
随机推荐
- [LeetCode]66.加一(Java)
原题地址: plus-one 题目描述: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 ...
- verification TLM传输数据导致多线程访问同一个数据
TLM传输数据导致多线程访问同一个数据 原因 TLM发送数据跟mailbox类似,都是发送的引用,这样发送端和接收端的引用都指向同一个数据,这样就会出现发送端修改数据会影响到接收端,比如发送的时候数据 ...
- 大厂晋升指南:材料准备,PPT 写作和现场答辩
大部分公司在年初,都是绩效回顾.晋升答辩的时期,对于阿里.美团等不少互联网企业,财年是从前一年的 4 月到第二年的 3 月底,春节回来以后,就是一年一度的述职晋升环节. 这里我结合自己述职以及辅导其他 ...
- python-xlutils模块-修改excel
前言 xlrd库用于读取excel文件中的数据,xlwt库用于将数据写入excel文件,修改用xlutils模块: xlutils库也仅仅是通过复制一个副本进行操作后保存一个新文件,像是xlrd库和x ...
- 查看jQuery版本号
1. 看源码 2. 用方法 console.log($().jquery) console.log($.fn.jquery)
- 在sublime上运行node
1.安装node,这个就简单了,不多说了.默认会安装在C盘,也可以自己设定盘符,如D.E 2.打开Sublime Text -> Tools -> Build -> Build Sy ...
- 基于Windows系统应用的权限维持
1.dll劫持 生成dll 通过msf将dll木马上传到目标应用程序的dll文件夹里面,然后通过msf来将木马dll名称和正常dll名称进行互换 远程开启监听,然后一旦目标机器的应用程序运行就会触发d ...
- [题解]Mail.Ru Cup 2018 Round 1 - C. Candies Distribution
[题目] C. Candies Distribution [描述] n个小朋友排排坐吃糖糖,小朋友从左到右编号1到n.每个小朋友手上有一定数量的糖.对于第i个小朋友来说,编号比他小的小朋友中有li个小 ...
- 使用PLSQL 创建Oracle数据库用户并设置权限
转至https://blog.csdn.net/ying890/article/details/14083029?utm_medium=distribute.pc_relevant_download. ...
- Sonic+p4(1)
知识: Docker容器(打包环境加应用) 静态镜像运行container docker run(start)形成拓扑 目的:switch1获取switch2的网络统计数据 start.sh启动拓扑, ...