C++ Windows API函数是否可以重写并在之后调用?

C++ Windows API函数是否可以重写并在之后调用?,c++,winapi,C++,Winapi,我想修改Windows API中可用的本机函数,例如CreateWindowEx或ShowWindow,以便在编译包含这些函数的应用程序时,它会调用我的函数,在那里执行任务,然后调用原始本机函数 换句话说,我希望在某种程度上代理函数,同时仍然使用相同的名称(因此,如果编写的程序是使用本机API编译的,只需添加这些函数即可修改这些本机函数的处理方式) 这(出于明显的原因)会导致堆栈溢出,因为它不断地反复调用自己。我想让它做的是,当它被调用时,它通过我创建的自定义函数运行,然后运行WindowsAP

我想修改Windows API中可用的本机函数,例如
CreateWindowEx
ShowWindow
,以便在编译包含这些函数的应用程序时,它会调用我的函数,在那里执行任务,然后调用原始本机函数

换句话说,我希望在某种程度上代理函数,同时仍然使用相同的名称(因此,如果编写的程序是使用本机API编译的,只需添加这些函数即可修改这些本机函数的处理方式)

这(出于明显的原因)会导致堆栈溢出,因为它不断地反复调用自己。我想让它做的是,当它被调用时,它通过我创建的自定义函数运行,然后运行WindowsAPI中可用的本机函数


我对C++非常陌生,但是例如,在许多其他语言中,我可以在另一个名称下存储对本机函数的引用,然后我可以调用它在我的自定义函数中。在C++中有类似的可用性吗?

< p>如果你想自己做这件事,最简单的方法就是修改PE(可移植的可执行文件)头中的导入地址表。不过,这并非小事


然而,我相信有一个标准的库,你想要什么叫做迂回。不过,我自己从来没有使用过它,因为我开始这样做的时候它不在身边,所以我有一个库——不供公众使用——可以在需要时通过导入表进行操作。

如果你想自己做这件事,最简单的方法就是修改PE(可移植可执行文件)头中的导入地址表。不过,这并非小事


然而,我相信有一个标准的库,你想要什么叫做迂回。不过,我自己从来没有使用过它,因为我开始这么做的时候它还不存在,所以我有一个——不是供公众使用的——库,可以在我需要时通过导入表进行操作。

正如我在评论中所写,许多挂钩库的父库可能是microsoft

现在它不再免费了,有各种各样的选择。这里是其中一些的比较(链接被删除。我不确定它是否安全。请尝试在谷歌上搜索“Microsoft Detours是一个用于特定拦截的库”,并选择一个源,或者更简单地选择Detours替代方案

嗯,现在看来唯一的免费选择是和


有一个问题:如果你感兴趣的话。

正如我在评论中所写的,许多挂钩库的父库可能是微软

现在它不再免费了,有各种各样的选择。这里有一些选择的比较(链接被删除。我不确定它是否安全。请尝试在谷歌上搜索“Microsoft Detours是一个用于特定拦截的库”,然后选择一个源,或者更简单地选择Detours选择

嗯,现在看来唯一的免费选择是和


有一个问题:如果您感兴趣。

对您的问题的一种解释是,您有一个带有源代码的项目,您希望更改该项目,使其使用您自己版本的某些winapi函数

下面是一个可以为每个导入的API函数实现的解决方案。以下示例适用于
ShowWindow

#define ShowWindow Deleted_Winapi_ShowWindow // prevent windows.h from defining ShowWindow
#include <windows.h>
#undef ShowWindow

namespace HiddenWinapi
{
    extern "C"
    {
        // Do what windows.h does, but hide it inside a namespace.
        WINUSERAPI BOOL WINAPI ShowWindow( __in HWND hWnd, __in int nCmdShow);
    }
}

// make your own function to be called instead of the API, and delegate to the actual API in the namespace.
BOOL WINAPI ShowWindow(HWND hwnd, int nCmdShow)
{
    // ... do stuff ...
    // call the original API
    return HiddenWinapi::ShowWindow(hwnd, nCmdShow);
}

对您的问题的一种解释是,您有一个带有源代码的项目,您希望更改该项目,使其使用您自己版本的某些winapi函数

下面是一个可以为每个导入的API函数实现的解决方案。以下示例适用于
ShowWindow

#define ShowWindow Deleted_Winapi_ShowWindow // prevent windows.h from defining ShowWindow
#include <windows.h>
#undef ShowWindow

namespace HiddenWinapi
{
    extern "C"
    {
        // Do what windows.h does, but hide it inside a namespace.
        WINUSERAPI BOOL WINAPI ShowWindow( __in HWND hWnd, __in int nCmdShow);
    }
}

// make your own function to be called instead of the API, and delegate to the actual API in the namespace.
BOOL WINAPI ShowWindow(HWND hwnd, int nCmdShow)
{
    // ... do stuff ...
    // call the original API
    return HiddenWinapi::ShowWindow(hwnd, nCmdShow);
}

从前有一个来自微软研究院的绕道项目。现在它不再是免费的了(至少是运行在x64上的专业版)。但试着用谷歌搜索迂回路线。你这样做的原因将决定最佳解决方案是什么。你能提供更多上下文吗?@tenfour我希望绑定这些函数以发送详细信息(窗口选项、操作等)从web套接字到Javascript从前有一个来自Microsoft Research的迂回项目。现在它不再免费了(至少是运行在x64上的Pro版本)。但试着用谷歌搜索迂回路线。你这样做的原因将决定最佳解决方案是什么。你能提供更多上下文吗?@tenfour我希望绑定这些函数以发送详细信息(窗口选项、操作等)通过web套接字到javascriptI,我没有意识到迂回不再免费。真遗憾。这不是我想要的,但事实上可能是我需要的。我需要更详细地阅读它到底是关于什么的。我没有意识到迂回不再免费。真遗憾。这不是我想要的,但事实上可能是我需要的。W我需要更详细地了解它到底是关于什么的。这似乎与我最初所追求的非常接近,但看看xanatos关于迂回和便捷的回答,这可能是我真正需要的。然而,如果事实上所有的函数都不是宏,这可能是一个问题,在这种情况下,需要一些不同的解决方案在这些情况下。对不起,我编辑了它,为非宏api调用提供了一个优雅的解决方案。这似乎与我最初所追求的非常接近,但看看xanatos关于迂回和易用性的答案,这可能是我真正需要的。然而,如果事实上所有函数都不是宏,这可能是一个问题,在这种情况下,一些不同的在这些情况下,解决方案是必要的。对不起,我对它进行了编辑,为非宏api调用提供了一个优雅的解决方案。
#include <windows.h>

#undef CreateWindowEx

// Note that this is a unicode-only version. If your app mixes A and W versions, see 
// the solution below for non-macro APIs.
HWND WINAPI CreateWindowEx(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
{
    // ... do stuff ...
    // call the REAL function.
    return CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
}