Определение указателей на функции - PullRequest
7 голосов
/ 25 марта 2009

Я пытаюсь вызвать внутреннюю функцию API Windows NT 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) и обнаружил, что NTAPI в объявлении определяется как __stdcall.

К сожалению, удалив NTAPI из моего объявления, сделав это так:

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

приводит к другой ошибке:

ошибка C2065: «_NtOpenProcess»: необъявленный идентификатор

В этот момент я говорю: «Конечно, он не определен, вот почему это typedef!»

Кто-нибудь видит мою ошибку в объявлении?

1 Ответ

5 голосов
/ 25 марта 2009

Вы включили "ntdef.h" и "ntstatus.h"? Компилятор, вероятно, не может понять NTSTATUS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...