Я пытаюсь вызвать внутреннюю функцию 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 выше. Отдача компилятор:
error C2059: syntax error : '__stdcall'
Я использовал удобный денди «Go To Definition» особенность моего IDE (Visual Studio 2008) и обнаружили, что NTAPI в декларации определяется как __stdcall.
К сожалению, удаление NTAPI из моего заявления, что делает его таким:
typedef NTSTATUS (*_NtOpenProcess) (
OUT PHANDLE,
IN ACCESS_MASK,
IN POBJECT_ATTRIBUTES,
IN PCLIENT_ID OPTIONAL);
приводит другую ошибку:
error C2065: '_NtOpenProcess' : undeclared identifier
На данный момент я говорю: «Конечно, это не определено, поэтому это typedef! "
Кто-нибудь видит мою ошибку в декларации?
Получить ntdll.lib из DDK и установить связь статически. –