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接口,GenerateKeyExOptGenerateKeyEx 先找到哪个用哪个。


②,官方工程中提供了两个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以及动态调用

CANoe DLL编程——SendKey DLL的CANoe应用

CANoe DLL编程—— DLL 的二次封装

CANoe DLL编程——DLL和回调函数

Visual Studio中怎么生成动态链接库的lib文件

VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)