微软Detours库可以从:http://ftp.research.microsoft.com/downloads/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/DetoursExpress.msi? 下载到,现在的最新版本应该是2.1版本。
只说两点卡过我的地方:
1、如何编译。
网上一般的解释是只要安装过VC或者VS的计算机,在detours的src目录下使用nmake就可以成功编译。我想,这样实验的人可能会有不少会得到这么一句话:nmake不是内部命令,也不是外部命令。。。这是因为VS(仅限2008,其它版本不清楚)安装后,并没有将nmake所在的bin目录添加到环境变量中。这个好解决,在执行的时候使用全路径或者干脆就把nmake拷贝到detours的src目录中行不行?实验了下,果然可以,nmake是跑起了,但是碰到rc detoured.rc的时候,又会报个错误出来:rc 不是内部命令也不是外部命令。明显,rc.exe又找不到了。。。。
rc.exe在哪里嘞?默认情况下应该是在C:/Program Files/Microsoft SDKs/Windows/v6.0A/bin下。。若继续将该路径加为环境变量,就好了。。所幸的是微软提供了一个添加环境变量的批处理,可以直接使用和nmake.exe在同一文件夹下的vcvars32.bat。由此得到,完整编译的方法如下:
1、cmd下定位到detours下src文件夹里面。
2、执行vcvars32.bat批处理,可以使用全路径,但是执行过后切记不要关闭cmd(批处理添加环境变量为临时环境变量,关掉cmd窗体即失效)。
3、nmake。。。
这样应该就可以完成编译了。。。至少我完成了。。。
2、如何静态引用
如果按常规的办法来引入库的话,在生成的文件中,都会引入一个叫detoured的库。如何才能去除这个库呢?微软给出的资料中看了半天也没有看懂。。。
网上有人说是,不要引入detoured的lib文件。可是不引用的话,就会报一个大大的链接错误——找不到一个叫detoured的函数。
网上有人说要修改一下detours.cpp文件,但是又没有几个人给出修改的方法(或许我查找的办法不对,有人说网上资料很多,可我就是没找到)。看一看detoured都做了些什么:
detoured源码:
可以看出这个函数只是返回了一个HMODULE。DisableThreadLibraryCalls也是没什么用处。
微软官方帮助中给出的解释是:这是一个标志,如果你使用了detours库。。。。。(无语)
看了看detours的源代码,又测试了下,发现修改这几个地方,就可以达到目的:
一下都是在src/detours.cpp文件中:
1、注释掉:#include "detoured.h"
2、注释掉:
3、注释掉:
(上面这一段在DetourGetDetouredMarker函数中。)
另外还要再返回一个HMODULE,就返回当前的:
return GetModuleHandle(NULL);
编译,把生成的detours.lib加到我的工程中,编译,搞定。。。。。。