微软提供了获取性能计数器的接口,如下
LSTATUS RegQueryValueExA([in] HKEY hKey,[in, optional] LPCSTR lpValueName,LPDWORD lpReserved,[out, optional] LPDWORD lpType,[out, optional] LPBYTE lpData,[in, out, optional] LPDWORD lpcbData
);
PERF_OBJECT_TYPE 结构如下:
每个lpData都会多个PERF_OBJECT_TYPE
每个PERF_COUNTER_DEFINITION 都对应着一个数据,至于数据在哪里,PERF_COUNTER_DEFINITION 结构中会提供从本身到该值位置的偏移量
typedef struct _PERF_COUNTER_DEFINITION {DWORD ByteLength;DWORD CounterNameTitleIndex;
#if ...DWORD CounterNameTitle;
#elseLPWSTR CounterNameTitle;
#endifDWORD CounterHelpTitleIndex;
#if ...DWORD CounterHelpTitle;
#elseLPWSTR CounterHelpTitle;
#endifLONG DefaultScale;DWORD DetailLevel;DWORD CounterType;DWORD CounterSize;DWORD CounterOffset;
} PERF_COUNTER_DEFINITION, *PPERF_COUNTER_DEFINITION;
RegQueryValueExA此函数返回的数据都是通过提供的偏移量来确定下一个结构或者子结构位置的
至于提供的数据是什么的数据,可以通过PERF_COUNTER_DEFINITION的CounterNameTitleIndex来确定。
具体的详细信息可以到注册表中查找,路径如下:
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\CurrentLanguage此路径下有两个键值,一个是Counter计数器,一个是Help帮助,双击,可以看到值非常长
使用CounterNameTitleIndex去找对应的详细信息,如果要找2的详细信息可以查找Counter中的2,如果要找2的帮助文档就要去找Help中的3,如此对应。
可以通过该方式获取到网卡的网速
显示网速代码github
还可以获取到其他东西
参考:
性能计数器结构图示链接(微软文档)
性能计数器结构链接(微软文档)