CANoe DLL编程——通过VS 生成 SendKey.dll
Posted 蚂蚁小兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CANoe DLL编程——通过VS 生成 SendKey.dll相关的知识,希望对你有一定的参考价值。
相关文章
CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用
CANoe DLL编程(二)—— 创建CANoe适用的DLL以及调用
CANoe DLL编程(三)——DLL和回调函数
CANoe DLL编程(四)——SendKey DLL的CANoe应用
CANoe DLL编程(六)—— DLL 的二次封装
前言
-
在上一节我们已经理清楚了seedkey的诊断机制,那么这一节我们继续来看下怎么用vs 生成 seedkey.dll。
-
软件环境:
win10 x64
visual studio 2019
CANoe 11 x64
官方示例解读
GenerateKeyEx 接口
①,CANoe提供了两个函数接口
- 下面这段截图意思就是 DLL寻找 API接口,
GenerateKeyExOpt
和GenerateKeyEx
先找到哪个用哪个。
②,官方工程中提供了两个VS工程,就对应上面的两个函数,工程中使用的seedkey.dll实际上使用的KeyGenDll_GenerateKeyEx
③,我们用VS打开,看下源码很简单,函数里面就几行代码`
- 当key的数组大小比seed的小,抛出异常
- 然后把seed 取反之后,作为key值返回
- 下面是seed key 的trace截图,可以看到算法确实是取反的。
GenerateKeyExOpt 接口
①,我们把jVS工程KeyGenDll_GenerateKeyEx
拷贝一份,然后在拷贝的工程中把源代码按照下图把GenerateKeyEx
接口 改成GenerateKeyExOpt
,并添加ipOptions
参数,然后重新生成一个seedkey.dll
- 在这里为了区别,我把生成的dll 改名字成
SeednKey_Opt.dll
②,把调用DLL设置成 SeednKey_Opt.dll
,然后保存关闭CANoe,再重启CANoe
- 之所以要关闭重启,因为如果不关闭重启,诊断控制台打印的dll调用路径不变,虽然内部已经变了,为了准确的说明,不产生误解,最好关闭重启。
③,然后我们在诊断控制台发送27服务,观察正常解锁。
- 这里我们也可以观察到dll的调用路径,如果不重启CANoe,这里显示的还是上个dll路径,可能是CANoe 11 SP2版本的bug.
休息下1分钟。。。
在源码上丰富功能
① 真正使用的项目上,不同的seed key level 都有不同的复杂的算法,官方工程中,支持 level 1和 level 11 ,我们现在增加一点功能,level 1 ,取反得到key 值 ; level 11 ,+1 得到key值 ,否则,返回报错。
KEYGENALGO_API VKeyGenResultEx GenerateKeyExOpt(
const unsigned char* iSeedArray, /* Array for the seed [in] */
unsigned int iSeedArraySize, /* Length of the array for the seed [in] */
const unsigned int iSecurityLevel, /* Security level [in] */
const char* iVariant, /* Name of the active variant [in] */
const char* ipOptions,
unsigned char* ioKeyArray, /* Array for the key [in, out] */
unsigned int iKeyArraySize, /* Maximum length of the array for the key [in] */
unsigned int& oSize /* Length of the key [out] */
)
{
if (iSeedArraySize>iKeyArraySize)
return KGRE_BufferToSmall;
if (iSecurityLevel == 0x01)
{
for (unsigned int i = 0; i < iSeedArraySize; i++)
ioKeyArray[i] = ~iSeedArray[i];
}
else if (iSecurityLevel == 0x11)
{
for (unsigned int i = 0; i < iSeedArraySize; i++)
ioKeyArray[i] = iSeedArray[i]+1;
}
else
{
return KGRE_SecurityLevelInvalid;
}
oSize = iSeedArraySize;
return KGRE_Ok;
}
②,加载重新生成的DLL,然后测试看下结果。看到 Level 11的算法变了。
总结
- 要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
以上是关于CANoe DLL编程——通过VS 生成 SendKey.dll的主要内容,如果未能解决你的问题,请参考以下文章
CANoe DLL编程—— Visual Studio 创建DLL以及动态调用