【问题标题】:Defining Function Pointers定义函数指针
【发布时间】:2009-03-25 01:07:33
【问题描述】:

我正在尝试调用内部 Windows NT API 函数 NtOpenProcess。我知道调用内部 API 可能是个坏主意,但对于这个特定的工具,我需要这个 API 提供的低级访问权限。

我的问题是,要使用这样的内部 API,我需要使用运行时动态链接,如 this article 中指定的那样

为此,我需要定义一个指向 NtOpenProcess 的函数指针。这是我的声明:

typedef NTSTATUS (NTAPI *_NtOpenProcess) (
OUT PHANDLE,
IN ACCESS_MASK,
IN POBJECT_ATTRIBUTES,
IN PCLIENT_ID OPTIONAL);

class procManager
{
    HINSTANCE hNTDLL;
public:
    procManager()
    {
        hNTDLL = LoadLibrary(L"ntdll.dll");
        if (!hNTDLL)
            throw std::runtime_error("NTDLL.DLL failure.");
        _NtOpenProcess NtOpenProcess;
        NtOpenProcess = reinterpret_cast <_NtOpenProcess> (GetProcAddress(hNTDLL, L"NtOpenProcess"));
        if (!NtOpenProcess)
            throw std::runtime_error("NtOpenProcess not found.");
        //Use NTOpenProcess for stuff here
    };
    ~procManager()
    {
        FreeLibrary(hNTDLL);
    };
};

问题是,显然我上面的 typedef 有错误。编译器返回:

错误 C2059:语法错误: '__stdcall'

我使用了我的 IDE (Visual Studio 2008) 的便捷的“G​​o To Definition”功能,发现声明中的 NTAPI 被定义为 __stdcall。

不幸的是,从我的声明中删除了 NTAPI,使其成为:

typedef NTSTATUS (*_NtOpenProcess) (
OUT PHANDLE,
IN ACCESS_MASK,
IN POBJECT_ATTRIBUTES,
IN PCLIENT_ID OPTIONAL);

导致另一个错误:

错误 C2065:“_NtOpenProcess”: 未声明的标识符

此时我的意思是“当然它是未定义的,这就是为什么它是 typedef!”

有人在声明中看到我的错误吗?

【问题讨论】:

  • 从 DDK 中获取 ntdll.lib 并静态链接。

标签: c++ function-pointers


【解决方案1】:

您是否包括了 "ntdef.h" 和 "ntstatus.h" ? 编译器可能无法理解 NTSTATUS。

【讨论】:

  • 我以为我做到了,哈哈……但问题出在这里 -> #ifndef NTSTATUS #define LONG NTSTATUS #endif 我切换了 LONG 和 NTSTATUS。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2021-11-02
  • 2018-01-28
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2013-05-30
相关资源
最近更新 更多