当前位置:  开发笔记 > 编程语言 > 正文

定义功能指针

如何解决《定义功能指针》经验,为你挑选了1个好方法。

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

我的问题是,要使用这样的内部API,我需要使用运行时动态链接,如本文所述

为此,我需要定义一个指向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)的方便花花公子"Go To Definition"功能,发现声明中的NTAPI定义为__stdcall.

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

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

导致另一个错误:

错误C2065:'_ NtOpenProcess':未声明的标识符

在这一点上,我说"当然它是未定义的,这就是为什么它是一个typedef!"

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



1> Reno..:

你有"ntdef.h"和"ntstatus.h"吗?编译器可能无法理解NTSTATUS.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有