Visual Studio 2015编译EncodePointer函数的问题

本文介绍了如何解决Visual Studio 2015编译的程序在Windows XP SP1上因使用EncodePointer和DecodePointer函数导致的不兼容问题。作者提出通过编译ASM文件,自定义函数库并在链接时调整依赖顺序来实现兼容,同时提供了x86和x64架构下的ASM代码示例。
摘要由CSDN通过智能技术生成

        在编程工具方面,我是个偏好使用最新工具的强迫症晚期患者。但对于大多数程序员来讲,采用新工具能够获得最大的编程效率,这也无可非议。Visual Studio 2015是个好东西,尤其我常用来开发驱动程序,可以节省不少时间和精力。但Visual Studio从2010开始就无法编译出可在Windows XP SP1平台上运行的程序了,现在也依然如此。作为商业软件的开发,如果不考虑Windows XP SP1以下的平台,可能有些不妥,尤其如果安全软件的话。所以,我设计了一种解决方法,供大家参考。

 

一、基本方法

        之所以新版Visual Studio编译的程序无法在XPSP1上运行,是因为C运行时和MFC框架中大量使用了EncodePointer和DecodePointer这两个新版Windows上才有的位于kernel32.dll中的API函数。网上的方法大概有三种:

  1、退回老版本的VisualStudio,至少是2008;

  2、安装两个版本的VisualStudio,在新版中采用老版本的编译工具集;

  3、自己设计一套哑函数代替出问题的这两个函数。

        前两种方法实际上是一种。而但三种方法中,在程序的安全性上是有些问题的。EncodePointer和DecodePointer之所以出现,是为了防范利用对象指针进行的攻击。在支持这两个函数的系统上不使用它们似乎也有不妥。于是我想在第三种方法上进行一下改进。

        自己在代码中实现另一套EncodePointer和DecodePointer,是基本思路。但如何让链接器知道链接时该选择哪套函数呢?如果使用C在EXE工程中实现这两个函数,我们就没有任何机会了——链接器总是先链接kernel32.lib而无情地抛弃自己定义的函数。倒是可以自己实现一个包含这两个函数的lib库,并在链接EXE时在“附加依赖项”中将自己的 lib 调到 kernel32.lib 之前(实际上只要将自己的lib放入了“附加依赖项”中,它就会在默认库之前得到链接)。还在

        我采用了网上可以查到的一种方法,在EXE工程中编译一个asm文件。因为汇编语言文件生成的obj文件链接总是先于默认库的。

对了,编译时不要忘记将工程设置中的“所需最低版本”设为5.01。

 

二、x86架构

        x86架构下的asm文件代码如下:

.model flat
PUBLI
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值