是否可以“拦截”第三方库的“WriteFile”操作

时间:2010-05-27 16:39:37

标签: c# writefile

这可能是一个很长的镜头,但我想我还是会问。我正在使用文档管理系统的API。它们提供了一种“WriteFile”方法,用于将给定文档保存到磁盘。但是,库没有办法简单地将文档读入内存。我似乎唯一的选择是写入磁盘,然后再读回来。我想知道是否有更好的方法来解决这个明显的限制。

该方法为生成的文件路径采用字符串。方法签名:

void ImageInfo.WriteFile(string Filename);

3 个答案:

答案 0 :(得分:3)

理论上,可以使用名为Import Address Table Hooking 的东西拦截任何进程的WriteFile win32 API调用,无论是.NET,C ++等,它实际上是Windows上软件测试中的一个有价值的工具。

基本上,您可以覆盖导入地址表中的WriteFile,kernel32.dll条目,指向您的方法,然后拦截尝试写入的字节。

上面的层可能还有其他方法,比如在.NET中你可以更改第三方应用程序DLL的ILASM代码。或者拥有自己的某些.NET dll版本,它们取代了一些标准的.NET类。

实际上,它可能不值得,例如如果API未将文件显式刷新到磁盘,则后续读取可能最终来自操作系统文件缓存,并且不会出现那么大的性能问题。您可以通过创建文件并在调用WriteFile之前保持打开来实现此目的(只是猜测)。

当然,我想你已经对它进行了分析和测量。

答案 1 :(得分:2)

您需要一个可以调用托管代码回调的Windows API挂钩库。 Easyhook就是这样一个图书馆。请注意,在完成后你可能没有获得任何东西,文件系统缓存已经提供了对文件数据的直接内存访问。

答案 2 :(得分:0)

听起来API并不提供阅读部分,因为它们无法提供比.NET框架中已有的更好(更高性能)的方式。