c++ - 写(函数原型(prototype)、函数指针、外部指针)更小

标签 c++ c reverse-engineering

有没有一种方法可以用一些魔法来编写宏或 typedef,使我可以将下面的三行代码写得更小?

extern "C" NTSTATUS NTAPI KeInitializeApc( PKAPC Apc, 
                                           PKTHREAD thread,
                                           UCHAR state_index,
                                           PKKERNEL_ROUTINE ker_routine,
                                           PKRUNDOWN_ROUTINE rd_routine,
                                           PKNORMAL_ROUTINE nor_routine,
                                           UCHAR mode,
                                           PVOID context );
typedef NTSTATUS (NTAPI *KeInitializeApc_t)( PKAPC Apc, 
                                             PKTHREAD thread,
                                             UCHAR state_index,
                                             PKKERNEL_ROUTINE ker_routine,
                                             PKRUNDOWN_ROUTINE rd_routine,
                                             PKNORMAL_ROUTINE nor_routine,
                                             UCHAR mode,
                                             PVOID context );
extern "C" KeInitializeApc_t PKeInitializeApc;

此外,我是否必须在原型(prototype)、函数和 extern 上使用 extern "C"?如果我想要没有损坏的名字?

extern "C" NTSTATUS NTAPI KeInitializeApc( PKAPC Apc, 
                                           PKTHREAD thread,
                                           UCHAR state_index,
                                           PKKERNEL_ROUTINE ker_routine,
                                           PKRUNDOWN_ROUTINE rd_routine,
                                           PKNORMAL_ROUTINE nor_routine,
                                           UCHAR mode,
                                           PVOID context );
extern "C" typedef NTSTATUS (NTAPI *KeInitializeApc_t)( PKAPC Apc, 
                                                        PKTHREAD thread,
                                                        UCHAR state_index,
                                                        PKKERNEL_ROUTINE ker_routine,
                                                        PKRUNDOWN_ROUTINE rd_routine,
                                                        PKNORMAL_ROUTINE nor_routine,
                                                        UCHAR mode,
                                                        PVOID context );
extern "C" KeInitializeApc_t PKeInitializeApc;

在每一行都使用 extern "C"似乎不正确。

感谢您的宝贵时间。

最佳答案

如果您能够/被允许使用 C++11,您可以尝试使用 decltype,如下所示:

extern "C" {
    NTSTATUS NTAPI KeInitializeApc( PKAPC Apc, 
                                    PKTHREAD thread,
                                    UCHAR state_index,
                                    PKKERNEL_ROUTINE ker_routine,
                                    PKRUNDOWN_ROUTINE rd_routine,
                                    PKNORMAL_ROUTINE nor_routine,
                                    UCHAR mode,
                                    PVOID context );

    using KeInitializeApc_t = decltype(&KeInitializeApc);
    KeInitializeApc_t PKeInitializeApc;
}

编辑:我错过了那里的 c 标签。如果您想编写代码使其同时适用于 C 和 C++,您可以尝试:

#ifdef __cplusplus
extern "C" {
#endif

typedef NTSTATUS NTAPI KeInitializeApc_f( PKAPC Apc, 
                                          PKTHREAD thread,
                                          UCHAR state_index,
                                          PKKERNEL_ROUTINE ker_routine,
                                          PKRUNDOWN_ROUTINE rd_routine,
                                          PKNORMAL_ROUTINE nor_routine,
                                          UCHAR mode,
                                          PVOID context );
KeInitializeApc_f KeInitializeApc;
typedef KeInitializeApc_f *KeInitializeApc_t;
KeInitializeApc_t PKeInitializeApc;

#ifdef __cplusplus
}
#endif

关于c++ - 写(函数原型(prototype)、函数指针、外部指针)更小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38400035/

相关文章:

javascript - 你将如何对它进行逆向工程?

java - 如何开始逆向工程 SpaceNavigator 外围数据流?

c++ - 从 libcurl 提供的流中读取 jpeg

c++ - Visual Studio 给出了关于模棱两可的 ctor 的错误

c - 没有语法错误吗?应该 printf ("one" ", two and " "%s.\n", "three");是有效代码?

c++ - round_down 宏需要解释

c - 如何从不同的函数初始化 char**?

c++ - 直接继承的替代方法

c++ - 需要有关此文本消息解码器 (C++) 练习的帮助

reverse-engineering - Windbg + IDA : calculate an address in a module