获取CPUID序列号的两种办法
Win32k 平台上,获取CPUID的办法主要有两种,一种是利用 WMI 另一种是利用 x86 汇编的 cpuid 指令,而最快的办法就是通过汇编了,而且 WMI 与汇编之间效率上的差距的确有点让人难以忍受,WMI 获取 CPUID 的效率几乎接近了一秒钟,而利用 cpuid 指令的办法,大概是几个 us 时间的问题,这种令人咋舌的巨大差异,让人有些难以忍受。
using System;
using System.Management;
using System.Runtime.InteropServices;static class Program
{[DllImport("kernel32.dll", SetLastError = false)]private static extern bool VirtualProtect(IntPtr lpAddress, uint dwSize, uint flNewProtect, out uint lpflOldProtect);[UnmanagedFunctionPointer(CallingConvention.Cdecl)]public delegate int __cpuid(ref int s1, ref int s2);static void Main(){/*pushadmov eax, 01hxor ecx, ecxxor edx, edxcpuidmov ecx, dword ptr[ebp + 8]mov dword ptr[ecx], edxmov ecx, dword ptr[ebp + 0Ch]mov dword ptr[ecx], eaxpopad*/byte[] shellcode = { 96, 184, 1, 0, 0, 0, 51, 201, 51, 210, 15, 162, 139, 77, 8, 137, 17, 139, 77, 12, 137, 1, 97, 195 };IntPtr address = GCHandle.Alloc(shellcode, GCHandleType.Pinned).AddrOfPinnedObject();VirtualProtect(address, (uint)shellcode.Length, 0x40, out uint lpflOldProtect);__cpuid cpuid = (__cpuid)Marshal.GetDelegateForFunctionPointer(address, typeof(__cpuid));int s1 = 0;int s2 = 0;for (int i = 0; i < 100000; i++){cpuid(ref s1, ref s2);}Console.Write("asm: {0}", s1.ToString("X2") + s2.ToString("X2"));using (ManagementClass mc = new ManagementClass("Win32_Processor")){ManagementObjectCollection moc = mc.GetInstances();foreach (ManagementObject mo in moc){Console.WriteLine(", wmi: {0}", mo.Properties["ProcessorId"].Value.ToString());}}Console.ReadKey(false);}
}
获取CPUID序列号的两种办法相关推荐
- Arduino通过USB转TTL无BootLoader烧录程序的两种办法
Arduino通过USB转TTL无BootLoader(引导程序)烧录程序的两种办法 注意 (这个实验室基于stm32duino的,avr单片机并不直接通用,不过如果你准备尝试使用串口来给avr单片机 ...
- Wordpress开发 - 获取作者头像的两种方法
写在前面 今天又被一个头像坑搞惨了,一般我们获取作者的信息是都需要在循环判断中才可以使用的!比如获取作者名称 <?php the_author(); ?> .如果没有在 <?php ...
- eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样...
eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样 第一种说法: 还真的找到解决的方法了, ...
- html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式
从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列) 所以这篇 ...
- C# HttpClient设置cookies的两种办法
一般有两种办法 第一种handler.UseCookies=true(默认为true),默认的会自己带上cookies,例如 var handler = new HttpClientHandler() ...
- JAVA获取安卓系统下usb_Android 获取 usb 权限的两种方法
前言: 最近工作上遇到几个USB模块在android平台上适配使用的情况,所以要用到USB权限获取问题 ##USB权限获取有以下2种方式: 一.直接在AndroidManifest.xml文件中进行如 ...
- Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式
Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以从代码中简单理解成Receiver方式是通过zookeeper来连接kafka队列,Direct方 ...
- MSCOMM32控件注册的两种办法
当我们在VC或者VB或者VS环境下基于MSCOMM控件开发的软件发布后,是不是有种很爽的感觉,可以拿到别人的电脑上运行下你的软件,可是当你移植过去后却发现软件无法点击的动(别笑,我在开发C#软件时就是 ...
- root android oppo,OPPO R9S怎么ROOT oppor9s获取root权限的两种方法
OPPO R9S如何ROOT呢?作为一款最新的OPPO系列智能手机,对于刚入手的用户而言,可能不知该如何获取OPPO R9S手机ROOT权限.下面就与大家分享一下获取OPPO R9S手机ROOT权限的 ...
- Java 跨平台获取 MAC 地址的两种方法
前言 有时我们因为软件授权或者其它需要获取主机唯一标识而需要获取用户主机的MAC地址,而本文则将介绍如何通过Java来实现跨平台获取MAC地址的两种方法,同时具体的代码也已上传到GitHub. 如果不 ...
最新文章
- 2022-2028年中国耐二甲醚橡胶密封材料行业市场全景调研及发展趋势分析报告
- Centos6.8防火墙配置
- Android--使用AIDL和远程服务实现线程通信
- linux 为开发板添加板级文件config.h
- 牛客多校4 - Ancient Distance(树上倍增+dfs序+线段树)
- ALV可输入状态下输入金额字段变小数的问题
- python如何导入自定义模块_【python】导入自定义模块
- linux搭建web服务器原理,【LINUX】linux搭建web服务器
- Atitit 模块打包器(module bundler)的概念与使用 目录 1. 解决问题	1 1.1. 多js合并方便性能加载	1 1.2. 静态模块打包	2 1.3. 动态模块打包	2 2. 最
- txt大文件打开软件
- 燃料电池仿真模型燃料电池仿真模型,本模型基于Cruise软件和 Simulink软件共同搭建完成,并基于实际项目搭建,本资料包包含所有源文件
- 2019全球logo设计趋势
- python ddos攻击器
- 是不是选择任何一个方向,都会游向同一个宿命呢
- 剪切caspase3_Caspase-3活性检测
- 马克思主义基本原理笔记(黄色标记要求会背)
- 【总结】最系统化的CV内容,有三AI所有免费与付费的计算机视觉课程汇总(2022年12月)...
- 电脑网络设置出现红叉解决办法,详细步骤并配图,附网盘链接,亲测有效
- 优维科技将参加微软加速器·上海一期Demo Day
- Android开发学习总结(一)——搭建最新版本的Android开发环境