我需要替换所有 WinAPI 调用
- 创建文件,
- 读取文件,
- 设置文件指针,
- 关闭手柄
使用我自己的实现(通过蓝牙使用低级文件读取)。将替换功能的代码是视频文件播放器,它已经适用于常规硬盘文件。如果 VideoPlayer 输入中的文件是常规硬盘文件,还需要 Video Player 仍然可以播放 HDD 中的文件。
这种任务的最佳实践是什么?
我需要替换所有 WinAPI 调用
使用我自己的实现(通过蓝牙使用低级文件读取)。将替换功能的代码是视频文件播放器,它已经适用于常规硬盘文件。如果 VideoPlayer 输入中的文件是常规硬盘文件,还需要 Video Player 仍然可以播放 HDD 中的文件。
这种任务的最佳实践是什么?
我建议您按照以下步骤操作:
请注意,CreateFile 是一个宏,可扩展为 CreateFileW 或 CreateFileA,具体取决于是否定义了 UNICODE。考虑使用 LPCTSTR 和TCHAR 函数,以便您的应用程序可以构建为 ANSI 或 Unicode。
请不要使用#define,正如其他回复中所建议的那样,因为这只会导致维护问题,并且正如 Maximilian 正确指出的那样,这不是最佳实践。
您可以在自定义命名空间中编写新函数。例如
namespace Bluetooth
{
void CreateFile(/*params*/);
void etc...
}
然后在您的代码中,您唯一需要更改的是:
if (::CreateFile(...))
{
}
到
if (Bluetooth::CreateFile(...))
{
}
简单的!:)
如果您尝试拦截来自另一个应用程序的对这些 API 的调用,请考虑Detours。
如果您可以编辑代码,您应该重写它以使用自定义 API 来满足您的需求。如果做不到这一点,请使用马克西米利安的技术,但要注意这是一种维护恐惧。
如果您无法编辑代码,您可以修补导入表以将调用重定向到您自己的代码。可以在本文中找到对这种技术的描述- 搜索标题为“通过更改导入地址表进行间谍活动”的部分。
这很危险,但如果你小心,你可以让它发挥作用。还可以查看Microsoft Detours,它可以做同样的事情,但不需要您搞乱实际的修补程序。
如果您真的想劫持 API,请查看注射器.dll (L-GPL)。
我认为这不是最佳做法,但如果你将它放在一个包含文件中,它应该可以工作,该文件包含在你想要更改的函数被调用的任何地方:
#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 调用,您可以在其中决定是否需要使用自己的实现或原始实现。
免责声明:我认为这样做很丑陋,我不会这样做。我宁愿搜索并替换所有出现的东西或其他东西。