2009-03-25 3 views
6

Я пытаюсь вызвать внутреннюю функцию 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! "

Кто-нибудь видит мою ошибку в декларации?

+0

Получить ntdll.lib из DDK и установить связь статически. –

ответ

4

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

+0

я думал, что я сделал лол ... но вот проблема -> #ifndef NTSTATUS #define LONG NTSTATUS #endif Я коммутируемой LONG и NTSTATUS вокруг. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^