荣耀,一个伟大的品牌,老大哥,厚道。
本文其实不长,只是对老大哥的一个赞扬。
重点说明:
一阴一阳之谓道。——《易传・系辞上》
道生一,一生二,二生三,三生万物。——《道德经》
人法地,地法天,天法道,道法自然。——《道德经》
人本身生于阴阳,阴阳二气同时存在,阴阳必然和合,孤阴不长,独阳不生。
结束,重点说完了。继续讨论老大哥的问题。
哦,对了,还有,以下部分内容,均为站在事实角度上的个人臆测,
且个人会摆出事实,讲明道理,列出内容,不存在无端臆测。
不存在其他什么目的,仅为了弘扬,赞扬伟大的老大哥。
事件起因:
前一段时间,极客湾分享了一个视频,里面是对比两款笔记本的性能能力(magicbook14对比小新pro14),
地址:
荣耀竟然比联想的产品速度快了近一倍,有意思。
由于我是做软件的,硬件方面,我不懂,但是软件方面还是可以研究研究的,
所以,我开始着手希望了解一下荣耀在软件层面上是否做了什么。
(其实我就看了几个小时,就对老大哥的奉献精神真的无比感动。有了此文。)
开始咯:
第一步肯定是要获取荣耀的软件,就是他们的那个电脑管家。
获取方法有两个,1:最主要的方法,就是买个他们笔记本,这不是帮他们做广告啊,看上面的视频,感觉他们的笔记本确实不错。
2:就是按照下面步骤乖乖下载,不保证是最新,但是也能看。
打开荣耀官网:
点右上角的”服务支持“,再点”笔记本“,点下面的”电脑管家及驱动下载“,
随便输入个什么型号,
点搜索,来了个这个
下载吧,安装吧,亲兄弟。
其实里面这个 exe,也不用安装了,7z 直接解压,老大哥为了方便小弟们,连安装步骤都帮小弟们省下了。
开工了:
VSCode 先打开配置文件目录,看看都有啥。
各种配置文件,大部分全明文,且全中文,比那个”七八个中国人开会,会上还得飙英语,官方唯一语言是英语“ 的所谓中国公司,亲民多了。
这配置一看就懂。
如果感觉这配置还难懂,
老大哥特意非常体贴地,在部分配置里面还有注释。
兼职爱你入微了,
这再不会,真的教不了了。
找到了一个xml,不知道在哪用了?
不怕,老大哥会说,你去搜搜我代码不就知道了么。
就搜到了,体贴,细致入微,看一看他们的代码吧。
当我看了他们的代码之后,眼泪都快掉下来了。
导入表是这样的
导出表是这样的
接口都是实名制的,我无限感慨。
老大哥不但送配置,还送模块。
怀着感激的心,我进入了模块内部,想看看它内里的细节,但是这么一看,我更惊讶了。
这,不但送模块,连代码都送了?
分析结构部分可能还有点费事,但是代码层面,这代码极其规整,非常易读。
最难能可贵的是,老大哥怕我们这种小白看不懂,时不时地还有一些log形式的注释在里面,帮助我们分析思考。
简直体贴到家服务。
咋说呢,老大哥的无私奉献精神,值得我们学习,这个是肯定的。
都说到这里了,多少得有点带技术含量的。
所以呢,行吧,咱就开始研究研究老大哥送的模块,咱咋用。
其实不用研究。直接就用了。
这里用通用方法,找到一个简单的模块,举个最简单的例子。
1:找到一个指定的模块,我就用它里面的功能了,
这个模块叫做 HardwareSdk.dll 看名字,应该是个查询硬件信息的接口导出模块,
看一下它的导出函数,爱死你了,就喜欢这样的。
2:想要调用导出函数,常规方法就两种,1,LoadLiraryA GetProcAddress,2,lib 导入。
其实哪种方法都行,针对C++ Class 的导出,我比较喜欢第二种,能避免不少麻烦。
如果要用lib 导入,那么我们只有一个 dll,咋搞,其实有办法。
先去下载一个代码,
这个工具有问题,所以需要下载它的代码,然后把它编成一个exe,之后使用,
执行命令:pexports.exe HardwareSdk.dll > HardwareSdk.def
这样就生成了一个def 文件。
做过Windows 开发的,都知道 def 是啥吧。
生成的def文件,差不多就这样。
然后需要把def 文件打包成lib 文件,这个也不难,VS工具链中提供了一个叫lib 的工具,对,就叫这个名字,玩法就是
lib /def:HardwareSdk.def /MACHINE:x64
然后三个文件就都有了
最后还缺一个文件,是啥,头文件啊,没头文件,咋调用呢,是不,
没事,咱头文件也尝试自己生成一个。
咋生成,还得看def文件。
def文件里面的名称都很坑,都是名称粉碎后的产物,我们需要把这些名称还原,
名称还原,换一个工具,VS工具链中有个工具叫做【undname.exe】,就它了,
还原之后的名称,看着好多了
还原成这样之后,我们需要找到我们想要的那个class,找个难度低点的,由浅入深。
然后,我找到了一个只有三个函数的class:Keyboard
稍作整理,就还原了一个简单的类
class Keyboard
{
public:
~Keyboard(void);
Keyboard(void);
std::wstring GetKeyboardName(std::wstring&);
};
然后,测试代码如下
#include <iostream>
#include <string>
#include <vector>
#pragma comment(lib, "HardwareSdk.lib")
class Keyboard
{
public:
~Keyboard(void);
Keyboard(void);
std::wstring GetKeyboardName(std::wstring&);
};
void Test_Keyboard()
{
Keyboard kb;
std::wstring ws;
std::wstring ret;
ret = kb.GetKeyboardName(ws);
std::wcout << L"ws : " << ws;
std::cout << std::endl;
std::wcout << L"ret : " << ret;
std::cout << std::endl;
}
int main()
{
Test_Keyboard();
system("pause");
}
编译,没问题,链接也没问题,
说明至少头文件和 lib 文件是匹配的,都没问题,
然后把编译出的文件放到荣耀电脑管家目录下,执行一下下。
有内容,有输出哦。
咱都搞安全的,所以这意味着什么,大家都不言自明了吧。
老大哥太体贴。
然后我还尝试了另外一个类
class FileProcess
{
public:
FileProcess(void);
~FileProcess(void);
void DeleteFileByPath(std::string const&, int);
std::vector<std::wstring> GetTypeFiles(std::wstring const&, std::wstring const&);public:
unsigned char _Buffer[8];
};
DeleteFileByPath 函数可以执行,没问题,
但是下面一个函数,就是执行不成功,我也不知道是不是缺啥东西。
(我不是在荣耀笔记本上测试的,我的笔记本是惠普,我决定用更便宜的惠普来解决我的问题,毕竟我厮的笔记本太贵了,买不起)
通过简单分析,其实也能发现,荣耀的一些驱动是针对PCI定制的,具体细节类似这样
这其实是在取厂商ID,具体这个ID是啥,我没查到,但是他们可能是知道的,
他们在平台相关的驱动【HNOs2Ec10x64.sys】里面,有一大堆 ioctl
确实功能很全面,进程相关的操作都有,而且都是明文展示给大家的。
也确实像老大哥他们说的,他们对系统性能是有管控的,很棒,很棒。
剩下的,具体内容具体分析吧,如果有环境,有机会,有时间,可以调试一下。
然后再回头看这些成员的使用,到时候应该会有不同的心得。
呃,至于版本问题,10、12、13、15、17、19、22,就这么几个版本,总能解决问题,我是不信他们用08的。
总结一下吧:
在此我谨以自己个人向老大哥荣耀,表示衷心的谢意,
他们的配置文件,为我们指引了方向。
他们的注释为我们减轻了大量工作量。
他们的log,在一些时候,减轻了我们的痛苦。
而他们,仍在默默付出。
最后,多说一句。
荣耀7万一个月招移动安全专家,
要不然,咱先5万块钱招个PC客户端安全开发,把PC这块拾掇拾掇?
别这么大出血了。
刚巧,我最近在准备换个环境。
图挂了?这个尴尬,补上,补上。
其实不想补了的,毕竟我一共就发了2个帖子,估计也没人看,但是,我有点强迫症,就补上吧。