1

我需要替换所有 WinAPI 调用

  • 创建文件,
  • 读取文件,
  • 设置文件指针,
  • 关闭手柄

使用我自己的实现(通过蓝牙使用低级文件读取)。将替换功能的代码是视频文件播放器,它已经适用于常规硬盘文件。如果 VideoPlayer 输入中的文件是常规硬盘文件,还需要 Video Player 仍然可以播放 HDD 中的文件。

这种任务的最佳实践是什么?

4

6 回答 6

5

我建议您按照以下步骤操作:

  1. 编写一组包装函数,例如 MyCreateFile、MyReadFile 等,它们最初只是调用相应的 API 并传递相同的参数,未经修改。
  2. 使用您的文本编辑器搜索对原始 API 的所有调用,并将这些调用替换为对新包装函数的调用。
  3. 测试应用程序是否仍然正常运行。
  4. 修改包装函数以适合您自己的目的。

请注意,CreateFile 是一个宏,可扩展为 CreateFileW 或 CreateFileA,具体取决于是否定义了 UNICODE。考虑使用 LPCTSTR 和TCHAR 函数,以便您的应用程序可以构建为 ANSI 或 Unicode。

请不要使用#define,正如其他回复中所建议的那样,因为这只会导致维护问题,并且正如 Maximilian 正确指出的那样,这不是最佳实践。

于 2008-09-13T17:03:28.447 回答
2

您可以在自定义命名空间中编写新函数。例如

namespace Bluetooth
{
  void CreateFile(/*params*/);
  void etc...
}

然后在您的代码中,您唯一需要更改的是:

if (::CreateFile(...))
{
}

if (Bluetooth::CreateFile(...))
{
}

简单的!:)

于 2008-09-15T09:00:55.253 回答
1

如果您尝试拦截来自另一个应用程序的对这些 API 的调用,请考虑Detours

于 2008-09-13T16:22:19.233 回答
1

如果您可以编辑代码,您应该重写它以使用自定义 API 来满足您的需求。如果做不到这一点,请使用马克西米利安的技术,但要注意这是一种维护恐惧。

如果您无法编辑代码,您可以修补导入表以将调用重定向到您自己的代码。可以在本文中找到对这种技术的描述- 搜索标题为“通过更改导入地址表进行间谍活动”的部分。

这很危险,但如果你小心,你可以让它发挥作用。还可以查看Microsoft Detours,它可以做同样的事情,但不需要您搞乱实际的修补程序。

于 2008-09-13T16:29:13.350 回答
1

如果您真的想劫持 API,请查看注射器.dll (L-GPL)。

于 2008-09-18T12:40:02.627 回答
0

我认为这不是最佳做法,但如果你将它放在一个包含文件中,它应该可以工作,该文件包含在你想要更改的函数被调用的任何地方:

#define CreateFile MyCreateFile

HRESULT MyCreateFile(whatever the params are);

MyCreateFile 的实现如下所示:

#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
    if (InputIsNormalFile())
        CreateFile(params);
    else
        // do your thing
}

您基本上使每个 CreateFile 调用都成为 MyCreateFile 调用,您可以在其中决定是否需要使用自己的实现或原始实现。

免责声明:我认为这样做很丑陋,我不会这样做。我宁愿搜索并替换所有出现的东西或其他东西。

于 2008-09-13T16:11:22.643 回答