写入(函数原型,函数指针,外部指针)更小

时间:2016-07-15 15:35:07

标签: 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;

另外,我是否必须使用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"在每一行上看起来都不正确。

感谢您的时间。

3 个答案:

答案 0 :(得分:4)

如果您能够/允许使用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

答案 1 :(得分:2)

您可以将定义分组到一个extern "C"中,如下所示:

#ifdef __cplusplus
extern "C" {
#endif

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 );
KeInitializeApc_t PKeInitializeApc;

#ifdef __cplusplus
}
#endif

答案 2 :(得分:2)

  

有没有办法用一些魔法写一个宏或者typedef,我可以把下面的三行写成更小的?

也许你正在寻找这样的东西:

#define NTDECLARE(name, args) \
  extern "C" NTSTATUS NTAPI name args; \
  extern "C" typedef NTSTATUS (NTAPI * name ## _t) args; \
  extern name ## _t P ## name;

NTDECLARE(KeInitializeApc, ( PKAPC Apc, 
                             PKTHREAD thread,
                             UCHAR state_index,
                             PKKERNEL_ROUTINE ker_routine,
                             PKRUNDOWN_ROUTINE rd_routine,
                             PKNORMAL_ROUTINE nor_routine,
                             UCHAR mode,
                             PVOID context ) )

当然,NTDECLARE宏可用于声明具有不同名称和可能参数的其他函数,类型,指针三元组。

  

另外,我是否必须在原型,函数和外部使用extern“C”?

您不需要将extern "C"应用于指针声明,但如果代码用于头文件,那么您可能需要一个普通的extern,如图所示。您可以考虑从所有单个声明中省略extern "C",而是将它们全部放在extern "C" { ... }块中。