Я пытаюсь вызвать внутреннюю функцию 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!»
Кто-нибудь видит мою ошибку в объявлении?